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

RabbitMQ群集队列镜像以实现高可用性:获取主节点';时间t时队列的ip,rabbitmq,rabbitmqctl,Rabbitmq,Rabbitmqctl,据我所知,RabbitMQ集群是为了可伸缩性而不是可用性,但使用镜像队列也可以实现可用性,因为如果主服务器出现故障,可以将最新的从服务器升级为主服务器 从文件中: 发布到队列的消息将复制到所有从属服务器。消费者连接到主节点,而不管他们连接到哪个节点,从节点会丢弃在主节点上已确认的消息。因此,队列镜像可以提高可用性,但不会跨节点分配负载(所有参与节点都完成所有工作) 因此,在给定队列的节点之间进行负载平衡是没有意义的,因为这总是会增加从所联系的节点到队列主节点的额外行程(除非我有误解)。因此,我们

据我所知,RabbitMQ集群是为了可伸缩性而不是可用性,但使用镜像队列也可以实现可用性,因为如果主服务器出现故障,可以将最新的从服务器升级为主服务器

从文件中:

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

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

我并没有太多地使用RabbitMQ,所以我可能只是在文档中遗漏了它,但如果主队列出现故障并且从队列升级为主队列,则似乎无法确定镜像队列的主队列的ip。我看到的每一个消息来源都仅仅是关于一个人设置初始主节点的能力的评论,这对我来说不是很有帮助。对于任何时间t,如何查找给定队列的主节点ip


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

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

每个镜像队列由一个主队列和一个或多个从属队列组成, 如果旧的奴隶被提升为新的奴隶主 师父不知什么原因消失了

因此,master和slave这两个词与队列相关,而不是rabbitmq节点,我猜这是混淆之处。当我读了问题的内容,然后又读了文档,这让我思考了一会儿,但我们不能说镜像队列由rabbitmq节点的主节点和从节点组成;)



至于集群的负载平衡,您可以通过使用实际的负载平衡器,或通过使客户端“更智能”来实现,即,如果(原始)主节点发生故障,它们应该重新连接到另一个节点的IP,从而使客户端始终连接到活动的rabbitmq节点。建议使用第一种方法,只需从客户端连接到群集。

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

例如,对于队列,
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,您的客户端将倾向于连接到
节点2
(myQueue主节点),以最小化跳数


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

在仔细考虑之后,额外的跳跃可能没有试图跳过该跳跃所带来的复杂性那么重要。