我想将 HAProxy 用于我的 Web 应用程序以实现负载平衡。我尝试使用命令在 HAProxy 服务器中动态添加新的 rabbitmq 节点:haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
。我leastconn
在负载平衡中使用平衡算法执行 tcp 连接模式。预期的情况是,当一个 rabbitmq 中有 3 个连接时,我会在 HAProxy 服务器中添加一个新的 rabbit 服务器。因此下一个连接将传递到第二个 rabbitmq 服务器,而我的情况并非如此。它以随机的方式分配连接。
这是我的配置文件:
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 5000
srvtimeout 5000
listen rabbitmq 0.0.0.0:5672
mode tcp
stats enable
balance leastconn
option tcplog
server rabbit01 xx.xx.xx.xx:5672 check
server rabbit02 xx.xx.xx.xx:5672 check
listen tomcatq 0.0.0.0:80
mode http
stats enable
balance roundrobin
stats refresh 10s
stats refresh 10s
stats uri /lb?stats
stats auth admin:admin
option httplog
导致此行为的问题是什么?任何建议都将不胜感激。
答案1
这HAProxy 文档关于平衡算法的说法leastconn
:
在需要非常长的会话的情况下建议使用此算法,例如 LDAP、SQL、TSE 等...但它不太适合使用短会话的协议,例如 HTTP。
我不确定 AMQP 是如何工作的,但我认为您不会看到完美的结果,尤其是在使用 leastconn 连接数较少的情况下。根据您的详细信息,您似乎没有动态添加节点,实际上您只是在重新启动 HAProxy 实例?
答案2
不确定如何向 haproxy 添加节点。新节点是否已存在于 haproxy.cfg 中?如果使用以下命令添加节点:haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
,haproxy 将重新启动,所有连接信息将被清除。因此,新连接可能不会发送到第二个 rabbitmq 服务器。