设为首页 收藏本站
查看: 841|回复: 0

[经验分享] Nginx的ip_hash解析

[复制链接]

尚未签到

发表于 2018-11-14 09:07:37 | 显示全部楼层 |阅读模式
  网络结构描述:
  1个Nginx(前端)+2个tomcat(后端)
  环境:
  公司内网(网段:192.168.1.0/24),服务器也是分配的内网ip:192.168.1.4(暂定);后端两个tomcat:192.168.1.31/189
  网站有session,所有Nginx启用ip_hash.
  现象:
  测试组用loadrunner模拟N多内网ip进行压测系统。发现,这些ip统一都转发到一个后端。
  后经排查发现问题所在(结论最下面)。
  1、请看官方解释:
  This directive causes requests to be distributed between upstreams based on the IP-address of the client.
  The key for the hash is the class-C network address or the entire IPv6-address of the client. IPv6 is supported for ip_hash since 1.3.2 or 1.2.2. This method guarantees that the client request will always be transferred to the same server. But if this server is considered inoperative, then the request of this client will be transferred to another server. This gives a high probability clients will always connect to the same server. (简译:将客户端ip转化成C类网络地址,然后将该网络地址当作hash关键字,来保证这个客户端请求总是被转发到一台服务器上)
  2、请看Nginx的ip hash算法(该段代码为转发。原文链接:http://www.cnblogs.com/xiaohuo/archive/2012/08/13/2636468.html):
for ( ;; ) {  
for (i = 0; i < 3; i++) {
  
hash = (hash * 113 + iphp->addr) % 6271;  //iphp->addr为ip的点分十进制法的第i段
  
}
  
p = hash % iphp->rrp.peers->number;

  
n = p / (8 *>
  
m = (uintptr_t) 1   
if (!(iphp->rrp.tried[n] & m)) {
  
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
  
"get ip hash peer, hash: %ui %04XA", p, m);
  
peer = &iphp->rrp.peers->peer[p];
  
/* ngx_lock_mutex(iphp->rrp.peers->mutex); */
  
if (!peer->down) {
  
if (peer->max_fails == 0 || peer->fails < peer->max_fails) {
  
break;
  
}
  
if (now - peer->accessed > peer->fail_timeout) {
  
peer->fails = 0;
  
break;
  
}
  
}
  
iphp->rrp.tried[n] |= m;
  
/* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
  
pc->tries--;
  
}
  
if (++iphp->tries >= 20) {
  
return iphp->get_rr_peer(pc, &iphp->rrp);
  
}
  
}
  主要代码请看这里:
for( ;; ) {for(i = 0; i < 3; i++) {hash = (hash * 113+ iphp->addr) % 6271;    1、for循环 i 取 012三个值,而ip的点分十进制表示方法将ip分成四段(如:192.168.1.1),但是这里循环时只将ip的前三个端作为参数加入hash函数。这样做的目的是保证ip地址前三位相同的用户经过hash计算将分配到相同的后端server。
  作者的这个考虑是极为可取的,因此ip地址前三位相同通常意味着来着同一个局域网或者相邻区域,使用相同的后端服务让nginx在一定程度上更具有一致性。
  通过上述解释,已经基本判断出问题所在了。。
  主要原因就是,公司局域网用的192.168.1.0/24 C类地址,这样Nginx在ip_hash(for循环后三个参数统一计入hash值)的时候,就将该类所有ip都转发到一个后端了。
  另,晕了我半天了。。。不论A类B类C类等网络地址,Nginx的ip_hash算法都将一个ip地址的前三段作为hash的关键字。。(规定)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634795-1-1.html 上篇帖子: nginx rewrite php的CI(CodeIgniter)框架 下篇帖子: nginx缓存服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表