0

0

Redis怎样选举领头哨兵_基于Raft算法在哨兵集群中投票选出执行故障转移的Leader

P粉602998670

P粉602998670

发布时间:2026-03-10 20:53:03

|

109人浏览过

|

来源于php中文网

原创

redis哨兵不采用raft算法,而是基于quorum的轻量级投票机制实现领头哨兵选举,无日志复制、不维护状态机、epoch仅用于幂等判断,且每次故障转移均需重新投票。

redis怎样选举领头哨兵_基于raft算法在哨兵集群中投票选出执行故障转移的leader

Redis 哨兵(Sentinel)不使用 Raft 算法,它自己实现了一套基于多数派投票的领头哨兵选举机制——和 Raft 有相似目标(如强多数、防止脑裂),但细节完全不同。直接套用 Raft 概念去理解哨兵选主,反而容易误解行为。

为什么 Sentinel 不是 Raft

Sentinel 的选举逻辑更轻量、无日志复制、不维护状态机,也不要求严格有序的任期(epoch)推进。它的 currentEpochfailoverEpoch 是单调递增的整数,仅用于冲突消解和幂等判断,不构成 Raft 那样的“任期+日志匹配”双重校验。

常见错误现象:No failover in progress 或多个哨兵各自发起故障转移,本质是多数派未达成一致,不是 Raft 中的“选举超时重试”问题。

  • Raft 要求候选者先拉取最新日志再参选;Sentinel 完全不看主从复制偏移,只比对主观下线(sdown)和客观下线(odown)状态
  • Raft 投票响应必须包含自身日志信息;Sentinel 的 SENTINEL is-master-down-by-addr 响应只返回是否同意下线 + 当前 epoch,不携带数据一致性证据
  • Raft 一旦选出 Leader 就长期稳定;Sentinel 的领头哨兵只对单次故障转移有效,下次故障重新投票

实际选举流程:谁投给谁、什么时候停

选举触发于某个哨兵确认主节点为 odown(即足够多哨兵报告 sdown),随后它会自增 currentEpoch 并向其他哨兵发送 SENTINEL is-master-down-by-addr 请求,试图争取投票。

关键点在于“多数派”的计算方式:不是哨兵总数的 1/2+1,而是配置中 quorum 值(在 sentinel monitor 行指定)与在线哨兵数的较小值。例如:sentinel monitor mymaster 127.0.0.1 6379 3,但当前只有 4 个哨兵在线,则需至少 3 票才能通过 odown 判定;若只剩 2 个在线,quorum 自动降为 2,此时 2 票即满足。

Vozo
Vozo

Vozo是一款强大的AI视频编辑工具,可以帮助用户轻松重写、配音和编辑视频。

下载
  • 每个哨兵对同一 failoverEpoch 只投一票,且只投给第一个合法请求(防重复投票)
  • 发起者收到 >= quorum 张票后,立即开始执行故障转移,不再等待其余哨兵响应
  • 若超时未达票数,该轮选举失败,稍后可能由另一个哨兵重试(不保证同一轮重试)

容易踩的坑:quorum、down-after-milliseconds 和网络分区

最常被忽略的是 quorum 和哨兵实际在线数不匹配导致的“无法达成 odown”或“误判脑裂”。比如部署 5 个哨兵,quorum 设为 3,但因网络分区,某哨兵只能连通 2 个同组成员——它永远凑不够 3 票,也就永远不会触发故障转移,哪怕主库真挂了。

  • down-after-milliseconds 过短(如设为 1000)会导致网络抖动时频繁误报 sdown,引发无效投票风暴
  • 所有哨兵必须配置完全相同的 sentinel monitor 参数,否则对同一主库的 quorum 计算结果不一致,投票逻辑错乱
  • 哨兵之间依赖 TCP 心跳(默认每 2 秒发一次 PING),丢包率高或防火墙拦截 PING 会导致 sdown 误判,进而污染投票基础

怎么验证当前领头哨兵是谁

没有中心化命令直接查“当前 leader”,但可通过组合操作推断:任意哨兵执行 SENTINEL sentinels <master-name></master-name>,查看各哨兵上报的 flags 字段中是否有 is-head-sentinels(注意拼写,官方文档写错成 head-sentinel,实际返回是 is-head-sentinels);更可靠的方式是观察日志中类似 +failover-detected+failover-end 的事件归属哪个哨兵 ID。

示例:

SENTINEL sentinels mymaster
1) 1) "name"
   2) "127.0.0.1:26380"
   3) "flags"
   4) "slave,is-head-sentinels"  ← 这个哨兵当前是领头者(仅针对本次 failover)

注意:is-head-sentinels 不是永久身份,只是最近一次成功故障转移的执行者标识;它不会广播给其他哨兵,也不会持久化,重启后清空。

真正难处理的是跨机房部署时,quorum 设置和网络延迟的平衡——这地方没标准答案,得按你的可用性目标和分区容忍度反复调。

相关标签:

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

493

2023.08.14

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

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

1005

2023.11.02

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

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

671

2023.11.14

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

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

501

2024.04.02

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

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

413

2024.04.07

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

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

408

2024.04.07

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

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

481

2024.04.07

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

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

424

2024.04.07

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号