专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
数据中心运维管理  ·  2025年数据中心七大可持续性策略 ·  昨天  
数据中心运维管理  ·  数据中心规划方案 ·  11 小时前  
数据中心运维管理  ·  国内数据中心综合能耗及其灵活性预测 ·  4 天前  
数据中心运维管理  ·  超大型数据中心基础设施全生命周期维护模式的研 ... ·  3 天前  
非法加冯  ·  PostgreSQL取得对MySQL的压倒性优势 ·  2 天前  
非法加冯  ·  PostgreSQL取得对MySQL的压倒性优势 ·  2 天前  
51好读  ›  专栏  ›  数据分析与开发

Nginx 负载均衡策略之加权轮询分析

数据分析与开发  · 公众号  · 数据库  · 2016-08-14 20:19

正文

(点击 上方公众号 ,可快速关注)


来源:伯乐在线 - lvyilong316

链接:http://blog.jobbole.com/104344/


nginx做为方向代理时,能够为后端服务器提供负载均衡的功能,其中加权轮询策略使是其默认的负载均衡策略。



直观上就是将来自客户的请求按照每个服务器的权值进行负载均衡(权值大的服务器处理的请求也应该多)。那么对于每次客户的请求如何选取后端服务器才能确保这种均衡呢?nginx采用加权轮询策略时选取后端服务器的核心代码是ngx_http_upstream_get_peer函数(位于ngx_http_upstream_round_robin.c中)。下面对这段代码进行分析。


代码说明


(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–。


(6)      代码18行乘以1000是为了避免浮点处理,所以直接报被除数放大1000倍,也就是间接把精度提升到小数点后三位,注意这里是权值的比较,因此把两边权值都放大1000倍并不会影响最终的比较结果。


static ngx_uint_t ngx_http_upstream_get_peer ( ngx_http_upstream_rr_peers_t * peers )

{

ngx_uint _ t i , n , reset = 0 ;

ngx_http_upstream_rr_peer_t * peer ;

peer = & peers -> peer [ 0 ]; //peer指向后端服务器列表

for ( ;; ) {

for ( i = 0 ; i peers -> number ; i ++ ) {

if ( peer [ i ]. current_weight 0 ) {

continue ;

}

n = i ; //n为第一个current_weight大于0的服务器下标

while ( i peers -> number - 1 ) {

i ++ ; //i从n的下一个服务器开始遍历

if ( peer [ i ]. current_weight 0 ) {

continue ;

}

if ( peer [ n ]. current_weight * 1000 / peer [ i ]. current_weight

> peer [ n ]. weight * 1000 / peer [ i ]. weight ) //选取后端服务器的关键

{

return n ;

}

n = i ;

}

if ( peer [ i ]. current_weight > 0 ) {

n = i ;

}

return n ;

}

if ( reset ++ ) {







请到「今天看啥」查看全文