Nginx-负载均衡-调度算法-weight、ip_hash、least_conn、url_hash

艺帆风顺 发布于 2025-04-03 21 次阅读


1、负载均衡调度算法类型

1.1、轮询调度算法

按时间顺序逐一分配到不同的后端服务器(默认)

1.2、加权轮询调度算法

加权轮询,weight值越大,分配到的访问几率越高

1.3、ip_hash调度算法

每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器

1.4、least_conn调度算法

将请求传递到活动连接数最少的服务器。

回到顶部(go to top)

2、负载均衡调度算法解析和配置

2.1、轮询调度算法

2.1.1、解析

轮询调度算法的原理是将每一次用户的请求,轮流分配给内部中的服务器。
轮询算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。

2.1.2、配置方法

cat /etc/nginx/conf.d/proxy_web.cyc.com.conf

    upstream web { server 192.168.10.5:8080; server 192.168.10.7:8080;}server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; }}

    2.2、加权轮询调度算法

    2.2.1、解析

    轮询调度算法没有考虑每台服务器的处理能力,在实际情况中,由于每台服务器的配置安装的业务应用等不同,其处理能力会不一样。
    所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

    2.2.2、配置方法

    # cat /etc/nginx/conf.d/proxy_web.cyc.com.conf
      upstream web { server 192.168.10.5:8080 weight=5; server 192.168.10.7:8080 weight=1;}server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; }}

      2.3、ip_hash调度算法

      2.3.1、解析

      ip_hash是基于用户请求的IP,对该IP进行hash运算,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。
      ip_hash算法实现公式: hash(ip) % node_counts = index

      2.3.2、配置方法

      cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf'EOF'
        upstream web { ip_hash; server 192.168.10.5:8080; server 192.168.10.7:8080;}server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; }}EOF

        2.4、url_hash调度算法

        2.4.1、解析

        根据用户请求的URL进行hash取模,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。

        URL算法使用场景如下: client-->nginx-->url_hash-->cache1-->app

        1、用户请求nginx负载均衡器,通过url 调度算法,将请求调度至Cache1;
        2、由于Cache1节点没有对应的缓存数据,则会请求后端获取,然后返回数据,并将数据缓存起来;
        3、当其他用户再次请求此前相同的URL时,此时调度器依然会调度至cache1节点处理;
        4、由于Cache1节点已存在该URL资源缓存,所以直接将缓存数据进行返回;能大幅提升网站的响应;

        2.4.2、配置后端节点

        # web01
        echo "web01 Url-1" > /opt/web01/url1.html
        echo "web01 Url-2" > /opt/web01/url2.html

        # web02
        echo "web02 Url-1" > /opt/web02/url1.html
        echo "web02 Ur-l2" > /opt/web02/url2.html

        2.4.3、配置方法

        cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf'EOF'
          upstream web { hash $request_uri consistent; server 192.168.10.5:8080; server 192.168.10.7:8080;}server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; }}

          # 请求同一个url,会始终定向到同一个服务器节点
          # consistent表示使用一致性hash算法

          2.4.4、测试访问

          # client测试,会发现请求相同的URL ,始终会被定向至某特定后端节点。

          curl -H Host:web.cyc.com http://192.168.10.4/url2.html

          2.5、least_conn调度算法

          2.5.1、解析

          least_conn调度算法实现原理,哪台节点连接数少,则将请求调度至哪台节点。
          假设∶A节点有1000个连接、b节点有500连接,如果此时新的连接进入会分发给b节点

          2.5.3、配置方法

          cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf'EOF'
            upstream web { least_conn; server 192.168.10.5:8080; server 192.168.10.7:8080;}server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; }}

            3、扩展-Hash算法

            3.1、ip_hash

            3.1.1、流程图

            3.1.2、下掉一台后的流程图

            3.1.3、存在的问题

            如果有大量的用户调度到某一节点,而该节点刚好故障,则该算法会重新计算结果,从而造成大量的用户被转移其他节点处理,而需要重新建立会话。

            3.2、一致性hash调度算法

            为了规避上述hash情况,一致性hash算法就诞生,一致性 Hash算法也是使用取模的方法,但不是对服务器节点数量进行取模,而是对2的32方取模。即,一致性Hash算法将整个Hash 空间组织成一个虚拟的圆环, Hash函数值的空间为0~2^32 - 1

             3.2.1、整个哈希环图

            虚拟的圆环,Hash函数值的空间为0 ~ 2^32 - 1

            3.2.2、整个环形已顺时针方向旋转分布在环形内图

            整个环形已顺时针方向旋转,然后计算服务器,将服务器信息分布在环形的各个位置。

            3.2.3、用户近访问原则图

            当有用户请求,也会根据hash运算,将用户分布到环形中,然后用户以就近访问原则,访问离自己最近的服务器。

             

            3.2.4、服务器减少原理图

            服务器减少:节点3故障后,原先连接的用户节点则会顺时针方向迁移到节点4服务器。(影响的仅是局部用户)

            3.2.5、服务器增加原理图

            新增节点,原先离用户3节点较近的两个用户,有一个用户离"新增加的节点”更近,所以该用户就会被分配至新增加的服务器节点。(影响的也仅仅是局部用户。)

             

              版权声明:本文内容始发于博客园>作者:小粉优化大师,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。始发链接:https://www.cnblogs.com/ygbh/p/17366002.html#_lab2_0_3在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,商业转载建议请联系原作者,非商业转载请注明出处。