我正在使用 Haproxy 来平衡我的 Web 服务器的负载。并非所有服务器都拥有相同的资源。典型的负载平衡算法会导致一些低端服务器过载,因为 LB 无法感知心跳。
是否有一种基于服务器当前负载、资源可用性等来平衡服务器负载的方法?
答案1
您可以动态调整服务器权重set weight
使用命令提供的 HAProxy Voodoo
相关位(发送到 HAProxy 的统计套接字):
设定重量/[%]
将服务器的权重更改为传入参数的值。如果该值以“%”符号结尾,则新权重将相对于初始配置的权重。相对权重仅允许在 0 到 100% 之间,绝对权重允许在 0 到 256 之间。运行静态负载平衡算法的服务器群的服务器具有更严格的限制,因为权重一旦设置就不能更改。因此对于这些服务器,唯一可接受的值是 0 和 100%(或 0 和初始权重)。更改会立即生效,但某些 LB 算法需要一定数量的请求才能考虑更改。此命令的典型用法是通过将服务器的权重设置为零来在更新期间禁用服务器,然后在更新后将其重新设置为 100% 来再次启用它。此命令受到限制,只能在为级别“admin”配置的套接字上发出。后端和服务器都可以通过其名称或数字 ID 指定,前缀为破折号(“#”)。
当然,您需要在服务器上编写一些后端代码来报告它们的相对负载,并且 HAProxy 盒上的一个进程需要查询它们(这可以通过一些创造性纳入到您的健康检查中,但为了简单起见,我会首先将其作为一个单独的进程来执行)。
答案2
实现此目的的最简单方法是在您的 Web 服务器上设置一个状态页面,如果服务器正常,则返回 HTTP 200,如果服务器过载,则返回 HTTP 500。此外,如果您知道某个服务器可以处理比其他服务器多 20% 的连接,则可以使用权重来尝试避免服务器过载:
backend appservers
mode http
option httpchk HEAD /health_check.php
option redispatch
server web1 x.x.x.x:80 weight 100 check inter 2000 rise 5 fall 2
server web2 x.x.x.x:80 weight 120 check inter 2000 rise 5 fall 2
server web3 x.x.x.x:80 weight 80 check inter 2000 rise 5 fall 2