我有一个包含3个RabbitMQ节点的集群,我希望在所有节点之间保持主队列平衡,即使在节点重新启动后也是如此。但是,当新节点加入群集或其中一个节点断开连接并重新连接时,主队列不会重新平衡。
示例:我在节点A,B和C上创建了100个队列。 如果节点C关闭,则来自C的主队列在节点A和B之间几乎同等地重新平衡。因此,此时节点A和B都有大约50个主队列。 现在,如果我重新连接节点C,它将保留0个主队列,直到创建新队列。这是有问题的,因为我希望我的所有节点都能产生相同的工作量。
我的交换是耐用品,我的队列是耐用品和镜像,我的消息是持久的。我想避免丢失消息。
我知道change the master node manually using a policy trick有办法。但这并不令人满意,因为它会破坏HA(通过诱导所有镜像的重新同步)。
答案 0 :(得分:2)
一种解决方案是使用Federated Queues。
联合队列链接到其他队列(称为上游队列)。它将从上游队列中检索消息,以满足对来自本地消费者的消息的需求。
您可以创建一个全新的群集,该群集既可以是原始群集的上游和下游。您还需要确保发布者和消费者定期重新连接(以避免一个群集独占所有连接,从而阻止负载平衡)。
正如你所指出的,还有来自rabbitmq-users
小组的Simon MacMullen的伎俩。
# rabbitmqctl set_policy --apply-to queues --priority 100 my-queue '^my-queue$' '{"ha-mode":"nodes", "ha-params":["rabbit@master-node"]}'
# rabbitmqctl clear_policy my-queue
但它有一个不利的副作用,使镜像松散同步一段时间。这可能是可以接受的,取决于你的要求,所以我认为值得说它是可能的。
更高级的技术可能会出现在4.x中,但它根本不确定。
答案 1 :(得分:1)
您可以使用以下命令:
rabbitmq-queues rebalance type --vhost-pattern pattern --queue-pattern pattern
例如
rabbitmq-queues rebalance "all" --vhost-pattern "a-vhost" --queue-pattern ".*"