RabbitMQ中负载均衡器的工作原理

cld4siwp  于 2023-11-19  发布在  RabbitMQ
关注(0)|答案(2)|浏览(179)

我是RabbitMQ的新手,所以请原谅我问一些琐碎的问题:
1.当运行RabbitMQ集群时,如果一个节点失败,负载会转移到另一个节点(而不会停止其他节点)。同样,我们也可以向现有集群添加新节点,而不会停止集群中的现有节点。对吗?
1.假设我们从一个RabbitMQ节点开始,并在其上创建100个队列。现在让我们假设生产者开始以更快的速度发送消息。为了处理这个负载,我们添加更多的节点并创建一个集群。但是队列只存在于第一个节点上。现在节点之间的负载如何平衡?如果我们需要添加更多的队列,我们应该在哪个节点上添加它们?或者我们可以使用负载均衡器添加它们吗?

bfrts1fy

bfrts1fy1#

1.当运行RabbitMQ集群时,如果一个节点失败,负载会转移到另一个节点(而不会停止其他节点)。同样,我们也可以向现有集群添加新节点,而不会停止集群中的现有节点。对吗?
如果创建队列的节点出现故障,只要启用了队列镜像,RabbitMQ就会在集群中为该队列选择一个新的主节点。集群基于您可以定义的策略提供高可用性(HA)。
1.假设我们从一个RabbitMQ节点开始,并在其上创建100个队列。现在假设生产者开始以更快的速度发送消息。为了处理此负载,我们添加更多节点并创建一个集群。但队列仅存在于第一个节点上。现在如何在节点之间平衡负载?
负载不平衡。分布式群集提供高可用性,但不提供负载平衡。您的请求将被重定向到队列所在的群集中的节点。
如果我们需要添加更多的队列,我们应该在哪个节点上添加它们?或者我们可以使用负载均衡器添加它们吗?
这取决于你的用例。有些人使用循环调度,在不同的节点上创建队列。

总结

2nbm6dog

2nbm6dog2#

让我试着以一种对大多数开发人员都有帮助的方式来回答您的问题。

**问题1.**当运行RabbitMQ集群时,如果一个节点出现故障,负载会转移到另一个节点(而不停止其他节点)。同样,我们也可以在不停止集群中现有节点的情况下,向现有集群添加新节点。对吗?

您的假设是完全正确的,假设RabbitMQ运行在一个主机上,但是RabbitMQ的队列在集群中的行为是不同的。默认情况下,每个队列只存在于集群中的一个节点上。但是,从Rabbit 2.6.0开始,我们为队列提供了一个内置的主动-主动冗余选项:镜像队列.声明镜像队列就像声明普通队列一样,但是您传递了一个名为x-ha-policy的额外参数,该额外参数告诉RabbitMQ您希望队列在集群中的所有节点上进行镜像。这意味着,如果在声明队列后向集群中添加了新节点,它将自动开始托管队列的从属副本。

**问题2.**假设我们从一个RabbitMQ节点开始,并在其上创建了100个队列。现在让我们假设生成器开始以更快的速率发送消息。为了处理此负载,我们添加了更多的节点,并创建了一个群集。但队列只存在于第一个节点上。现在如何在节点之间平衡负载?如果我们需要添加更多的队列,应该在哪个节点上添加它们?或者,我们可以使用负载平衡器来添加它们吗?

此问题有多个子问题。
现在节点之间的负载是如何平衡的?我们应该在哪个节点上添加队列?
设置为all,x-ha-policy告诉RabbitMQ您希望队列在集群中的所有节点上进行镜像。这意味着,如果在声明队列后向集群添加了一个新节点,则它将自动开始托管队列的从属副本。
我们是否可以使用负载平衡器添加队列?
您不应该这样做,尽管从技术上讲您可以这样做(您必须在LB中调用RabbitMQ API,这不是一个好的做法)。负载平衡器用于弹性消息传递基础结构。您的集群节点是负载平衡器后面的服务器,而您的生产者和消费者是客户。

相关问题