我是 haproxy 的新手,使用它来将 rsyslog 日志的 TCP 负载平衡到 ArcSight 连接器。就我而言,我无法让流量在池中的所有节点之间均匀平衡(这是理想的行为)。我尝试了许多权重和 maxconn 的排列,但都无济于事。
感觉这应该是一个简单的问题,但每个池节点的行为非常令人困惑。此外,由于大多数人使用 haproxy 进行 http 负载平衡,我发现关于如何最好地完成我所尝试做的事情的文档很少。
有人有任何见解、经过验证的配置或故障排除步骤可以推荐吗?
谢谢!
这是我们当前的配置:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 256000
user haproxy
group haproxy
spread-checks 5
daemon
quiet
defaults
log global
option dontlognull
option redispatch
option allbackups
maxconn 256000
timeout connect 5000
listen stats :1936
mode http
stats enable
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:savetheday
frontend rsyslog_netscreen
bind 127.0.0.1:8514
mode tcp
option tcplog
option contstats
option tcpka
default_backend rsyslog_netscreen_backend
backend rsyslog_netscreen_backend
balance roundrobin
mode tcp
option tcpka
option srvtcpka
server netscreen1 localhost:9515 weight 1 maxconn 1024 check
server netscreen2 localhost:9516 weight 1 maxconn 1024 check
server netscreen3 localhost:9517 weight 1 maxconn 1024 check
server netscreen4 localhost:9518 weight 1 maxconn 1024 check
server netscreen5 localhost:9519 weight 1 maxconn 1024 check
server netscreen6 localhost:9520 weight 1 maxconn 1024 check
答案1
请注意,这roundrobin
不是实现均匀负载的好策略。它将确保每个后端都收到相同的数字随着时间的推移,连接数会增加,但不关心每个连接持续多长时间。
在您stats
看来,每个后端服务器的会话总数应该几乎相等(如果它们的正常运行时间相等)。但是,当前会话数可能会有很大差异。
我们发现使用leastconn
而不是roundrobin
会产生更均匀的负载。这是有道理的,因为服务器恰好被许多长期存在的客户端所困扰,这些客户端保持着连接,因此不需要承受新的传入连接的负担。
答案2
对于短寿命连接使用 roundrobin,对于相当长寿命连接使用 leastconn。