2

我有一个带有 3 个节点的 RabbitMQ 集群(版本 3.0.1)。我想要,我的队列每次都在所有可用的 3 个节点上。
我这样创建集群:


节点1:节点2:rabbitmqctl join_cluster rabbit@node1 node3
:rabbitmqctl join_cluster rabbit@node1

在此之后,我设置了以下策略:

模式: ^(?!amq.).*
定义:ha-mode: all

如果我现在开始我的 3 个节点并在我的 1 个节点中编写一些想法,那么我在所有 3 个节点上都有它并且它可以工作。但是,如果与其中 1 个节点的连接断开,并且该节点在一段时间后又回来了,则该节点不再与其他节点同步。
我该如何解决这个问题?我希望所有节点每次都同步,即使在停机之后也是如此。

4

3 回答 3

3

现在使用 3.1.x 版本有一个选项 ha-sync-mode 可以设置为自动,这可以解决您的问题:

通过将 ha-sync-mode 策略键设置为自动,可以将队列设置为自动同步。ha-sync-mode 也可以设置为手动。如果未设置,则假定为手动。

查看http://www.rabbitmq.com/ha.html了解更多信息。

于 2013-06-06T12:48:52.750 回答
1

对不起,你的坏消息,但这是不受支持的。当新节点加入集群时,它不会收到任何现有消息。

来自非同步奴隶 http://www.rabbitmq.com/ha.html

节点可以随时加入集群。根据队列的配置,当一个节点加入集群时,队列可能会在新节点上添加一个从属节点。此时,新的 slave 将是空的:它不会包含任何现有的队列内容,并且目前没有同步协议。这样的从站将接收发布到队列的新消息,因此随着时间的推移将准确地表示镜像队列的尾部。

更新:

答案适用于 2.8.x 版本的 RabbitMQ

于 2012-12-20T20:14:39.627 回答
1

我决定通过编辑rabbitmq-server init.d 脚本(/etc/init.d/rabbitmq-server)来解决这个问题。

在成功启动后添加以下行(在rabbitmq_start函数中)将导致新加入的成员同步所有队列:

$CONTROL list_queues | cut -f1 | tail -n +2 | head -n -1 | xargs -n 1 $CONTROL sync_queue > /dev/null

即使它不是最干净的解决方案,它仍然是一个解决方案。不喜欢修改分发文件。

于 2013-05-26T11:52:06.820 回答