Nginx 负载均衡-加权轮询策略剖析

Nginx 负载均衡-加权轮询策略剖析

ID:42624193

大小:75.99 KB

页数:4页

时间:2019-09-19

Nginx 负载均衡-加权轮询策略剖析_第1页
Nginx 负载均衡-加权轮询策略剖析_第2页
Nginx 负载均衡-加权轮询策略剖析_第3页
Nginx 负载均衡-加权轮询策略剖析_第4页
资源描述:

《Nginx 负载均衡-加权轮询策略剖析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、nginx负载均衡策略之加权轮询分析——lvyilong316nginx做为方向代理时,能够为后端服务器提供负载均衡的功能,其中加权轮询策略使是其默认的负载均衡策略。直观上就是将来自客户的请求按照每个服务器的权值进行负载均衡(权值大的服务器处理的请求也应该多)。那么对于每次客户的请求如何选取后端服务器才能确保这种均衡呢?nginx采用加权轮询策略时选取后端服务器的核心代码是ngx_http_upstream_get_peer函数(位于ngx_http_upstream_round_robin.c中)。

2、下面对这段代码进行分析。l 代码说明:(1)     peer[n].weight:后端服务器初始权重。(2)     peer[n].current_weight:后端服务器当前权重,初始情况等于peer[n].weight。(3)     peers->number:后端服务器的个数(4)     peers->peer[0]:一个数组的第一个元素,这个数组的每个元素对应一个后端服务器。(5)     一旦某个后端服务器n被选中后,会在其他处理函数中执行peer[n].current_weight

3、--。(6)     代码18行乘以1000是为了避免浮点处理,所以直接报被除数放大1000倍,也就是间接把精度提升到小数点后三位,注意这里是权值的比较,因此把两边权值都放大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_upstream_rr_peer_t*

4、peer;5.peer=&peers->peer[0];//peer指向后端服务器列表6.7.for(;;){8.for(i=0;inumber;i++){9.if(peer[i].current_weight<=0){10.continue;11.}12.n=i;//n为第一个current_weight大于0的服务器下标13.while(inumber-1){14.i++;//i从n的下一个服务器开始遍历15.if(peer[i].current_weight<=0

5、){16.continue;17.}18.if(peer[n].current_weight*1000/peer[i].current_weight19.>peer[n].weight*1000/peer[i].weight)//选取后端服务器的关键20.{21.returnn;22.}23.n=i;24.}25.if(peer[i].current_weight>0){26.n=i;27.}28.returnn;29.}30.if(reset++){//初始为0,所以第二次循环到此条件才成立,注意是

6、后置自增。31.return0;32.}33.for(i=0;inumber;i++){34.peer[i].current_weight=peer[i].weight;35.}36.}1.}l 分析:18~19行代码是选取后端服务器的关键,那么这个条件是如何确保选取后端服务器负载均衡呢?假设有三台后端服务器A、B、C,它们的权值分别为5、3、1。那么执行过程如下:(1)     第一次请求由于peer[n].current_weight=peer[n].weight&&peer[i]

7、.current_weight=peer[i].weight,所以代码18行的条件始终不成立。13行的while循环到i=2时退出。接着执行到25代码行条件成立,n=i=2,所以第一次选中服务器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的

8、current_weight为0),继续循环到13行代码不成立。此时跳出13行的while循环,执行到18行返回n=1,即选择服务器B。(3)     第三次请求到达时,A、B、C的权值为5、2、0。执行到代码14行时n=0,i=1,随后18行条件成立(peer[n].current_weight=5,peer[i].current_weight=2,peer[n].weight=5,peer[i].weight=3),所以19行返回n=0,即选中服务器

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。