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

我试图设置一个RabbitMQ服务器集群,以使用主动/被动服务器体系结构来获得高可用性队列。 我遵循这个指南:

  • http://www.rabbitmq.com/clustering.html
  • http://www.rabbitmq.com/ha.html
  • http://karlgrz.com/rabbitmq-highly-available-queues-and-clustering-using-amazon-ec2/
  • 我对高可用性的要求很简单,我有两个使用RabbitMQ(v3.2)和Erlang R15B03的节点(CentOS 6.4)。 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操作被中断:由peer发起的AMQP关闭原因,code = 404,text = ”NOT_FOUND - vhost'app01'中持久队列'queueA'的主节点'rabbit @ node1'已关闭或无法访问 “,classId = 50,methodId = 10,cause =”}

    使用的步骤顺序是:

    节点1:

    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在Node1不可用时无法响应? 这种设置有什么问题吗?


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

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

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

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


    确保您的队列不耐用或排他。

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

    当声明它们的连接关闭时,独占队列将被删除。 因为这个原因,因为当托管它的节点关闭时,连接将关闭,并且无论如何都需要删除队列,所以对于独占队列进行镜像(或者对于该问题持久)是没有用的。

    因此,独占队列从不镜像(即使它们符合表明它们应该是的策略)。 他们也永远不会持久(即使这样宣称)。

    从您的错误消息:

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

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

    链接地址: http://www.djcxy.com/p/34169.html

    上一篇: How to configure RabbitMQ using Active/Passive High Availability architecture

    下一篇: Parallel consumption of messages on different queues +rabbitmq+nodejs