Nginx 负载均衡策略全解析—— 从基础轮询到一致性哈希,助你构建高可用后端集群

Nginx 作为一款高性能的负载均衡器,提供了多种负载均衡策略(也叫做调度算法或方法),可以根据不同的业务场景进行选择。

以下是 Nginx 中主要的几种负载均衡策略:


1. 轮询(Round Robin)

  • 默认策略。如果未显式配置任何策略,则使用此策略。
  • 工作原理:将请求按顺序、均匀地分配给后端每一台服务器。第一次请求分给服务器1,第二次给服务器2,... 分配完最后一台后,又回到第一台,如此循环。
  • 配置示例
    upstream my_backend {
        server backend1.example.com;
        server backend2.example.com;
        # 默认就是轮询
    }
    

2. 加权轮询(Weighted Round Robin)

  • 工作原理:在轮询的基础上,为服务器分配一个权重。权重越高,被分配到的请求比例就越大。这对于处理能力不同的服务器非常有用。
  • 配置示例
    upstream my_backend {
        server backend1.example.com weight=3; # 接收~60%的请求
        server backend2.example.com weight=2; # 接收~40%的请求
    }
    

3. 最少连接数(Least Connections)

  • 工作原理:将新的请求发送到当前活跃连接数最少的那台服务器。这考虑了服务器的当前负载,使得负载更加均衡。
  • 配置指令least_conn
  • 配置示例
    upstream my_backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }
    

4. 加权最少连接数(Weighted Least Connections)

  • 工作原理:这是“最少连接数”和“加权”的结合。Nginx 会考虑服务器的权重和当前连接数来决定将请求发给谁。
  • 配置示例
    upstream my_backend {
        least_conn;
        server backend1.example.com weight=3;
        server backend2.example.com weight=2;
    }
    

5. IP 哈希(IP Hash)

  • 工作原理:根据客户端的 IP 地址计算出一个哈希值,利用这个值将请求分配给固定的某台服务器。这可以保证来自同一个客户端的请求总是被转发到同一台后端服务器,常用于解决 Session 保持的问题。
  • 配置指令ip_hash
  • 配置示例
    upstream my_backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        # 如果某台服务器需要下线,可以标记为 down,哈希会自动排除它
        server backend3.example.com down;
    }
    

6. 通用哈希(Generic Hash)

  • 工作原理:允许管理员自定义一个哈希的 key(可以是变量,如 $args$uri 等),根据这个 key 来计算哈希值并确定请求的路由。这可以用于将同一类请求(如访问同一资源)定向到特定服务器,提高缓存命中率。
  • 配置指令hash
  • 配置示例
    upstream my_backend {
        hash $request_uri consistent; # 根据请求的URL进行哈希
        server backend1.example.com;
        server backend2.example.com;
    }
    
    • consistent 参数可选,用于使用一致性哈希算法,能在服务器列表变化时最小化缓存失效。

7. 最少时间(Least Time)(仅限Nginx Plus)

  • 工作原理:Nginx 商业版 Plus 的独有功能。它将请求发送到平均响应时间最短且活动连接数最少的服务器。这是最智能、最复杂的算法之一。
  • 配置指令least_time
  • 配置示例
    upstream my_backend {
        least_time (header | last_byte); # 计算到收到响应头或最后一个字节的时间
        server backend1.example.com;
        server backend2.example.com;
    }
    

8. 随机(Random)

  • 工作原理:随机选择一个后端服务器。如果指定了 two 参数,Nginx 会先随机选出两台服务器,然后根据加权最少连接数的策略从这两台中选出一台。这可以在高并发环境下降低轮询决策的开销。
  • 配置指令random
  • 配置示例
    upstream my_backend {
        random two;
        server backend1.example.com weight=2;
        server backend2.example.com;
        server backend3.example.com;
    }
    

总结与选择建议

策略 指令 适用场景
轮询 (默认) 后端服务器配置相同,无状态服务
加权轮询 weight 后端服务器处理能力不均
最少连接数 least_conn 请求处理时间长短不一,需要动态平衡负载
IP 哈希 ip_hash 需要保持会话(Session)一致性
通用哈希 hash 需要基于特定规则(如URL)进行路由,提高缓存效率
最少时间 least_time (Nginx Plus) 追求最佳性能和响应速度
随机 random 大规模后端集群,降低选择开销

最常用的策略加权轮询IP哈希。根据你的业务需求(是否需要会话保持、后端服务器性能是否一致等)来选择合适的策略是关键。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容