2015-08-26 218 views
0

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

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

cmd:/> rabbitmqctl join_cluster [email protected] 

如果你看到这里的机器是如下

在RMQ1

c:/> rabbitmqctl cluster_status 
    Cluster status of node [email protected] 
    [{nodes,[{disc,[[email protected],[email protected]]}]}, 
    {running_nodes,[[email protected],[email protected]]}] 

在RMQ2的状态

c:\> rabbitmqctl cluster_status 
Cluster status of node [email protected] ... 
[{nodes,[{disc,[[email protected],[email protected]]}]}, 
{running_nodes,[[email protected],[email protected]]}] 

的为了发布和订阅我连接到RMQ1的消息。现在我看到每当我发送或发送消息给RMQ1时,我都会在RMQ1和RMQ2中看到消息的镜像。我清楚地知道,由于两个节点都在同一个集群中,所以它们在节点之间进行镜像。

让我说我打倒了RMQ2,我仍然看到消息发布到RMQ1。

但是,当我打倒RMQ1时,我无法再发布消息。从这我明白,RMQ1是主,RMQ2是奴隶。

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

  1. 如何让RMQ2占用接受邮件的工作。
  2. Highly Available Queues是什么意思?
  3. 应该如何实施这种情况下的战略。

请帮

回答

2

问题#2最好是先回答,因为它会清除了很多东西给你。

高可用队列的含义是什么?

一个很好的信息来源是the Rabbit doc on high availability。理解镜像(这是你如何在Rabbit中实现高可用性)和集群是不一样的。您需要创建一个群集才能进行镜像,但是镜像不会因为您创建群集而自动发生。

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

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

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

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

因此,与现在这样的背景下,你知道答案的另外两个问题:

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

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

enter image description here

The previously cited doc有什么更详细意味着在Rabbit中配置高可用性。

这会给你带来的是镜像群集中的队列和消息。这样,如果RMQ1失败,那么RMQ2仍然会有您的队列和消息,因为它们在两个节点之间镜像。

一个重要的注意事项是,兔子不会自动检测与RMQ1的连接丢失并将您连接到RMQ2。你的客户需要这样做。我看到你用EasyNetQ来标记你的问题。 EasyNetQ为您提供这种“故障转移连接”功能。您只需要在连接字符串中提供两个节点主机。 EasyNetQ doc on clustering有详细信息。请注意,在这种情况下,EasyNetQ甚至可以让您注入简单的负载平衡策略。