3

我想使用 HAProxy 作为负载均衡器。我想把两个rabbitmq服务器放在haproxy后面。两个rabbitmq 服务器都在不同的EC2 实例上。我已经按照这个参考配置了 HAProxy 服务器。我工作,但问题是消息没有以循环模式发布。消息仅在一台服务器上发布。我的要求有什么不同的配置吗?

我在 /etc/haproxy/haproxy.cfg 中的配置

listen rabbitmq 0.0.0.0:5672
     mode    tcp
     stats   enable
     balance roundrobin
    option tcplog
    no  option clitcpka
    no option srvtcpka
     server  rabbit01 46.XX.XX.XX:5672 check
     server  rabbit02 176.XX.XX.XX:5672 check
listen  web-service *:80
          mode    http
         balance roundrobin
        option httpchk HEAD / HTTP/1.0
         option httpclose
        option forwardfor
        option httpchk OPTIONS /health_check.html
        stats enable
        stats refresh 10s
        stats hide-version
        stats scope   .
        stats uri     /lb?stats
        stats realm   LB2\ Statistics
        stats auth    admin:Adm1nn

更新:

我对此进行了一些研发,发现HAProxy是在rabbitmq服务器上循环连接的。例如:如果我请求 10 个连接,那么它将在我的 2 个 rabbitmq 服务器上循环 10 个连接并发布消息。

但问题是我想轮询消息,而不是连接它应该由 HAProxy 服务器管理。即,如果我一次向 HAProxy 发送 1000 条消息,那么 500 条消息应该发送到 rabbit server1,500 条 msg 应该发送到 rabbit server2。我必须遵循什么配置?

更新:

我还用 minimumconn 进行了平衡测试,但 HAProxy 的行为出乎意料。我已经在serverfault.com上发布了这个问题

4

3 回答 3

5

消息被发布到将路由到队列的交换器。

您可能没有使用 {"x-ha-policy","all"} 配置队列。基于交换路由在两个节点上都有效的事实,这可能就是您所缺少的。

注意:在 Rabbit 3.0 之前,您可以使用 x-ha-policy 参数声明一个队列,它会被镜像。使用rabbit 3.0,您需要应用策略(ha-mode = all)。您可以通过 api 或 api 工具(rabbitmqctl、管理 gui)设置策略。IE

rabbitmqctl set_policy -p '/' MirrorAllQueues '.+' '{"ha-mode": "all"}'

于 2012-12-18T20:35:28.780 回答
2

AMQP 协议旨在使用持久连接,这意味着您不会为每个 AMQP 消息获得一个新连接(以避免不断重新连接的开销)。这意味着像 HAProxy 这样的负载平衡器不能有效地平衡您的消息——它只能帮助平衡您的连接

因此,您无法实现既定目标。但是,如果您的实际目标是将消息平均分配给那些 RabbitMQ 实例的消费者,那么您可以使用 Karsten 描述的集群,也可以使用federation

联邦设置:

首先,您需要启用联邦插件:

rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management

然后,对于您的每台服务器,以管理员身份登录到 RabbitMQ Web UI,然后转到 Admin > “Federation Upstreams” > “Add a new upstream”,并将其他服务器添加为上游。

现在您需要为要联合的每个交换/队列定义一个策略。我只设法让联邦为队列工作请注意,所以我会先尝试。转到管理>“策略”>“添加/更新策略”并添加针对您想要联合的队列的策略。

于 2014-10-07T16:26:50.893 回答
0

从服务器定义中删除“备份”。

备份服务器是在所有其他服务器都关闭时使用的服务器。将所有服务器指定为backup不使用option allbackups可能会产生不良后果。

将配置的相关部分更改为以下内容:

listen  rebbitmq *:5672
        mode    tcp
        balance roundrobin
        stats enable
        option  forwardfor
        option  tcpka
        server  web2 46.XX.XX.XXX:5672 check inter 5000
        server web1 176.XX.XX.XX:5672 check inter 5000
于 2012-05-15T15:26:17.787 回答