Skip to main content

什么是RabbitMQ的脑裂?

作者:程序员马丁

在线博客:https://open8gu.com

note

大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。

回答话术

RabbitMQ 脑裂是一个在集群中常见的问题,它发生在网络分区期间,导致节点失去联系并独立操作。这会导致镜像队列位于不同分区节点上,可能产生消息丢失和一致性问题。

为了确保消息队列系统的稳定性和可靠性,需要适当配置以减轻脑裂问题的影响。

image.png

当发生网络分区时,集群中的节点会分为多个分区,每个分区都认为其他分区的节点已经宕机。这种情况称为脑裂。各个分区可以独立创建或删除队列、绑定和交换器。对于镜像队列,每个分区将有一个主节点,导致分区间的数据不一致。

要处理脑裂,RabbitMQ 提供了多种自动处理网络分区的方法,如 pause-minority、pause-if-all-down 和 autoheal。默认情况下是 ignore 模式,不进行处理

网络分区不仅由网络故障引起,还可能由节点挂起和恢复操作系统引发。这种类型的分区通常是不对称的,因为挂起的节点不一定会认为其他节点已经宕机。

在业务开发中使用 RabbitMQ 作为消息队列时,为了避免脑裂问题,除了选择合适的脑裂恢复策略外,还需要考虑持久化消息、生产者确认、消费者确认、监控和警报、优雅降级以及记录审计日志。这些措施有助于提高系统稳定性和可用性,减少对业务的不利影响。

问题详解

1. 检测网络分区

当出现脑裂时,首先在 RabbitMQ Admin 可以看到如图所示的网络分区提示。

image.png

要确认检测网络分区是否发生,我们可以使用各种方法,例如查看服务器日志、使用 HTTP API 进行监控或执行 CLI 命令。

比如使用以下命令检测:

rabbitmq-diagnostics cluster_status

正常情况下,上述命令应该返回一个没有分区的结果,可以看到 partitions 是空的。如下:

Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
{running_nodes,[rabbit@node1,rabbit@node2]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]}]

解锁付费内容,👉 戳