RabbitMQ-集群节点故障后出现意外的空队列和不同步的队列

RabbitMQ-集群节点故障后出现意外的空队列和不同步的队列

我已经在 Windows 上的集群中下载并安装了 RabbitMQ:

  • 在两台服务器(例如 Alpha 和 Bravo)上下载并安装 ERLANG 和 RABBITMQ
  • 安装管理插件,设置自定义 tcp_listener 端口(以提高安全性)并添加自定义管理员登录而不是默认的 guest:guest 登录
  • 在两台机器上设置相同的 cookie(在文件夹 C:\Windows\ 和 C:\Users\username 中)
  • 将 RabbitMQ 安装为 Windows 服务
  • 将 Bravo 节点加入 Alpha 节点并加入集群
  • 添加了镜像所有队列的策略(Pattern="", Definition="ha-mode: all")
  • 我创建了持久镜像队列并向其发布消息 - 它在两个节点之间同步(它按我预期的那样正常工作)

但后来我尝试测试如果关闭一个节点会发生什么:

  • 我关闭了 Bravo 节点
  • 我向 Alpha 节点添加了消息
  • 我回到了 Bravo 节点
  • 缺失消息已同步至 Bravo 节点,但在管理控制台中,此节点被标记为“未同步”

这个队列有什么问题?但还有其他问题。例如:

  • 我关闭了 Bravo 节点
  • 我向 Alpha 节点添加了消息
  • 我重新打开 Bravo 节点并等待同步消息
  • 我关闭了 Alpha 节点
  • 我已将消息添加到 Bravo 节点
  • 我重新开启了 Alpha 节点
  • 队列中添加的所有消息都神奇地消失了

这真是太奇怪了。有人知道发生了什么吗?

另外还有第三个测试用例:

  • 我已关闭 Alpha 节点,向 Bravo 添加消息,并关闭 Bravo 节点
  • 然后我打开了 Alpha 节点,收到了消息“timeout_waiting_for_tables”。我试了好几次。只有当我重新打开 Alpha 节点时,它才开始工作

也许我只是不明白 RabbitMQ 中的集群是如何工作的。有人能帮我告诉我发生了什么吗?

答案1

同样的问题,但需要做一些了解,并且可能存在陷阱。

首先,我被没有将我的 vhost 传递给命令这一事实所欺骗:

rabbitmqctl set_policy -p myvhost HA '*' '{"ha-mode": "all"}'

否则虚拟主机默认为“/”

此后,当我登录到 Web 控制台时,我看到节点字段正在报告两个节点……现在。太棒了 :-)

但是,如果您将一个节点启动和关闭,然后又将另一个节点启动和关闭,队列就会消失!?这是因为镜像中没有“同步”,只有“堆叠”。这意味着如果您关闭一个节点,其余消息将由剩余节点(或多个节点)提供。如果您启动新的/现有的节点,它将仅镜像添加的新消息。

我对此还不太熟悉,所以我认为 3 个节点比 2 个节点要好得多。这意味着如果一个节点发生故障,其他两个节点仍然具有弹性(取决于您的业务情况)。当然,如果两个节点发生故障,您将失去队列中剩余内容的复制。我认为这应该称为“三振出局”!

相关内容