RabbitMQ – 群集节点失败后意外的空的​​和未同步的队列

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

  • 在两台服务器(例如Alpha和Bravo)上下载并安装ERLANG和RABBITMQ,
  • 安装pipe理插件,设置自定义的tcp_listener端口(增加安全性),并添加自定义的pipe理员login,而不是默认的访客:来宾login
  • 在两台机器上设置相同的cookie(在C:\ Windows \和C:\ Users \用户名)
  • 安装RabbitMQ作为Windows服务
  • 将Bravo节点joinAlpha节点进行集群
  • 添加策略来镜像所有队列(Pattern =“”,Definition =“ha-mode:all”)
  • 我创build了持久的镜像队列并向其发布消息 – 它在两个节点之间同步(它可以正常工作)

但后来我试图testing如果closures一个节点会发生什么:

  • 我closures节点布拉沃
  • 我添加消息到Alpha节点
  • 我在节点布拉沃回头
  • 丢失的消息已同步到Bravo节点,但在pipe理控制台中,此节点被标记为“未同步”

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

  • 我closures节点布拉沃
  • 我添加消息到Alpha节点
  • 我在Bravo节点上回头,等待消息同步
  • 我closures了Alpha节点
  • 我给Bravo节点添加了消息
  • 我重新打开Alpha节点
  • 队列中所有添加的消息神奇消失

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

还有第三个testing用例:

  • 我已经closuresAlpha节点,将消息添加到Bravo并closuresBravo节点
  • 然后我打开Alpha节点,并收到消息“timeout_waiting_for_tables”。 我尝试了更多次。 它开始工作,只有当我也转身Alpha节点

也许我只是没有得到如何在RabbitMQ集群工作。 任何人都可以帮助我,并告诉发生了什么事?

同样的问题,但有一点理解,以及可能的陷阱。

首先,我被这个事实愚弄了,我没有把我的虚拟主机传给命令:

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

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

在此之后,当我login到Web控制台时,我看到节点字段正在报告两个节点…现在。 伟大的:-)

但是,如果你上下拿一个,那么上下一个,队列消失! 这是因为在镜像中没有“同步”,只有“堆栈”。 这意味着如果您closures一个节点,其余的消息将从其余节点(或节点)提供。 如果您启动了新的/现有的节点,它将只反映添加的NEW消息。

我相当新,所以我会假设有3个节点会比两个好得多。 这意味着如果一个节点出现故障,仍然会有另外两个节点的复位(这取决于您的业务情况是正确的)。 当然,如果两个节点都closures了,那么对于队列中剩下的任何东西都会丢失复制。 我认为这应该被称为“三击”设置!