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

RabbitMQ clustering queue mirroring for high availability: get master node's ip for a queue at time t

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

来自文档:

Messages published to the queue are replicated to all slaves. Consumers are connected to the master regardless of which node they connect to, with slaves dropping messages that have been acknowledged at the master. Queue mirroring therefore enhances availability, but does not distribute load across nodes (all participating nodes each do all the work).

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

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

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

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

Each mirrored queue consists of one master and one or more slaves, with the oldest slave being promoted to the new master if the old master disappears for any reason.

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


至于(的?)集群的负载平衡,您可以这样做,以便客户端始终连接到 rabbitmq 节点,该节点通过使用实际的负载平衡器或通过使客户端 "smarter" 处于活动状态 - 即它们如果(原始)主节点出现故障,应该重新连接到另一个节点的 IP。推荐第一种方法,只需查找 从客户端连接到集群 here.

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

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

{
  "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。

我不确定是否值得。它会增加连接数和客户端的复杂性。如果您实施一些想法,我很乐意收到反馈。