沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践!
对于一个大年夜型网站来说,负载均衡是永恒的话题。跟着硬件技巧的迅猛成长,越来越多的负载均衡硬件设备出现出来,如F5 BIG-IP、Citrix NetScaler、Radware等等,固然可以解决问题,但其昂扬的价格却往往令人望而却步,是以负载均衡软件仍然是大年夜部分公司的不二之选。nginx作为webserver的后起之秀,其优良的反向代劳功能和灵活的负载均衡策略受到了业界广泛的存眷。本文将以工业临盆为背景,大年夜设计实现和具体应用等方面具体介绍nginx负载均衡策略。
1. 媒介
跟着互联网信息的爆炸性增长,负载均衡不再是一个陌生的话题,顾名思义,负载均衡等于将负载分摊到不合的办事单位,既包管办事的可用性,又包管响应足够快,给用户很好的体验。快速增长的拜访量和数据流量催生了各种各样的负载均衡产品,很多专业的负载均衡硬件供给了很好的功能,但却价格不菲,这使得负载均衡软件大年夜受迎接,nginx就是个中的一个。
Nginx第一个公开版本宣布于2004年,2011年宣布了1.0版本。它的特点是稳定性高、功能强大年夜、资本消费低,大年夜其今朝的市场占领而言,nginx大年夜有与apache抢市场的势头。个中不得不提到的一个特点就是其负载均衡功能,这也成了很多公司选择它的重要原因。本文将大年夜源码的角度介绍nginx的内置负载均衡策略和扩大负载均衡策略,以实际的工业临盆为案例,比较各负载均衡策略,为nginx应用者供给参考。
nginx的负载均衡策略可以划分为两大年夜类:内置策略和扩大策略。内置策略包含加权轮询和ip hash,在默认情况下这两种策略会编译进nginx内核,只需在nginx设备中指明参数即可。扩大策略有很多,如fair、通用hash、consistent hash等,默认不编译进nginx内核。因为在nginx版本进级中负载均衡的代码没有本质性的变更,是以下面将以nginx1.0.15稳定版为例,大年夜源码角度分析各个策略。
2.1 加权轮询(weighted round robin)
轮询的道理很简单,起首我们介绍一下轮询的根本流程。如下是处理一次请求的流程图:
图中有两点须要留意,第一,如不雅可以把加权轮询算法分为先深搜刮和先广搜刮,那么nginx采取的是先深搜刮算法,即将起首将请求都分给高权重的机械,直到该机械的权值降到了比其他机械低,才开端将请求分给下一?高权重的机械;第二,当所有后端机械都down掉落时,nginx会急速将所有机械的标记位清成初始状况,以避免造成所有的机械都处在timeout的状况,大年夜而导致全部前端被夯住。
接下来看下源码。nginx源码的目次构造很清楚,加权轮询地点路径为nginx-1.0.15/src/http/ngx_http_upstream_round_robin.[c|h],在源码的基本上,针对重要的、不易懂得的处所我加了注释。起首看下ngx_http_upstream_round_robin.h中的重要声明:
图中前1/3应用轮询策略,中心段应用ip hash策略,后1/3仍然是轮询策略。可以明显的看出,ip hash的均衡性存在着很大年夜的问题。原因并不难分析,在实际的收集情况中,有大年夜量的高校出口路由器ip、企业出口路由器ip等收集节点,这些节点带来的流量往往是通俗用户的成百上千倍,而ip hash策略恰好是按照ip来划分流量,是以造成上述后不雅也就天然而然了。
场景1 server_*均正常供给办事;
2.4 通用hash、一致性hash
大年夜变量定名中,我们就可以大年夜致猜出其感化。个中,current_weight和weight的差别主如果前者为权重排序的值,跟着处理请求会动态的变更,后者是设备值,用于恢复初始状况。
接下来看下轮询的创建过程,代码如下图所示。
这里有个tried变量须要做些解释。tried中记录了办事器当前是否被测验测验连接过。他是一个位图。如不雅办事器数量小于32,则只需在一个int中即可记录下所有办事器状况。如不雅办事器数量大年夜于32,则需在内存池中申请内存来存储。对该位图数组的应用可参考如下代码:
最后是实际的策略代码,逻辑很简单,代码实现也只有30行,直接上代码。
2.2 ip haship
hash是nginx内置的另一个负载均衡的策略,流程和轮询很类似,只是个中的算法和具体的策略有些变更,如下图所示:
ip hash算法的核心实现如下图:
推荐阅读
沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践! 毋庸置疑 无办事器>>>详细阅读
地址:http://www.17bianji.com/lsqh/40983.html
1/2 1