欢迎来到天天文库
浏览记录
ID:48368649
大小:79.00 KB
页数:4页
时间:2019-11-28
《Nginx负载均衡-加权轮询策略剖析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、nginx负载均衡策略之加权轮询分析lvyilong316nginx做为方向代理时,能够为后端服务器提供负载均衡的功能,其中加权轮询策略使是其默认的负载均衡策略。客户端直观上就是将来自客户的请求按照每个服务器的权值进行负载均衡(权值大的服务器处理的请求也应该多)。那么对于每次客户的请求如何选取后端服务器才能确保这种均衡呢?nginx采用加权轮询策略时选取后端服务器的核心代码是ngx_http_upstrcani—gct_peer函数(位于ngx_http_upstrcam_round_robin.c中)。下面对这段代
2、码进行分析。•代码说明:(1)peer[n].weight:后端服务器初始权重。(2)peer[n].current_weight:后端服务器当前权重,初始情况等于peer[n].weight。(3)peers->number:后端服务器的个数(4)peers->peer[O]:一个数组的第一个元素,这个数组的每个元素对应一个后端服务器。(5)一旦某个后端服务器n被选屮后,会在其他处理函数中执行peer[n]・current_weight一一。(6)代码18行乘以1000是为了避免浮点处理,所以直接报被除数放大100
3、0倍,也就是间接把精度提升到小数点后三位,注意这里是权值的比较,因此把两边权值都放大1000倍并不会影响最终的比较结果。点击(此处)折叠或打开1.staticngx_uint_tngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t*peers)2.{3.ngx_uint_ti,n,reset二0;4.ngx_http_upstfeani_rT_peef_t*peer;5.peer=&peers->peer[0];//peer指向后端服务器列表6.6.for(;
4、;){7.for(i=0;inumber;i++){8.if(peer[i]・current_weight<=0){9.continue;10.}11.n二i;//n为第一个current^wcight大于0的服务器下标12.while(i5、rrentweight18.>peer[nJ.weight*1000/peer[i].weight)//选取后端服务器的关键19.{20.returnn;21.}22.n=i;23.}24.if(peer[ij.current_weight>0){25.n二i;26.}27.returnn;28.}29.if(resets){//初始为0,所以第二次循环到此条件才成立,注意是后置自增。30.return0;31.}32.for(i二0;inumber;i++){33.peer[i].currenl_w6、eight二peer[i].weight;1.}2.}•分析:18〜19行代码是选取后端服务器的关键,那么这个条件是如何确保选取后端服务器负载均衡呢?假设有三台后端服务器A、B、C,它们的权值分别为5、3、1。那么执行过程如下:(1)第一次请求由于peer[n].current_weight二peer[n]・weight&&peer[i]・current_weight=peer[i]・weight,所以代码18彳亍的条件始终不成立。13行的while循环到1=2时退出。接着执行到25代码行条件成立,n二i二2,所以第7、一次选中服务器C,之后服务器C的current_weight--,当前权值变为0。(2)第二次请求到来时,A、B、C的权值为5、3、0。代码执行到14行吋,i二1,n二0,此时由于A和B的current_weight和weight相同,条件依然不成立,23行使n二i二1,然后i++变为2,但代码15彳亍条件成立(C的current_weight为0),继续循环到13行代码不成立。此吋跳岀13行的while循环,执行到18行返冋n二1,即选择服务器(3)第三次请求到达时,A、B、C的权值为5、2、0o执行到代码14行时8、n=0,i=l,随后18行条件成立(peer[n].current_weight=5,peer[i]・current_weight二2,peer[n]・weight二5,peer[i]・weight=3),所以19行返回"0,即选中服务器A。⑷……(5)随后请求处理类似,知道所有服务器current.weight都等于0。此时第8行的for循环
5、rrentweight18.>peer[nJ.weight*1000/peer[i].weight)//选取后端服务器的关键19.{20.returnn;21.}22.n=i;23.}24.if(peer[ij.current_weight>0){25.n二i;26.}27.returnn;28.}29.if(resets){//初始为0,所以第二次循环到此条件才成立,注意是后置自增。30.return0;31.}32.for(i二0;inumber;i++){33.peer[i].currenl_w
6、eight二peer[i].weight;1.}2.}•分析:18〜19行代码是选取后端服务器的关键,那么这个条件是如何确保选取后端服务器负载均衡呢?假设有三台后端服务器A、B、C,它们的权值分别为5、3、1。那么执行过程如下:(1)第一次请求由于peer[n].current_weight二peer[n]・weight&&peer[i]・current_weight=peer[i]・weight,所以代码18彳亍的条件始终不成立。13行的while循环到1=2时退出。接着执行到25代码行条件成立,n二i二2,所以第
7、一次选中服务器C,之后服务器C的current_weight--,当前权值变为0。(2)第二次请求到来时,A、B、C的权值为5、3、0。代码执行到14行吋,i二1,n二0,此时由于A和B的current_weight和weight相同,条件依然不成立,23行使n二i二1,然后i++变为2,但代码15彳亍条件成立(C的current_weight为0),继续循环到13行代码不成立。此吋跳岀13行的while循环,执行到18行返冋n二1,即选择服务器(3)第三次请求到达时,A、B、C的权值为5、2、0o执行到代码14行时
8、n=0,i=l,随后18行条件成立(peer[n].current_weight=5,peer[i]・current_weight二2,peer[n]・weight二5,peer[i]・weight=3),所以19行返回"0,即选中服务器A。⑷……(5)随后请求处理类似,知道所有服务器current.weight都等于0。此时第8行的for循环
此文档下载收益归作者所有