为rabbitmq配置HAProxy

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

我在/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 msg,那么500 msg应该转到rabbit server1,500 msg应该转到rabbit server2。 我必须遵循什么配置?

更新:

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

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

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

注意:Pre Rabbit 3.0您将使用x-ha-policy参数声明一个队列,并且它将被镜像。 使用Rabbit 3.0,您需要应用策略(ha-mode = all)。 您可以通过api或api工具(rabbitmqctl,management gui)设置策略。 即

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

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

因此,您无法实现既定目标。 但是,如果您的实际目标是将消息均匀地分发给这些RabbitMQ实例的使用者 ,那么您可以像Karsten描述的那样使用群集,或者您可以使用联合 。

联邦设置:

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

 rabbitmq-plugins enable rabbitmq_federation rabbitmq-plugins enable rabbitmq_federation_management 

然后,对于每个服务器,以管理员身份登录RabbitMQ Web UI,转到管理员>“联合上游”>“添加新上游”,并将其他服务器添加为上游。

现在,您需要为要联合的每个交换/队列定义策略。 我只是设法让联盟为排队工作,所以我先尝试一下。 转到管理员>“策略”>“添加/更新策略”,然后添加一个针对您希望联合的队列的策略。

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

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

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

 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