版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、nginx负载均衡中RR和ip_hash策略分析一、nginx的upstream 目前支持负载均衡方式的分配1、RR (默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。例如:upstream tomcats 2、ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:upstream tomcats ip_hash;3、fair (第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。4、url_hash (第三方)按访问url的hash结果来分配请求,使每个 url定向到同
2、一个后端服务器,后端服务器为 缓存时比较有效。下面,我们针对RR和ip_hash的负载均衡策略进行分析。因为每一种负载均衡策略都是在upstream 的框架中使用,upstream 控制总的工作流程,负载均衡策略仅仅提供选择或释 放server 的函数,所以,我们在分析RR时结合 upstream(ngx_http_upstream.c)。ip_hash 大部分内容与 RR 一致,只是重新实现 RR中的ngx_http_upstream_get_peer 函 数。二、RR策略RR机制分为三个部分:初始化upstream ,获取一个可用的后台服务器和释放后台服务器。以下分析以此配置为例:upst
3、ream backe ndserverAmax_fails=3 fail_timeout=4s weight=9;serverBmax_fails=3 fail_timeout=4s weight=9;serverCmax_fails=3 fail_timeout=4s weight=9;serverDbackup;ServerEbackup;2.1 初始化 upstream对于例子中的 upstream backe nd来说,首先初始化各个server,除了设置 IP和端口号外,还要设置如下置weight ,current_weight ,max_fails 禾口 fail_timeout
4、。其中 max_fails 禾口 fail_timeout 这两个参数 是组合使用的,表示server如果失败次数达到 max_fails 次,并保持fail_timeout 秒之内 该服务器不能被访问。对于serverA 来说,设置如下serverA.weight =9;serverA.current_weight = 9;/ 初始值等于配置文件中的weight.serverA.max_fails = 3;serverA.fail_timeout = 4;接着,创建两个server类型(在下文介绍中,server类型等同于peer类型,都是用来 指明存储upstream 中一个server的
5、信息)的数组,peers和backup ,分别存储正常的轮循server和备用server.并且,按照数组中各个 server的 weight值的大小,由高到底排序。本例中,在数组peers 中存储 serverA、serverB和serverC,并记录server的总个数peers->nu mber=3;在数组backup 中存储serverD和serverE,并记录server的总个数backup->nu mber=2;最后,设置upstream 中各个变量的值。rrp 表示当前要轮循的 server数组,初始设置为 Upstream->rrp = peers.tries
6、表示尝试的次数,当尝试一个server失败后,tries的值就会减一。初始设置为peers的总个数。Next表示当peers数组中server都失败,不能提供服务了,通过 upstream-next , 切换到back数组中选择 server.2.2具体的RR策略) 选择最初要轮循的 server, 把它给rrp->current变量,跳转到当一个客户端请求到达 nginx后,nginx就会在upstream 的peers数组中挑选一个 current_weight 最大的server作为当前请求最初要轮循的 server.在peers 数组中选取 curren t_weight 最大的
7、算法如下:由于peers数组中的server是按照weight值的大小排序好的。它是通过双重循环,满足下列条件后,if (peer n.curre nt_weight * 1000 / peeri.curre nt_weight > peer n.weight * 1000 /peeri.weight)peeri.current_weight不为 0并且该 server 的current_weight 大于 0,就选择 sever n,把编号 n赋给 rrp->curre nt,成功返回。如果当upstream 的peers 数组中的所有 server 的current_weigh
8、t都为零时,立即无条件地把所有 server 的current_weight设置为初 始值。for (i = 0; i < peers _>nu mber; i+) peeri.curre nt_weight = peeri.weight;然后,当所有 server的current_weight设置为初始值后,重新查找peers数组中current_weight 最大的 server。把编号赋给 rrp->current ,返回。判断当前rrp->curre nt 所指向的server是否有效,如果无效,就会让 rrp->current+,判断 peers 数组中
9、下一个 server,是否有效。至到找到有效的server为止.跳转到否则跳转到2.221判断server是否有效的方法是:1 )如果 server 的失败次数(peers->peeri.fails )没有达到了 max_fails 所设置的最大失败次数,则该server是有效的。2 )如果server已经达到了 max_fails所设置的最大失败次数,从这一时刻开始算起,在fail_timeout 所设置的时间段内, server是无效的。3 )当server的失败次数(peers->peeri.fails )为最大的失败次数,当距离现在的时间超过了fail_timeout所设置
10、的时间段,则令peers->peeri.fails =0 ,使得该server 重新有效。如果peers中所有的server都是无效的;就会尝试去backup的数组中找一个有效的server,如果找到, 跳转到如果仍然找不到,表示此时upstream 中无server可以使用。就会清空所有 peers数组中所有的失败次数的记录,使所有 server都变成了有效。这样做的目的是为了防止下次再有请求访问时,仍找不到一个有效的server.for (i = 0; i < peers _>nu mber; i+) peers->peeri.fails = 0;并返回错误码给ng
11、i nx,nginx得到此错误码后,就不再向后台 server发请求,而是在nginx 的错误日志中输出" no live upstreams while connecting to upstream”的记录(这就是no live产生的真正原因),并直接返回给请求的客户端一个502的错误。当找到一个有效的 server后,令该server的current_weight减一,然后,nginx就会尝试与该server建立连接。如果成功建立连接,跳转到否则 跳转到如果nginx在等待了 proxy_connect_timeout所设置的时间段后(如3秒),连接仍
12、然没有建立成功,ngi nx 就在错误日志中输出"upstream timed out (110:Connection timed out) while connecting to upstream” 的记录 (这就是 timed out(连接超时)产生的真正原因).接着,让当前 server的失败次数加一(peer->fails+; 如果该server最大 失败次达到最大失败次数,将在一段时间内该server是无效的),如果当前nginx与后台服务器的尝试次数没有达到 upstream 中server的总个数,重新跳转到轮循下一个 server,继续尝试。如果达到最大尝试次数
13、,就表示 uptream 中所有的server都尝试了一 遍,没有server可以提供服务,返回一个 504的错误给客户端。当nginx与server建立连接成功后,如果server响应请求,把处理结果返回给ngi nx,跳转到225;否则跳转到2.2412.241如果nginx在等待了 proxy_read_timeout 所设置的时间段后(如30秒), server仍然没有对nginx发送来的请求作出响应,nginx就在错误日志中输出“ upstream timed out (110: Connection timed out) while readi ngresp onse header
14、 fromupstream ”的记录(这就是 timed out(读超时)产生的真正原因)接着,让当前server的失败次数加一 (peer->fails+; 如果该server最 大失败次达到最大失败次数,将在一段时间内该server是无效的),如果当前nginx与后台服务器的尝试次数没有达到 upstream 中server的总个数,重新跳转到 轮循下一 个server,继续尝试。如果达到最大尝试次数, 就表示uptream 中所有的server都尝试了 一遍,没有server可以提供服务,返回一个 504的错误给客户端。收到后台server传送过来的结果后,就会返回给客户端一个20
15、0的正确结果。这样,nginx作为反向代理的功能也就完成了。三、Ip_hash 策略3.1 Ip_hash和RR的策略有两点不同在于:当一个客户请求到nginx后,1)nginx如何选择一个最初的server,2 )以及当前选择的 server不能提供服务时,如何选择下一个server.3.2 RR策略回顾从第二部分对RR的介绍中,我们知道:当一个客户请求到达后,RR策略是从 upstream 的所有server中选择一个当前权重(current_weight)最大的 server 作为最初的 server.upstream 的所有server是按照由高到低排序后存储在一个peers数组中,当
16、最初选择的server不能提供服务时,RR策略就会选择peers数组中的下一个元素作为当前server,继续尝试,如果已经达到数组的最大元素,就会从第一个元素再轮循。3.3 ip_hash策略介绍在ip_hash策略中,它选择最初的server的方法是根据请求客户端的IP计算出一个哈希值,再根据哈希值选择后台的服务器。1 )由IP计算哈希值的算法如下,其中公式中hash初始值为89 , iphp->addri 表示客户端的IP,通过三次哈希计算得出一个IP的哈希值:for (i = 0; i < 3; i+) hash = ( hash * 113 + iphp->addri
17、) % 6271;2) 在选择下一个 server时,ip_hash的选择策略是这样的:它在上一次哈希值的基础 上,再次哈希,就会得到一个全新的哈希值,再根据哈希值选择另外一个后台的服务器。哈希算法仍然是for (i = 0; i < 3; i+) hash = ( hash * 113 + iphp->addri) % 6271;在这种ip_hash策略,如果一个后台服务器不能提供提服务(连接超时或读超时),该服务器的失败次数就会加一, 当一个服务器的失败次数达到 max_fails所设置的值,就会在 fail_timeout 所设置的时间段内不能对外提供服务,这点和RR是一致的。如果当前server不能提供服务,就会根据当前的哈希值再哈希出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河道治理承包合同
- 购房定金协议书
- 承包房屋装修合同
- 2024-2025学年高一上学期新生家长会校长发言稿
- 河南省平顶山市叶县高级中学2024-2025学年高一上学期9月月考语文试卷2
- 10期中检测卷一(过关)-2021-2022学年七年级英语上学期期中复习挑战满分(牛津译林版)
- 2024年北京中考语文第三次模拟卷含答案解析
- 第12课 从明朝建立到清军入关 课件高一上学期统编版(2019)必修中外历史纲要上-1
- 工程围挡施工合同
- 工程硕士专业学位培养方案
- 儿科护理学讲课课件
- 呼吸系统疾病的分类与鉴别诊断
- 海鲜餐饮店计划书
- 灭火器检查记录表(舜杰)
- GB 6514-2023涂装作业安全规程涂漆工艺安全及其通风
- 江苏省集中式饮用水源突发污染事件应急预案
- 雨污分流监理实施细则
- 创新教育与创新思维
- 如何帮助中小学生培养专注力
- 细胞项目商业计划书
- 新课标-人教版数学六年级上册第五单元《圆》单元教材解读
评论
0/150
提交评论