1177 字
6 分钟
Redis 集群会出现脑裂问题吗?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?本文
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

会。Redis 主从架构配合哨兵机制时,可能出现脑裂问题(Split-Brain)。 核心原因是网络分区,导致不同节点对当前主节点的状态产生了不同认知。

这道题重点考察:脑裂是怎么发生的、为什么会丢数据、怎么解决。

一、什么是 Redis 脑裂?#

简单理解:原来的主节点没有真正宕机,只是与其他节点失去了网络连接,结果系统又选出了一个新主节点,出现了两个主节点。

假设 Redis 有三个角色:

  • Master A:原来的主节点
  • Slave B:从节点
  • Sentinel:哨兵节点

正常情况下:

2

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

此时可能发生:

3

这就是脑裂:一段时间内,两个节点都认为自己可以承担主节点的角色。

注意:严格来说,哨兵并没有把旧主节点正式设置为新主节点;旧主节点只是因为网络隔离,还在以原主节点身份工作。

二、脑裂为什么会导致数据丢失?#

这是面试最关键的部分。

假设发生以下过程:

  1. 网络分区,Master A 与哨兵、Slave B 失联。
  2. 哨兵判定 Master A 客观下线,将 Slave B 提升为新主节点。
  3. 部分客户端仍连接着 Master A,并成功写入数据 name = Tom。
  4. 网络恢复后,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 1
min-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,要求主节点必须有足够数量、复制延迟符合要求的从节点才能接受写入,从而降低脑裂风险。但这种方案不能保证数据绝对不丢失。

记忆重点:网络分区 → 两个主节点 → 旧主节点写入 → 恢复同步 → 旧数据可能丢失。

Redis 集群会出现脑裂问题吗?
https://blog.xqcherry.top/posts/interview/redis/redis-split-brain/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0