如何使用主动/被动高可用性架构配置RabbitMQ

时间:2013-12-10 17:37:56

标签: rabbitmq message-queue high-availability

我正在尝试设置RabbitMQ服务器集群,以使用主动/被动服务器架构获得高可用性队列。我正在遵循这些指南:

  1. http://www.rabbitmq.com/clustering.html
  2. http://www.rabbitmq.com/ha.html
  3. http://karlgrz.com/rabbitmq-highly-available-queues-and-clustering-using-amazon-ec2/
  4. 我对高可用性的要求很简单,我有两个节点(CentOS 6.4)与RabbitMQ(v3.2)和Erlang R15B03。 Node1必须是“活动”,响应所有请求,Node2必须是“被动”节点,其中包含所有队列和消息(从Node1)复制。

    为此,我配置了以下内容:

    • 使用RabbitMQ的Node1在非群集模式下正常工作
    • 使用RabbitMQ的Node2在非群集模式下正常工作

    接下来我做的是在两个节点之间创建一个集群:将Node2加入Node1(指南1)。之后,我配置了一个策略来镜像队列(指南2),复制集群中所有节点之间的所有队列和消息。这可行,我可以连接到任何节点并发布或使用消息,同时两个节点都可用。

    当我在Node1上创建队列“queueA”(queueA上的master)时出现问题,并且当Node1停止时,我无法连接到Node2中的queueA来生成或使用消息,Node2抛出错误说Node1不可访问(我认为queueA没有复制到Node2,Node2不能被提升为queueA的主服务器。)

    错误是:

      

    {“AMQP操作被中断:AMQP关闭原因,由...发起   Peer,code = 404,text = \“NOT_FOUND - 持久的主节点'rabbit @ node1'   vhost'app01'中的队列'queueA'已关闭或无法访问\“,classId = 50,   methodId = 10,cause =“}

    使用的步骤顺序为:

    Node1:

    1. rabbitmq-server -detached
    2. rabbitmqctl start_app
    

    节点2:

    3. Copy .erlang.cookie from Node1 to Node2
    4. rabbitmq-server -detached
    

    加入群集(Node2):

    5. rabbitmqctl stop_app
    6. rabbitmqctl join_cluster rabbit@node1
    7. rabbitmqctl start_app
    

    配置队列镜像策略:

    8. rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
    

    注意:用于队列名称的模式是“”(所有队列)。

    当我运行'rabbitmqctl list_policies'和'rabbitmqctl cluster_status'时,一切正常。

    如果Node1不可用,为什么Node2无法响应?这个设置有什么问题吗?

5 个答案:

答案 0 :(得分:5)

您尚未在set_policy调用中指定虚拟主机(app01),因此该策略仅适用于默认虚拟主机(/)。此命令行应该起作用:

rabbitmqctl set_policy -p app01 ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

答案 1 :(得分:1)

在Web管理控制台中,queueA是否列为Node1 +1?

听起来您的设置可能存在一些问题。我有一组vagrant boxes预先配置为在群集中工作,可能值得尝试并确定您的设置中的问题?

答案 2 :(得分:0)

确保您的队列不耐用或独占。

从文档(https://www.rabbitmq.com/ha.html):

  

当声明它们的连接关闭时,将删除独占队列。因此,它对于独占队列没有用处   队列要镜像(或持久),因为节点   托管它关闭,连接将关闭,队列将   无论如何都需要删除。

     

出于这个原因,独占队列永远不会被镜像(即使它们   匹配政策,声明他们应该)。他们也永远不会   耐用(即使声明如此)。

从错误消息中:

  

{" AMQP操作被中断:AMQP关闭原因,由...发起   Peer,code = 404,text = \" NOT_FOUND - home node' rabbit @ node1'的   持久排队' queueA'在vhost' app01'已关闭或无法访问\",classId = 50,methodId = 10,cause ="}

看起来你创建了一个持久的队列。

答案 3 :(得分:0)

只有与master同步的镜像队列在失败后才会被提升为master。这是默认行为,但可以始终更改为“关闭时提升”。

答案 4 :(得分:-1)

仔细阅读您的参考资料

http://www.rabbitmq.com/ha.html

  

您可以使用RabbitMQ节点集群构建RabbitMQ   经纪人。这将有助于丢失单个节点   服务的整体可用性方面,但有些重要   警告适用:虽然交换和绑定在失去后仍然存在   单个节点,队列及其消息不会。这是因为a   队列及其内容只驻留在一个节点上,从而丢失了一个节点   节点将使其队列不可用。