nginx 负载均衡之ip_hash

1. nginx 负载均衡之ip_hash

image.png
  • ip_hash这种负载均衡模式根据个人理解就是:例如多个用户通过nginx访问到了后端的tomcat集群中,这个时候因为有不同用户,所以ip也不同,ip+hash算法计算的hash值都传到了tomcat,nginx就记录了这个ip和hash值,那么下次同一个ip过来还是会分配到这个tomcat的。

2. hash算法的逻辑图例

image.png

使用

upstream tomcats {
             ip_hash;
         server 192.168.121.166:8080 weight=1 max_conns=2;
         server 192.168.121.167:8080 weight=2 max_conns=2;
         server 192.168.121.167:8088 weight=5 max_conns=2;
      }

3. 详细的看hash算法是如何实现的

可以查看nginx的源码,找到nginx的软件目录,我本地的是在home/software/nginx-1.18/src/http/modules 下的ngx_http_upstream_ip_hash_module.c中


image.png

可以查询addrlen的值是3,而在这个关键代码中大致可以了解到,其实hash值是根据ip段的前三个来计算的,例如192.168.1.12,192.168.1.13,192.168.1.14 经过nginx的hash值计算是根据ip段的192 168 1来计算的。所以如果在本地的虚拟机中来使用这种负载均衡的方式,那么192.168.1.12,192.168.1.13,192.168.1.14 这三个ip访问的其实是一台tomcat。

4. 注意

如果在集群中的某台服务器出现故障,我们想要从nginx的集群配置中移除掉,我们不可以直接的将那一行删掉,比如server 192.168.121.167:8080 weight=2 max_conns=2;删掉,如果直接删掉会导致nginx的hash算法重新计算,那么用户的回话或者说缓存都会失效掉,所以这里如果不用这台服务器,直接比较为down即可,也就是 server 192.168.121.167:8080 down
这么做就可以了。

upstream tomcats {
             ip_hash;
         server 192.168.121.166:8080 weight=1 max_conns=2;
         server 192.168.121.167:8080 weight=2 max_conns=2;
         server 192.168.121.167:8088 weight=5 max_conns=2;
      }

5.那么如果解决第四点提到的问题呢?

如果一台机器出现问题,都要重新的计算hash值,用户的缓存会话都丢失掉,那么用户请求的时间就会加长很多,那么这个时候我们就需要用到一致性hash算法:


image.png

这样的hash算法会有一个好处,就是在某台服务器发生故障的情况下可以保障大部分的用户体验不出现问题,之前的ip_hash是因为少了节点,note_count数量减少所以导致每次请求都需要重新计算分配到哪个节点,但是一致性hash算法不会,它仅会影响到少部分靠近更新节点的位置,比如节点3由于故障移除掉了,那么它上游的两个用户请求会到节点4,而其他的用户都不会改变

你可能感兴趣的:(nginx 负载均衡之ip_hash)