小王反复看了Nginx的配置 , 没有问题 , 节点的upstream都配置了 , 也没有配置权重 , 也都单独试过网页能打开 。 但是就是每次都是一个节点门庭若市 , 另一个节点门可罗雀 。
小王试了好久 , 百思不得其解 , 无奈求助了资深程序员老李 。
老李不愧是资深程序员 , 很快就找出了问题所在 。 原来问题出在Nginx的负载均衡策略上面 。
小王配置的两个节点负载均衡 , 采用的是ip_hash策略 , 即基于客户端IP地址来确定访问哪个服务节点的策略 。 其算法很简单 , 根据请求所属客户端IP计算得到一个数值 , 然后把请求发往该数值对应的后端 。 所以同一个客户端的请求 , 都会发往同一个后台服务节点 。 除非该节点不可用了 。 Ip_hash策略的优点是能够保持会话 。
那么这个策略有什么问题呢?老李微笑的告诉小王 , 这个问题出在Nginx对Ip_hash的算法上 。 这段算法的核心部分如下:
for (i = 0; i < 3; i++) {
hash = (hash * 113 + iphp->addr[i
) % 6271; //iphp->addr[i
为ip的点分十进制法的第i段
通过客户端ip计算得到一个值 。 但是问题就出在这段算法上 , 我们可以看到 , 这段算法循环了三次 , 而正常的IP地址有四个部分 , 这里只是将IP的前三个部分作为参数加入hash函数 。 因此 , 如果前三部分是一样的话 , 那么意味着他们都会被分配到同一台服务器上 。
那么为什么Nginx要这样设计呢?因为IP地址前三位相同一般意味着来自同一个局域网或者相领区域 , 使用相同的后端服务能够让Nginx在一定程度上更具有一致性 。
所以因为客户的内网用户端多在同一个网段 , 所以最终的结果就是在同一个网段的请求都被Nginx分发到了一个节点上 , 导致了两个节点的流量不均衡 。
听了老李的话 , 小王恍然大悟 。 看来对技术永远不能一知半解 , 不知道在什么小地方就隐藏着潜在的问题 。
- 新冠病毒|?互联网时代下,杭州成为多数毕业生的首选,一大波00后即将到来
- 洞察号检测到火星上的地震活动,这里的地质环境比想象的要活跃!
- 9个有代表性的现代科学未解之谜,还有比水熊虫更厉害的生物!
- 矽源特IP2325是一款支持双节串联锂电池/锂离子电池的升压充电管理IC。
- 地球为什么不能被挖穿,这将给全世界带来无法挽回的灾难!
- NASA的宇航员在太空中听到过声音,50年前的登月行动发现了什么?
- 广电的5G号卡终于来了,但移动可能才是最大赢家。
- 地球生态的极限是多少?这样的未来世界会有你吗?
- 地球上4个由未知文明遗留下的远古遗迹,史前文明真的存在吗?
- 这就是夏天开空调费电的秘密,别再交冤枉电费了!