一种在Nginx中基于URI的Web负载分配的方法与流程

文档序号:16686985发布日期:2019-01-22 18:25阅读:463来源:国知局
一种在Nginx中基于URI的Web负载分配的方法与流程

本发明涉及计算机网络技术领域,具体的说,是一种在nginx中基于uri的web负载分配的方法。



背景技术:

nginx是一个高性能的http和反向代理服务器,也是一个imap/pop3/smtp代理服务器,由于nginx处理海量连接的高效性能,国内外大型web应用纷纷转而改用nginx作为web前端负载均衡服务器。web上可用的各种资源——html文档、图像、视频片段、程序等,由一个通过通用资源标志符进行定位。用户的每一个请求就是对web资源的请求。不同的资源被访问的频率不一样,各种资源消耗系统资源也不一样,资源被访问的时候就会对服务器产生负载。当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡以及转发效率的问题。



技术实现要素:

本发明的目的在于提供一种在nginx中基于uri的web负载分配的方法,用于解决现有技术中服务器集群中的负载均衡问题和提高转发效率。

本发明通过下述技术方案解决上述问题:

一种在nginx中基于uri的web负载分配的方法,包括:

步骤s100:nginx中的管理控制台创建分配表,并将分配表写入nginx中的共享内存中;

步骤s200:用户发送资源请求,nginx将请求发送到负载分配器,分配器根据请求的uri,生成hash值,并在所述分配表中查找hash值对应的web服务器,然后将请求转发到对应的web服务器。

管理控制台创建分配表,并将分配表写入nginx中的共享内存地址内,分配表中包括uri、uri对应的hash值以及hash值对应的后端节点号。nginx接收的每一次http请求都必须经过nginx的负载分配器,负载分配器首先为请求的uri生成一个hash值,生成hash值采用的哈希函数与创建分配表中采用的hash函数相同。然后根据生成的hash值,在共享内存中的分配表中进行查找,如果存在,则把快速的查找分配表中该hash值对应的后端节点号;如果不存在,则将hash值与后端的节点数求余,生成一个后端节点号,最后根据查找得到或者生成的后端节点号,将请求数据包发送到相应的后端节点号的web应用服务器。根据uri进行对web请求负载的划分,结合共享内存技术和同步hash实现高速的对请求分配到后端web应用服务器,实现负载均衡。由于计算机读写内存的速度是最快的,因此,把分配表放在共享内存里面,负载分配器直接在共享内存段寻找后端节点号,寻表效率大大提高,因此也大大提高了转发效率。

进一步地,所述步骤s100具体包括:

步骤s110:nginx启动,声明共享内存地址段;

步骤s120:管理控制台创建临时文件分配表,对不同的uri分别采用hash函数进行计算得到对应的hash值;并将hash值与后端节点号的对应关系写入临时文件分配表;

步骤s130:将临时文件分配表注入共享内存中形成分配表。

在管理控制台把分配列表读写进共享内存的时候,会为相应的uri值分配相应的hash值,而生成这个hash值所用的hash函数是crc32[256位]hash函数。而且,负载分配器在接收uri并计算其hash值所用的hash函数也是相同的,这样负载分配器就能够根据hash值直接找到响应的后端节点号,把寻表所花消的时间降到了最低。管理控制台通过一个javaweb应用实现:显示资源请求的uri;将被设置了uri与后端节点映射的记录高亮显示,以便于管理员察看在用的规则;能够设置列表里面的uri所对应的后端节点号,用以指定请求此资源的数据包都转发到设定的后端服务器上;;能够取消过去设置的uri的后端节点号。管理控制台对规则的设置是通过一个临时文件分配表作为过渡,再从临时文件分配表注入到共享内存的分配表内的,因此在临时文件分配表发生变化的时候,不会影响服务的正常运行,这样才能保证高速和稳定的网络服务。

进一步地,所述步骤s200具体包括:

步骤s210:用户发送资源请求,nginx内部http_request处理模块的子模块负载分配器接收传递的数据包;

步骤s220:采用hash函数对数据包中的uri进行运算,得到hash值;

步骤s230:查找共享内存中的分配表,如找到hash值,则获取对应的后端节点号,进入步骤s240,否则,进入步骤s250;

步骤s240:根据hash值对应的后端节点号进行转发数据包;

步骤s250:将hash值与后端节点数进行取余,计算得到新的后端节点号,并根据新的后端节点号进行转发数据包。

进一步地,所述步骤s120以及步骤s220中的hash函数均为crc32hash函数。

本发明与现有技术相比,具有以下优点及有益效果:

(1)本发明建立了基于uri的负载分配模型,开发基于uri的nginx负载分配模块,使得实现了根据用户请求的uri进行负载分配,开发结合了共享内存技术和同步hash技术,解决了高层转发的效率问题。

(2)本发明分配表存在一段共享内存里面,分配器直接在共享内存段寻找后端节点号,寻表效率大大增加。

(3)基web的管理控制台能够实现面向uri的可视化的负载划分设置;分配规则变化的时候,不需要重新启动nginx服务器,保证服务的不间断性。

附图说明

图1为本发明的流程图;

图2为crc32hash函数的应用图;

图3为基于uri的负载分配模型。

具体实施方式

下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。

实施例1:

结合附图1-3所示,一种在nginx中基于uri的web负载分配的方法,包括:

步骤a:nginx启动,声明共享内存地址段;

步骤b:管理控制台创建临时文件分配表,对资源分配情况列表中的uri分别采用crc32hash函数进行计算得到对应的hash值;并将hash值与后端节点号的对应关系写入临时文件分配表;

步骤c:将临时文件分配表注入共享内存中形成分配表;

基web的管理控制台能够实现面向uri的可视化的负载划分设置;分配规则变化的时候,不需要重新启动nginx服务器,保证服务的不间断性。

当用户向web应用服务器发送请求时,每一个http请求必须经过nginx的负载分配器,具体地:

步骤d:nginx内部http_request处理模块的子模块负载分配器接收传递的数据包;

步骤e:采用crc32hash函数对数据包中的uri进行运算,得到hash值;

步骤f:查找共享内存中的分配表,如找到hash值,则获取对应的后端节点号,进入步骤h,否则,进入步骤i;

步骤h:判断后端节点是否有连接问题,如果无,则根据hash值对应的后端节点号进行转发数据包;否则,进入步骤i;

步骤i:将hash值与后端节点数进行取余,计算得到新的后端节点号,并根据新的后端节点号进行转发数据包。

众所周知,计算机读写内存的速度是最快的,本文引入了内存共享技术的概念,把分配表存在一段共享内存里面,分配器直接在共享内存段寻找后端节点号,寻表效率大大增加。这里我们需要考虑的是把分配列表存放在内存会不会消耗机器很大的内存量,以下是根据分配表的数据结构对所须内存容量的一个估算:

structhash_uri_list

{

unsignedinthash;//资源uri所对应的hash值

charuri[1024];//资源的字节数,预算长度是1024个字节

intbackend;//后端节点号

}

根据以上的数据结构,一条资源对应记录不会超过1500个字节。按照一个分配表10000条记录来计算,将需要1500*10000/1024/1024=14.30mb。对于当今的服务器来说绝对是一个轻松的负载范围。

尽管这里参照本发明的解释性实施例对本发明进行了描述,上述实施例仅为本发明较佳的实施方式,本发明的实施方式并不受上述实施例的限制,应该理解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施方式将落在本申请公开的原则范围和精神之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1