Redis如何处理集群网络分区_理解少数派网络孤岛由于无法获得选票而停止写入的保护机制

星敏君_4200

星敏君_4200

2026-03-30

573人浏览

原创

redis cluster少数派分区自动拒绝写入是因默认启用cluster-require-full-coverage yes,要求节点必须属于多数派且槽位全覆盖才允许写入,否则返回clusterdown错误。

redis如何处理集群网络分区_理解少数派网络孤岛由于无法获得选票而停止写入的保护机制

少数派分区为什么自动拒绝写入

Redis Cluster 默认会在网络分区后,让节点数不足多数派(N/2 + 1)的分区停止写入——这不是 bug,而是通过 cluster-require-full-coverage 配置触发的保护机制。它的核心逻辑是:**只有能确认自己属于多数派、且集群槽位覆盖完整时,才允许写入**。否则返回 CLUSTERDOWN 错误。

  • 比如 6 节点集群(3 主 3 从),多数派是 4 节点;若分区成 3+3,则两边都达不到 4,全部拒绝写入
  • 若配置为 cluster-require-full-coverage no,少数派节点可能继续接受写入,但会立刻埋下脑裂隐患
  • 该行为不依赖哨兵,是 Cluster 内置的 Gossip 共识判断结果,由每个节点本地决策

cluster-require-full-coverage 的真实影响场景

这个配置看似只是“是否检查槽覆盖”,实际决定了分区后系统是「保一致性」还是「保可用性」。它不是开关式功能,而是一道写入闸门:

  • 设为 yes(默认):任意节点发现集群有槽处于 FAIL 状态(如原主失联且无从可升),所有写请求立即失败,客户端收到 (error) CLUSTERDOWN Hash slot not served
  • 设为 no:节点即使知道部分槽不可用,仍尝试服务自己负责的槽;但若该槽的主节点在少数派中,且没有从节点可接管,写入数据将无法被复制,恢复后大概率丢失
  • 注意:它不影响读请求,只限制写;也不影响故障转移本身,只约束写入许可

为什么少数派节点“没票”就不能自己升主

因为 Redis Cluster 的故障转移不是单点决策,而是基于多数派共识的类 Raft 投票过程。一个节点能否晋升为主节点,取决于它能否从**至少 N/2 + 1 个主节点**那里拿到投票响应——这要求它必须能与足够多的其他主节点通信。

如此AI员工
如此AI员工

一款AI办公效率工具,主要用于国内首个全链路营销获客AI Agent,适合需要提升相关任务效率的用户。

下载
  • 分区后,A、B 两个主节点彼此可达,但和 C、D、E 失联 → 它们最多只能互相投票,凑不够 3 票(5 主集群需 3 票)
  • 它们发出去的 FAILOVER_AUTH_REQUEST 消息石沉大海,超时后放弃选举
  • 此时 A、B 仍运行着,但状态卡在 PFAIL,不会主动降级,也不会升级;客户端连过去,发现槽位没主,就报错
  • 关键点:不是它们“不想升”,而是协议根本不允许它们在未获法定票数时变更角色

容易被忽略的配置组合陷阱

单独调 cluster-require-full-coverage 不够,真正决定少数派行为的是它和 cluster-node-timeout、min-replicas-to-write 的配合效果:

  • cluster-node-timeout 15000(默认)太短 → 瞬时抖动就触发 PFAIL,增加误判;建议生产环境调至 30000 或更高
  • min-replicas-to-write 1 + min-replicas-max-lag 10 可让主节点在从节点延迟过大或断连时主动拒写,与集群层面的多数派保护形成双保险
  • 但若同时开启 cluster-allow-writes-on-stable-cluster yes(非默认),会绕过多数派检查——这个隐藏配置极少文档提及,却可能让少数派“偷偷写入”,务必禁用

最危险的情况不是节点宕机,而是网络分区后你没意识到某些节点已变成“静默写入孤岛”——它们不报错、不告警,只安静地积累不一致数据,等恢复时才爆发。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

少数派

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

2023.11.27

1955

6

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

969

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2880

5

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

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

2023.11.02

4489

19

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

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

2023.11.14

4015

11

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

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

2024.04.02

7432

6

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

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

2024.04.07

643

6

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

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

2024.04.07

756

6

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

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

2024.04.07

7302

6

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习