为什么Redis哨兵集群在网络分区时会出现脑裂问题?

老丽姑娘_9194

老丽姑娘_9194

2026-11-13

187人浏览

原创

quorum设为1时网络分区必然触发双主;因任意哨兵可单独判定主观下线并发起故障转移,分区后两边各自选举新主,导致数据分裂与丢失。

为什么redis哨兵集群在网络分区时会出现脑裂问题?

因为哨兵的投票机制在分区后仍能各自达成“多数共识”,而 Redis 主节点又不会主动退出写状态——网络一断,两个“合法主”就自然诞生了。

quorum 配置让每个分区都能独立触发故障转移

哨兵判断主节点下线需要满足 quorum(仲裁数),这个值默认是哨兵总数的一半向上取整。比如 3 个哨兵,quorum=2;但一旦网络分区把哨兵拆成 2+1,2 个哨兵所在的分区只要能互相通信、又连不上主节点,就立刻满足 quorum 条件,直接走完客观下线 → 选举新主流程。

此时另一个分区里那个“被隔离但活着”的主节点,完全不知道自己已被放弃,继续响应客户端写请求——双主已成事实。

常见错误现象:

  • 监控看到两个节点都返回 role:master
  • 客户端日志里交替出现 READONLY You can't write against a read only replica 和正常写入
  • 哨兵日志中同时存在 +sdown 和 +odown 记录,但发生在不同时间戳段

min-slaves-to-write=0 或过小会放大脑裂危害

这个配置控制主节点是否允许写入,但它只检查“本地连接的从节点数量”,不验证这些从节点是否还能跟哨兵或其他节点通信。当网络分区发生时:

  • 如果设为 min-slaves-to-write 0,旧主节点毫无约束,照常写入
  • 如果设为 min-slaves-to-write 1,只要它还能连上一个同分区的从节点(哪怕该从节点也已失联于多数派),就认为满足条件

结果就是:脑裂不仅发生,还带上了“合法写权限”。等网络恢复,旧主降级同步时,它在分区期间写的全部数据都会被清空——不是宕机丢数据,是被自己“合规地”删掉的。

down-after-milliseconds 设置太短会误判“假死”

这个参数定义哨兵多久没收到主节点心跳就标记为主观下线。生产环境若设成 down-after-milliseconds 3000,而跨机房链路平均 RTT 是 2800ms、偶尔抖动到 3500ms,就会频繁触发误判。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载

尤其在高负载场景下:

  • CPU 满载导致 Redis 无法及时处理 PING 回复
  • 大 key 删除或 KEYS * 类慢查询阻塞主线程,心跳延迟突增
  • 哨兵本身部署在同一台宿主机上,受相同资源瓶颈影响

这些都不是真故障,但足够让哨兵集群在几秒内完成一次完整故障转移——而原主节点可能 2 秒后就恢复响应,此时双主已并存。

哨兵节点数为偶数时投票更容易分裂

3 个哨兵,quorum=2,分区成 2+1,只有 2 那边能投票;但如果是 4 个哨兵,quorum=3,一旦分区成 2+2,两边都达不到 quorum,看似安全——可现实更危险:任意一边只要再挂掉 1 个,剩下那个分区的 2 个哨兵就刚好卡在 quorum-1 边缘,稍有延迟波动就集体翻车。

真正稳定的最小部署是 3 个哨兵(奇数),且必须跨物理区域部署:比如 A 机房 2 个、B 机房 1 个,避免单点网络中断直接干掉多数派。

最容易被忽略的一点:哨兵的 quorum 是按“存活且能互相通信的哨兵数”动态计算的,不是静态配置值。你改了配置文件却没重启哨兵进程,或者某哨兵因 OOM 被系统 kill 后未自动拉起,实际运行中的 quorum 可能早已失效。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4949

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4515

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

8772

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

683

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

9122

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1200

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1456

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7778

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero官方文档
Go-Zero官方文档

共0课时 | 0人学习