如果唯一的磁盘节点死亡,RabbitMQ集群会发生什么?

时间:2014-07-16 06:08:59

标签: rabbitmq amqp

RabbitMQ群集需要至少有一个光盘节点(您不能将最后一个光盘节点转换为ram节点)。

然而(特别是在云环境中)节点可能会死 - 如果唯一的磁盘节点死亡,应该发生在群集上的什么?

群集是自动指定新的光盘节点,还是继续使用无光盘节点。

1 个答案:

答案 0 :(得分:6)

简短回答:如果所有磁盘节点都死了并且您至少有一个RAM节点,那么您将获得仅限RAM的群集。如果只剩下一个RAM节点并且它向下然后向上,则只有持久实体驻留在它上面。

答案很长:

如果您使用Clustering Guide中描述的群集,则队列只驻留在一个节点上:

  

RabbitMQ代理操作所需的所有数据/状态是   在所有节点上进行复制,以实现可靠性和扩展性   ACID属性。 一个例外是消息队列,其中包括   默认驻留在创建它们的节点上,尽管它们是可见的   并且可以从所有节点访问。在一个节点中跨节点复制队列   群集,请参阅有关高可用性的文档(请注意您   首先需要一个工作集群。

因此,当节点死亡时(不仅是光盘1,它也应用于RAM),您丢失队列(带有内容)驻留在该节点上。

如果您使用High Availability镜像跨多个节点的队列(实际上,这取决于您的设置方式,请参阅ha-modeha-policy政策密钥的详细说明 - {{ 1}},allexactly)。

使用HA,如果队列有一些ha策略集并且它所驻留的节点死亡,那么该队列将被尝试镜像到其他节点,包括仅有一个节点(当然,这取决于你如何设置{{1例如,如果它设置为nodes并且列表中的所有节点都会丢失,则会丢失队列。

所以在这样的介绍之后,

如果您关闭所有光盘节点并且只有RAM节点并且队列适合内存,则一切都将正常工作。如果队列不适合内存,则会应用Flow Control内存限制,这在Restarting section中的群集文档中进行了解释(在e:

的末尾)
  

应始终运行至少一个磁盘节点以防止数据   失利。 RabbitMQ将阻止在许多中创建仅限RAM的集群   情况,但它仍然不会阻止你停止和强制   重置所有光盘节点,这将导致仅限RAM的群集。   这样做是不可取的,这使得丢失数据非常容易

以及来自clustering doc的更多内容:

  

节点可以是磁盘节点或RAM节点。 (注意:磁盘和磁盘都是   可互换使用。通常配置语法或状态消息   使用光盘。) RAM节点仅将其状态保存在内存中(使用   队列内容的异常,如果队列是,则可以驻留在磁盘上   持续的或太大而不适合记忆)。磁盘节点保持状态   内存和磁盘。由于RAM节点不必像磁盘一样写入磁盘   作为磁盘节点,它们可以表现得更好。但是,请注意,因为   队列数据总是存储在光盘上,性能会有所改善   仅影响资源管理(例如添加/删除队列,   交换,或vhosts),但不发布或消耗速度。因为   在群集中的所有节点上复制状态,这就足够了   (但不推荐)在集群中只有一个磁盘节点   安全地存储集群的状态。

因此,如果您没有真正添加任何光盘节点,您将获得仅限RAM的群集。在某些情况下它可能很快,但如果所有节点都关闭,您将永远丢失所有队列,其中包含永久内容,除了持久节点,而任何节点都会在盘上转储持久队列和消息。

但是不要依赖RAM节点转储光盘上的持久性实体,而在某些情况下它可能根本不会转储或不转储所有实体(尤其是消息)。

有旧的邮件列表主题可能会为情况带来一些额外的亮点: