根据我的理解,RabbitMQ集群的可扩展性不是可用性,但使用镜像队列也可以实现可用性,因为如果主服务器出现故障,可以将最新的服务器提升为主服务器。
来自文档:
发布到队列的消息将复制到所有从属服务器。无论连接到哪个节点,消费者都连接到主服务器,从服务器丢弃已在主服务器上确认的消息。因此,队列镜像可以增强可用性,但不会跨节点分配负载(所有参与节点都可以完成所有工作)。
因此,对于给定队列,跨节点的负载平衡没有意义,因为这将总是从联系到节点的主节点的节点添加额外的行程(除非我误解了某些内容)。因此,我们希望始终能够知道哪个节点是给定队列的主节点。
我还没有真正使用过RabbitMQ,所以也许我只是在文档中遗漏了它,但似乎没有办法确定镜像队列的主人的ip,如果有主故障和奴隶被提升为大师。我看到的每一个来源都只是评论一个人设置初始主节点的能力,这对我来说并不是很有帮助。对于任何时间t,如何找到给定队列的主节点ip?
PS:简单地将节点置于负载均衡器后面似乎也很糟糕,因为如果有一些网络分区(即使在同一局域网中的节点也可能发生),那么我们可能会遇到不能的节点如果你愿意的话,可能会有一个我们正在发展的裂脑。
答案 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。
我不确定这笔费用是否值得。它会增加连接数和客户端复杂性。如果你实施一些想法,我会很高兴收到反馈。