0

我是 RabbitMq 的新手。我无法理解这里的概念。请找到场景。

我有两台机器(RMQ1,RMQ2),我在两台正在运行的机器上都安装了rabbitmq。我再次集群 RMQ2 以加入 RMQ1

cmd:/> rabbitmqctl join_cluster rabbit@RMQ1

如果您在此处查看机器的状态,则如下所示

在 RMQ1 中

c:/> rabbitmqctl cluster_status
    Cluster status of node rabbit@RMQ1...
    [{nodes,[{disc,[rabbit@RMQ1,rabbit@RMQ2]}]},
     {running_nodes,[rabbit@RMQ1,rabbit@RMQ2]}]

在 RMQ2 中

c:\> rabbitmqctl cluster_status
Cluster status of node rabbit@RMQ2 ...
[{nodes,[{disc,[rabbit@RMQ1,rabbit@RMQ2]}]},
 {running_nodes,[rabbit@RMQ1,rabbit@RMQ2]}]

为了发布和订阅消息,我连接到 RMQ1。现在我看到每当我向 RMQ1 发送或发送消息时,我都会看到消息在 RMQ1 和 RMQ2 中镜像。我清楚地理解,由于两个节点都在同一个集群中,它们正在跨节点镜像。

假设我关闭了 RMQ2,我仍然看到消息被发布到 RMQ1。

但是当我关闭 RMQ1 时,我无法再发布消息了。由此我了解到 RMQ1 是主机,RMQ2 是从机。

现在我有以下问题,无需更改代码:

  1. 如何让 RMQ2 承担接受消息的工作。
  2. 高可用队列是什么意思。
  3. 实施这种情况的策略应该如何。

请帮忙

4

1 回答 1

3

最好首先回答问题 #2,因为它会为您解决很多问题。

高可用队列是什么意思?

一个很好的信息来源是Rabbit 文档 on high availability。了解镜像(这是在 Rabbit 中实现高可用性的方式)和集群不是一回事非常重要。您需要创建集群才能进行镜像,但镜像不会因为您创建集群而自动发生。

当您集群 Rabbit 时,集群中的节点共享交换、绑定、权限和其他资源。这允许您将集群作为单个逻辑代理进行管理,并将其用于负载平衡等场景。然而,即使集群中的队列可以从集群中的任何机器访问,每个队列及其消息实际上仍然仅位于声明队列的单个节点上。

这就是为什么在您的情况下,关闭 RMQ1 将使队列和消息不可用。如果那是您始终连接的节点,那么这就是那些队列所在的位置。它们根本不存在于 RMQ2 上。

此外,即使 RMQ2 上有队列和消息,也无法访问它们,除非您在检测到与 RMQ1 的连接丢失后,专门连接到 RMQ2。Rabbit 不会自动将您连接到集群中的某个幸存节点。

顺便说一句,如果您在 RabbitMQ 管理控制台中查看集群,您所看到的可能会让您认为消息和队列是复制的。他们不是。您正在管理控制台中查看集群。因此,无论您在控制台中连接到哪个节点,您都会看到集群范围的视图。

因此,有了这个背景,现在您知道了其他两个问题的答案:

实现高可用性的策略应该是什么?/ 如何让 RMQ2 接受消息?

根据您的描述,您正在寻找高可用性旨在提供的故障转移。您需要在集群上启用此功能。这是通过策略完成的,有多种方法可以做到这一点,但最简单的方法是在策略部分的管理选项卡上的管理控制台中:

在此处输入图像描述

前面引用的文档更详细地说明了在 Rabbit 中配置高可用性的含义。

这将为您提供跨集群的队列和消息的镜像。这样,如果 RMQ1 失败,那么 RMQ2 仍将拥有您的队列和消息,因为它们在两个节点之间进行了镜像。

重要的一点是,Rabbit 不会自动检测到 RMQ1 的连接丢失并将您连接到 RMQ2。您的客户需要这样做。我看到你用 标记了你的问题EasyNetQ。EasyNetQ 为您提供了这种“故障转移连接”类型的功能。您只需要在连接字符串中提供两个节点主机。关于集群的EasyNetQ 文档有详细信息。请注意,在这种情况下,EasyNetQ 甚至还允许您注入一个简单的负载平衡策略。

于 2015-09-30T19:07:09.173 回答