我正在尝试设置RabbitMQ服务器集群,以使用主动/被动服务器架构获得高可用性队列。我正在遵循这些指南:
我对高可用性的要求很简单,我有两个节点(CentOS 6.4)与RabbitMQ(v3.2)和Erlang R15B03。 Node1必须是“活动”,响应所有请求,Node2必须是“被动”节点,其中包含所有队列和消息(从Node1)复制。
为此,我配置了以下内容:
接下来我做的是在两个节点之间创建一个集群:将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无法响应?这个设置有什么问题吗?
答案 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 队列及其内容只驻留在一个节点上,从而丢失了一个节点 节点将使其队列不可用。