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

时间:2016-05-09 22:40:01

标签: rabbitmq rabbitmqctl

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

来自文档:

  

发布到队列的消息将复制到所有从属服务器。无论连接到哪个节点,消费者都连接到主服务器,从服务器丢弃已在主服务器上确认的消息。因此,队列镜像可以增强可用性,但不会跨节点分配负载(所有参与节点都可以完成所有工作)。

因此,对于给定队列,跨节点的负载平衡没有意义,因为这将总是从联系到节点的主节点的节点添加额外的行程(除非我误解了某些内容)。因此,我们希望始终能够知道哪个节点是给定队列的主节点。

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

PS:简单地将节点置于负载均衡器后面似乎也很糟糕,因为如果有一些网络分区(即使在同一局域网中的节点也可能发生),那么我们可能会遇到不能的节点如果你愿意的话,可能会有一个我们正在发展的裂脑。

2 个答案:

答案 0 :(得分:1)

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

  

每个镜像队列由一个主服务器和一个或多个从服务器组成,   如果旧的,最老的奴隶被提升为新的主人   主人因任何原因消失。

所以单词 master slave 与队列有关,而不是rabbitmq节点,我猜这里是混乱。一旦我读到了问题,然后又读了文档,它让我思考了一段时间,但是我们不能说镜像队列由rabbitmq节点的主设备和从设备组成;)


对于(?)群集的负载平衡,您可以这样做,以便客户端始终通过使用实际负载均衡器连接到有效的rabbitmq节点,或者通过使客户端更智能" - 即如果(原始)主节点发生故障,它们应重新连接到另一个节点的IP。建议使用第一种方法,只需查看从客户端连接到群集 here

答案 1 :(得分: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。

我不确定这笔费用是否值得。它会增加连接数和客户端复杂性。如果你实施一些想法,我会很高兴收到反馈。