用于高可用性的 RabbitMQ 集群队列镜像:在时间 t 获取队列的主节点 ip

Posted

技术标签:

【中文标题】用于高可用性的 RabbitMQ 集群队列镜像:在时间 t 获取队列的主节点 ip【英文标题】:RabbitMQ clustering queue mirroring for high availability: get master node's ip for a queue at time t 【发布时间】:2016-05-09 22:40:01 【问题描述】:

据我了解,RabbitMQ 集群是为了可扩展性而不是可用性,但使用镜像队列也可以实现可用性,因为如果主服务器发生故障,可以将最新的从服务器提升为主服务器。

来自文档:

发布到队列的消息被复制到所有从站。无论消费者连接到哪个节点,消费者都连接到主节点,从节点丢弃已在主节点确认的消息。因此,队列镜像提高了可用性,但不会在节点之间分配负载(所有参与节点各自完成所有工作)。

因此,给定队列的节点之间的负载平衡没有意义,因为这总是会增加从连接的节点到队列的主节点的额外行程(除非我误解了某些东西)。因此,我们希望始终能够知道哪个节点是给定队列的主节点。

我并没有真正使用过 RabbitMQ,所以也许我只是在文档中遗漏了它,但是如果存在主故障和从属故障,似乎无法确定镜像队列的主 IP被提升为大师。我看到的每个来源都只是评论一个人设置初始主节点的能力,这对我来说不是很有帮助。对于任何时间 t,我如何找到给定队列的主节点 ip?

PS:将节点简单地放在负载均衡器后面似乎也很糟糕,因为如果有一些网络分区(即使节点在同一个 LAN 中也可能发生),那么我们可能会遇到无法访问的节点与队列的主人沟通,或者更糟糕的是,如果你愿意的话,我们可能会进化出大脑分裂。

【问题讨论】:

【参考方案1】:

您可以创建一个维护队列镜像拓扑的智能客户端。可以使用Management Plugin 及其REST API。

例如。对于队列,curl -i -u guest:guest http://[HOST]:[PORT]/api/queues/[VHOST]/[QUEUE] 将返回以下负载:


  "messages": 0,
  "slave_nodes": [
    "rabbit@node1",
    "rabbit@node0"
  ],
  "synchronised_slave_nodes": [
    "rabbit@node0",
    "rabbit@node1"
  ],
  "recoverable_slaves": [
    "rabbit@node0"
  ],
  "state": "running",
  "name": "myQueue",
=>"node": "rabbit@node2"

对于 myQueue,您的客户端将倾向于连接到 node2(myQueue 主节点)以最小化 HOP。

我不确定这是否值得。它将增加连接的数量和客户端的复杂性。如果您实施 somethink,我会很高兴收到反馈。

【讨论】:

仔细考虑之后,额外的跃点可能并不像尝试跳过该跃点所带来的复杂性那么重要。【参考方案2】:

你不需要主节点的IP,你只需要镜像队列,这样队列中的所有消息都在所有节点上。上一段你引用的就是这句话

每个镜像队列由一个master和一个或多个slave组成, 如果旧的奴隶被提升为新的主人 主人不知何故消失了。

所以 masterslave 这两个词与队列有关,而不是 rabbitmq 节点,我猜这是混淆。一旦我阅读了问题,然后又阅读了文档,这让我思考了一段时间,但我们不能说镜像队列由 rabbitmq 节点的主节点和从节点组成;)

至于(?)集群的负载平衡,您可以这样做,以便客户端始终通过使用实际负载平衡器或通过使客户端“更智能”连接到活动的 rabbitmq 节点 - 即他们应该重新连接如果(原始)主节点出现故障,则连接到另一个节点的 IP。推荐第一种方法,只需寻找Connecting to Clusters from Clientshere。

【讨论】:

以上是关于用于高可用性的 RabbitMQ 集群队列镜像:在时间 t 获取队列的主节点 ip的主要内容,如果未能解决你的问题,请参考以下文章

Windows RabbitMQ 镜像队列 (高可用性一台宕机自动切换另一台) 使用 RabbitMQ 自带的Web 管理工具

RabbitMQ 高可用之镜像队列

RabbitMQ 高可用之镜像队列

RabbitMQ 高可用之镜像队列

RabbitMQ 集群与高可用配置

高可用rabbitmq集群服务部署步骤