【问题标题】:Balance RabbitMQ master queues across nodes跨节点平衡 RabbitMQ 主队列
【发布时间】:2020-09-21 17:37:43
【问题描述】:

我有一个由 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(通过引起所有镜像的重新同步)。

【问题讨论】:

    标签: rabbitmq load-balancing


    【解决方案1】:

    你可以使用这个命令:

    rabbitmq-queues rebalance type --vhost-pattern pattern --queue-pattern pattern
    

    例如

    rabbitmq-queues rebalance "all" --vhost-pattern "a-vhost" --queue-pattern ".*"
    

    【讨论】:

      【解决方案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 中可能会出现更高级的技术,但完全不确定。

      【讨论】:

      • queue-master-locator strategy ; Michael Klishin's hint for improvements in 4.x(抱歉,我不得不将其作为单独的评论发布,因为我缺乏每个答案发布超过 2 个链接的声誉)
      • Simon MacMullen 的诀窍不是 100%HA,因为当你这样做时,有一段时间你的队列不再镜像,这意味着在这个确切的时刻你可以完全放松你的队列。此外,在执行此操作时同步冻结队列(如果我正确理解了该功能),如果这种情况发生在错误的时刻,那就太糟糕了。关于联合...考虑到您不断地将消息从一对节点队列移动到另一对节点队列,这并没有真正减少一个节点的费用,而是使用更多的 CPU,因为第二个节点现在工作得更多!
      • 您是对的,并且理解正确。我完全理解你知道诀窍但不能使用它(在大多数情况下我不会推荐它)。关于联合队列,您也是对的。如文档中所述,如果您有某种位置,它会更好地工作。然而,由于消息可能会出现在一侧或另一侧,因此每个节点的负载是平衡的并略有降低。为了利用局部性,您可以以循环方式发布消息,并从两个集群中使用它们。这样,局部性得到保障,负载几乎完美平衡。你只为边缘情况保持联邦。
      • 是的,这就是我从文档和我阅读的所有主题中所理解的。感谢您的反馈。问题是如果可能的话,我想找到一个 100% HA 的解决方案。但这确实可以解决问题,我只是不喜欢“相信”并希望在专业环境中事情不会变得越来越糟。
      • 是的。综上所述,如果不能在 HA 或性能上进行权衡,我会选择多集群 + 联合队列 + 随机发布者 + 多消费者的解决方案。
      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 2019-11-13
      • 2020-12-31
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多