Redis哨兵集群选举投票过程_查看哨兵日志中VoteFor信息了解共识过程

P粉602998670

P粉602998670

2026-05-15

958人浏览

原创

哨兵选举leader时,每个哨兵先自荐投票给自己,再向其他哨兵拉票,仅当收到≥(quorum/2)+1票且满足epoch未投过、runid合法、主节点仍客观下线时才胜出。

redis哨兵集群选举投票过程_查看哨兵日志中votefor信息了解共识过程

哨兵选举 leader 时怎么判断谁该投给谁

哨兵节点在确认主节点 客观下线 后,会进入 leader 选举阶段。这个阶段不是随机选,而是基于一套明确的投票规则:每个哨兵只投一票,且必须投给它认为“最适合作为故障转移执行者”的那个哨兵。

关键逻辑是:先自荐,再拉票,得票过半即胜出。具体表现为:

  • 每个哨兵在发现主节点客观下线后,立即给自己投一票(sentinel vote-for-sentinel 日志里会出现 VoteFor self
  • 接着向其他哨兵发 SENTINEL is-master-down-by-addr 命令请求投票,附带自己的 epoch(纪元编号)和目标主节点信息
  • 其他哨兵收到请求后,仅在满足以下全部条件时才返回 1(表示同意投票):
    • 该哨兵尚未对当前 epoch 投过票
    • 请求中的 runid 是它认可的合法哨兵 ID(即出现在 sentinel known-sentinel 列表中)
    • 请求中的主节点状态仍为客观下线
  • 一旦某个哨兵累计收到 ≥ (quorum / 2) + 1 票(默认 quorum 是哨兵总数),就成为 leader

如何从日志里定位 VoteFor 行为

哨兵日志(默认 /var/log/redis/sentinel.log 或启动时指定的 logfile)是观察选举过程最直接的窗口。重点关注含 VoteFor 的行,它们代表哨兵已做出投票决定。

典型日志片段示例:

# 哨兵 172.16.0.10:26379 认为自己该当 leader
12345:S 14 Apr 09:21:03.102 * Increased monitor epoch for master mymaster to 12
12345:S 14 Apr 09:21:03.103 * Voting for 172.16.0.10:26379 as leader for epoch 12
<h1>哨兵 172.16.0.11:26379 收到请求,投出一票</h1><p>12346:S 14 Apr 09:21:03.105 * Vote granted to 172.16.0.10:26379 in epoch 12</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2199" title="Redis 8.2.3"><img
														src="https://img.php.cn/upload/manual/001/589/237/69f31fe8b56d4731.png" alt="Redis 8.2.3" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/gongju/2199" title="Redis 8.2.3" class="overflowclass">Redis 8.2.3</a>
													<p class="overflowclass">Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。</p>
												</div>
												<a rel="nofollow" href="/xiazai/gongju/2199" title="Redis 8.2.3" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><h1>哨兵 172.16.0.12:26379 拒绝重复投票(已投过)</h1><p>12347:S 14 Apr 09:21:03.107 * Refused to vote for 172.16.0.10:26379 in epoch 12, already voted in this epoch</p>

注意:Voting for 表示主动发起投票;Vote granted to 表示被动响应并授票;Refused to vote 表示拒绝——这三类日志必须成对/成组出现,才能说明共识正在形成。

为什么有时看不到 VoteFor 日志

不是所有哨兵都会打出 VoteFor,常见原因有:

  • quorum 配置太小(如设为 1),导致第一个自荐的哨兵立刻满足条件,后续节点还没来得及记录投票动作就结束了
  • 网络延迟高或丢包,部分 is-master-down-by-addr 请求未送达,某些哨兵始终没收到拉票请求
  • 哨兵进程启动顺序混乱,部分哨兵尚未完成相互发现(即 sentinel known-sentinel 列表为空),无法验证对方合法性,直接忽略投票请求
  • 日志级别不够,默认 loglevel notice 可能过滤掉部分细节;需临时设为 debug 并重启哨兵(生产环境慎用)

选举失败时日志里有什么特征

如果选举卡住或失败,日志不会静默,而是反复出现超时与重试信号:

  • 持续打印 Failed to send SENTINEL is-master-down-by-addr to ... —— 网络不通或目标哨兵宕机
  • 频繁出现 Waiting for votes from other sentinels, still need X more —— 得票不足,但还在等
  • 一段时间后出现 Failover aborted by sentinel ... no enough votes —— 明确宣告本轮选举失败,将等待下一轮
  • 若多个哨兵同时打出 Voting for <self></self> 但无人获得足够票数,可能陷入“活锁”,此时需检查 quorum 是否设置合理、哨兵间时间是否同步(NTP)、防火墙是否放行 26379 端口

真正难排查的不是选举失败本身,而是“看似成功却无后续动作”——比如 leader 选出后没触发故障转移。这时候要顺着 leader 的日志往下翻,重点看 selecting a suitable slavefailover started 是否出现,否则问题不在投票,而在从节点筛选或配置校验环节。

相关文章

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

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

下载

相关标签:

redis

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

相关专题

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

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

2023.11.02

1884

19

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

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

2023.11.14

1558

11

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

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

2024.04.02

2403

6

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

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

2024.04.07

518

6

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

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

2024.04.07

524

6

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

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

2024.04.07

2405

6

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

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

2024.04.07

914

6

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

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

2024.04.07

687

6

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

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

2024.04.07

2307

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 9万人学习