【问题标题】:Losing mirrored queues丢失镜像队列
【发布时间】:2015-06-18 05:13:48
【问题描述】:

具有镜像所有HA policies defined 的 3 个节点的 RabbitMQ 集群。集群发生故障并划分为独立节点。集群已修复,但由于故障,一些队列丢失了。即使镜像所有队列的 HA 策略已经到位,这是否可能发生?

【问题讨论】:

  • 有几个问题需要澄清。队列是否持久?您是否丢失了消息或整个队列定义?您有 cluster_partition_handling 设置还是使用默认的 ignore?你有内存节点还是只有磁盘节点?如果您在创建队列时、集群期间或之前丢失了队列?
  • 另一个问题导致了这种行为。仍然非常有价值的信息,谢谢。

标签: rabbitmq


【解决方案1】:

简而言之,是的,但很高兴了解您的具体情况。

来自https://www.rabbitmq.com/partitions.html

网络分区期间

当网络分区到位时,网络的两个(或更多!)边 集群可以独立发展,双方考虑对方 已经坠毁。可以创建或删除队列、绑定、交换 分别地。跨分区拆分的镜像队列将 最终在分区的每一侧都有一个主控,同样两个 双方独立行动。

一些示例场景:

如果在网络分区期间创建了队列,则在修复集群时,无法保证它们会被保留。失败的分区将丢弃其状态并从获胜的分区中恢复。

如果您重新启动了具有队列定义唯一副本的 ram 节点,那么它们将丢失。由于这个原因,rabbitmq 文档建议不要使用 ram 节点。

我强烈推荐 rabbitmq 文档,它非常广泛且非常精确。

【讨论】:

  • 这被称为“脑裂”,集群最糟糕的情况;-( 高级集群系统,如 Zookeeper、Elasticsearch 添加“master quorum”概念来避免它。您可以监控所有 rabbitmq 节点检查最终的脑裂(通过使用 API)。