用于高可用性的 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组成, 如果旧的奴隶被提升为新的主人 主人不知何故消失了。
所以 master 和 slave 这两个词与队列有关,而不是 rabbitmq 节点,我猜这是混淆。一旦我阅读了问题,然后又阅读了文档,这让我思考了一段时间,但我们不能说镜像队列由 rabbitmq 节点的主节点和从节点组成;)
至于(?)集群的负载平衡,您可以这样做,以便客户端始终通过使用实际负载平衡器或通过使客户端“更智能”连接到活动的 rabbitmq 节点 - 即他们应该重新连接如果(原始)主节点出现故障,则连接到另一个节点的 IP。推荐第一种方法,只需寻找Connecting to Clusters from Clientshere。
【讨论】:
以上是关于用于高可用性的 RabbitMQ 集群队列镜像:在时间 t 获取队列的主节点 ip的主要内容,如果未能解决你的问题,请参考以下文章
Windows RabbitMQ 镜像队列 (高可用性一台宕机自动切换另一台) 使用 RabbitMQ 自带的Web 管理工具