【问题标题】:Configure HAProxy for rabbitmq为rabbitmq配置HAProxy
【发布时间】:2012-05-19 19:46:15
【问题描述】:

我想使用 HAProxy 作为负载平衡器。我想把两个rabbitmq服务器放在haproxy后面。两个rabbitmq 服务器都在不同的EC2 实例上。我已经按照this reference 配置了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 上发布了这个问题

【问题讨论】:

  • 当你说它可以工作但消息只发布在一个服务器上时,这肯定是它不工作的迹象吗?从 HAProxy 机器上,您可以与两台服务器建立 AMQP 连接吗?我注意到它们位于不同的网络上,您能否发布统计页面的屏幕截图,以便我们可以看到 HAProxy 正在做什么。顺便说一句,你在这里的目标是什么?如果可以通过扇出交换更好地管理某些事情,则使用 HAProxy 将消息 RR 到不同的服务器。
  • 史蒂夫·马丁。谢谢你的答复。我的 HAproxy 服务器能够连接两个 Rabbitmq 服务器。我的目标是连接应该由 HAProxy 管理。例如,如果我在 HAProxy 后面有 2 个 rabbit 服务器并发布了 1000 条消息,那么 rabbit1 应该有 500 个 msg,剩下的应该有 500 个 msg。如果我在 HAProxy 服务器中动态添加 rabbitmq 服务器,HAP 应该分布在所有的 rabbit 服务器中。目前我正在遭受的是所有 1000 条消息都在 rabbit1 中,而不是在两者中。
  • 啊,刚刚更仔细地查看了您的 HAP 配置。您将两台服务器都配置为“备份”。将在答案中发布建议...

标签: java load-balancing rabbitmq haproxy round-robin


【解决方案1】:

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

备份服务器是在所有其他服务器都关闭时使用的服务器。将所有服务器指定为 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

【讨论】:

  • 哦,还要去掉'option forwardfor',因为这只对http真正有意义
  • 感谢史蒂夫·马丁。试过了。但未能达到目标。我已经更新了问题中的配置代码。
  • HAP 统计页面说明了它与您的 Rabbit 服务器建立的连接?
【解决方案2】:

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

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

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

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

【讨论】:

  • 建议您详细说明如何以这种方式配置队列。
【解决方案3】:

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”,然后将其他服务器添加为上游。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2018-04-13
    • 1970-01-01
    • 2020-01-03
    • 2017-07-29
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多