RabbitMQ群集需要至少有一个光盘节点(您不能将最后一个光盘节点转换为ram节点)。
然而(特别是在云环境中)节点可能会死 - 如果唯一的磁盘节点死亡,应该发生在群集上的什么?
群集是自动指定新的光盘节点,还是继续使用无光盘节点。
答案 0 :(得分:6)
简短回答:如果所有磁盘节点都死了并且您至少有一个RAM节点,那么您将获得仅限RAM的群集。如果只剩下一个RAM节点并且它向下然后向上,则只有持久实体驻留在它上面。
答案很长:
如果您使用Clustering Guide中描述的群集,则队列只驻留在一个节点上:
RabbitMQ代理操作所需的所有数据/状态是 在所有节点上进行复制,以实现可靠性和扩展性 ACID属性。 一个例外是消息队列,其中包括 默认驻留在创建它们的节点上,尽管它们是可见的 并且可以从所有节点访问。在一个节点中跨节点复制队列 群集,请参阅有关高可用性的文档(请注意您 首先需要一个工作集群。
因此,当节点死亡时(不仅是光盘1,它也应用于RAM),您丢失队列(带有内容)驻留在该节点上。
如果您使用High Availability镜像跨多个节点的队列(实际上,这取决于您的设置方式,请参阅ha-mode
和ha-policy
政策密钥的详细说明 - {{ 1}},all
和exactly
)。
使用HA,如果队列有一些ha策略集并且它所驻留的节点死亡,那么该队列将被尝试镜像到其他节点,包括仅有一个节点(当然,这取决于你如何设置{{1例如,如果它设置为nodes
并且列表中的所有节点都会丢失,则会丢失队列。
所以在这样的介绍之后,
如果您关闭所有光盘节点并且只有RAM节点并且队列适合内存,则一切都将正常工作。如果队列不适合内存,则会应用Flow Control内存限制,这在Restarting section中的群集文档中进行了解释(在e:
的末尾)应始终运行至少一个磁盘节点以防止数据 失利。 RabbitMQ将阻止在许多中创建仅限RAM的集群 情况,但它仍然不会阻止你停止和强制 重置所有光盘节点,这将导致仅限RAM的群集。 这样做是不可取的,这使得丢失数据非常容易。
以及来自clustering doc的更多内容:
节点可以是磁盘节点或RAM节点。 (注意:磁盘和磁盘都是 可互换使用。通常配置语法或状态消息 使用光盘。) RAM节点仅将其状态保存在内存中(使用 队列内容的异常,如果队列是,则可以驻留在磁盘上 持续的或太大而不适合记忆)。磁盘节点保持状态 内存和磁盘。由于RAM节点不必像磁盘一样写入磁盘 作为磁盘节点,它们可以表现得更好。但是,请注意,因为 队列数据总是存储在光盘上,性能会有所改善 仅影响资源管理(例如添加/删除队列, 交换,或vhosts),但不发布或消耗速度。因为 在群集中的所有节点上复制状态,这就足够了 (但不推荐)在集群中只有一个磁盘节点 安全地存储集群的状态。
因此,如果您没有真正添加任何光盘节点,您将获得仅限RAM的群集。在某些情况下它可能很快,但如果所有节点都关闭,您将永远丢失所有队列,其中包含永久内容,除了持久节点,而任何节点都会在盘上转储持久队列和消息。
但是不要依赖RAM节点转储光盘上的持久性实体,而在某些情况下它可能根本不会转储或不转储所有实体(尤其是消息)。
有旧的邮件列表主题可能会为情况带来一些额外的亮点: