会。Redis 主从架构配合哨兵机制时,可能出现脑裂问题(Split-Brain)。 核心原因是网络分区,导致不同节点对当前主节点的状态产生了不同认知。
这道题重点考察:脑裂是怎么发生的、为什么会丢数据、怎么解决。
一、什么是 Redis 脑裂?
简单理解:原来的主节点没有真正宕机,只是与其他节点失去了网络连接,结果系统又选出了一个新主节点,出现了两个主节点。
假设 Redis 有三个角色:
- Master A:原来的主节点
- Slave B:从节点
- Sentinel:哨兵节点
正常情况下:

假设发生网络分区,Master A 与哨兵、Slave B 之间的网络中断了,但 Master A 自己仍然可以接收客户端请求。
此时可能发生:

这就是脑裂:一段时间内,两个节点都认为自己可以承担主节点的角色。
注意:严格来说,哨兵并没有把旧主节点正式设置为新主节点;旧主节点只是因为网络隔离,还在以原主节点身份工作。
二、脑裂为什么会导致数据丢失?
这是面试最关键的部分。
假设发生以下过程:
- 网络分区,Master A 与哨兵、Slave B 失联。
- 哨兵判定 Master A 客观下线,将 Slave B 提升为新主节点。
- 部分客户端仍连接着 Master A,并成功写入数据
name = Tom。 - 网络恢复后,Master A 发现新的主节点已经是 B,于是转为 B 的从节点,重新同步数据。
问题来了:Master A 上的 name = Tom 怎么办?
重新同步时,旧主节点可能丢弃自己独有的写入,改为复制新主节点的数据。因此,客户端之前收到成功响应的写入,也可能最终丢失。
这就是脑裂最危险的地方:客户端认为写入成功了,但数据最终没有保留下来。
三、如何解决 Redis 脑裂问题?
| 配置 | 含义 | 例子 |
|---|---|---|
min-replicas-to-write 1 | 主节点至少需要 1 个合格的从节点才能写入 | 一个都没有,就拒绝写入 |
min-replicas-max-lag 10 | 从节点的复制响应延迟不能超过 10 秒 | 超过阈值,就不算合格副本 |
常见的措施有两项。
1. 配置 min-replicas-to-write
要求主节点至少有指定数量的健康从节点,才能接受写入。
例如:
min-replicas-to-write 1min-replicas-max-lag 10含义是:
min-replicas-to-write 1:至少有一个满足条件的从节点,主节点才允许写入。min-replicas-max-lag 10:从节点与主节点的复制延迟检测条件,单位为秒;超过该阈值的从节点不计入有效副本数量。
如果旧主节点与所有从节点断开连接,且没有符合条件的副本,它就会拒绝新的写入,从而降低脑裂造成数据丢失的风险。
但它不能保证绝对不丢数据,因为它检查的是符合条件的副本数量和复制延迟,并不意味着每次写入都已经复制并持久化到从节点。
2. 配置 min-replicas-max-lag
这个参数通常与前一个参数配合使用,用来限制从节点的复制延迟。
如果从节点长时间没有及时响应复制进度,就不再被视为健康副本,主节点可能因此停止接受写请求。
它主要用于降低主节点与从节点长期失联时继续写入的风险。
四、面试时怎么回答?
Redis 在主从架构配合哨兵机制时可能发生脑裂。
脑裂通常是由于网络分区导致的:原主节点与哨兵和从节点失去联系,但它本身仍然可以接收部分客户端的写请求。与此同时,哨兵将从节点提升为新的主节点,于是短时间内出现两个都能接受写入的主节点。
网络恢复后,旧主节点会重新加入新的主从架构,并同步新主节点的数据。旧主节点上独有的写入可能被覆盖,导致客户端已经收到成功响应的数据最终丢失。
解决方面,可以配置 min-replicas-to-write 和 min-replicas-max-lag,要求主节点必须有足够数量、复制延迟符合要求的从节点才能接受写入,从而降低脑裂风险。但这种方案不能保证数据绝对不丢失。
记忆重点:网络分区 → 两个主节点 → 旧主节点写入 → 恢复同步 → 旧数据可能丢失。