我目前正在测试 haproxy 来平衡我们新闻通讯的负载。我们为客户创建个性化新闻通讯。
为此,我们使用两台网络服务器(相同的机器)和一个“邮件引擎”。邮件引擎会调用网络服务器,然后返回个性化的 html 新闻稿。
现在的问题是,一个 Web 服务器的 CPU 负载约为 75%,而另一个仅运行 15%。测试时查看“会话速率”,两个服务器的“会话速率 -> 当前”始终在 3 到 4 之间。
但是当查看“会话”时,这里“会话 -> 当前”总共有 10,Web 服务器 1 的“当前”为 8,而另一个 Web 服务器有 0 到 2 个。
为什么第一个 Web 服务器上有 8 个会话,而另一个上只有 0-2 个?
这是我的配置:
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen mailgenerator 10.46.70.75:80
mode http
stats enable
balance roundrobin
option httpclose
option forwardfor
option httpchk HEAD /robots.txt
server mail1 192.168.70.11:80 check weight 100
server mail2 192.168.70.12:80 check weight 100
答案1
如果您使用轮询,则无论负载如何,连接都会在到达时均匀分布。因此,如果您的服务器或进程较慢,它可以在一个服务器上建立队列,而另一个服务器则处于空闲状态。
如果您使用 leastconn 平衡并设置每个服务器的较低 maxconn 以使连接在 haproxy 中排队而不是在每个服务器上排队,则可以获得更均匀的分布。
答案2
对于 http,当前会话数意义不大。会话总数和 LbTot 更能体现服务器的平衡情况。如果这些数字相当均匀,则可能是某台服务器的某些问题导致其处理请求的速度变慢,从而增加了负载。