基于Raft分布式Kv存储:RequestVote
整体流程收到 RequestVote → 加锁 → 请求任期是否过期 → 请求任期是否更新 → Candidate 日志是否足够新 → 本任期是否已经投给别人 → 记录投票 → 重置选举计时器 → 持久化并返回一、整个处理过程加锁std::lock_guard lg(m_mtx);RequestVote 会读写m_currentTerm m_status m_votedFor m_logs m_lastResetElectionTime必须在同一个临界区内完成否则两个 Candidate 的请求并发到达时可能都看到m_votedFor -1然后节点在同一任期投出两票。持锁还能保证日志新旧检查和实际投票之间日志状态不会发生变化。二、DEFER persist()的作用源码紧接着注册DEFER { persist(); };因此无论从哪个分支return最后都会执行持久化。需要持久化的核心状态是currentTerm votedFor假设节点给 Candidate A 投票后立即宕机如果没有持久化重启后可能忘记这张票又在同一任期投给 Candidate B。按照这段代码的构造顺序延迟对象会在lock_guard之前析构所以设计意图是先持久化再释放互斥锁。三、请求任期小于本地任期if (args-term() m_currentTerm) { reply-set_term(m_currentTerm); reply-set_votestate(Expire); reply-set_votegranted(false); return; }例如Candidate 任期7 本节点任期 9这说明请求可能来自网络中延迟的旧消息必须拒绝voteGranted false reply.term 9Candidate 收到响应后会发现自己任期落后并切换成 Follower。注意这里不会重置选举计时器。过期 Candidate 不应该通过不断发送旧请求阻止本节点正常超时选举。四、 请求任期大于本地任期if (args-term() m_currentTerm) { m_status Follower; m_currentTerm args-term(); m_votedFor -1; }例如Candidate 任期10 本节点任期 8本节点必须执行“三变”角色变成 Follower 任期更新为 10 清空旧任期的投票记录Raft 规定任何 RPC 请求或响应中发现更高任期都必须更新本地任期并转成 Follower。但是更新到第 10 任期不意味着一定投票。接下来还要检查 Candidate 的日志。五、 为什么要断言任期相等完成前面的判断后理论上只有args-term() m_currentTerm所以源码执行myAssert(args-term() m_currentTerm, ...);此后的判断都发生在同一任期内不再讨论任期新旧只讨论Candidate 的日志是否够新 本节点是否已经投票六、UpToDate()如何比较日志源码调用UpToDate(args-lastlogindex(), args-lastlogterm());其核心逻辑是return candidateLastTerm localLastTerm || (candidateLastTerm localLastTerm candidateLastIndex localLastIndex);也就是把日志新旧表示成二元组(lastLogTerm, lastLogIndex)进行字典序比较先比较任期再比较索引。例如本节点最后日志是本节点(term6, index20)不同 Candidate 的结果Candidate A(5, 100) 拒绝最后任期更旧 Candidate B(6, 19) 拒绝同任期但索引更小 Candidate C(6, 20) 接受完全一样新 Candidate D(6, 25) 接受同任期但日志更长 Candidate E(7, 10) 接受最后任期更新即使 E 的索引只有 10只要最后日志任期是 7也比(6,20)更新。Raft 使用这个选举限制避免缺少已提交日志的节点当选 Leader。七、快照如何参与日志比较UpToDate()通过getLastLogIndexAndTerm()获取本地日志末尾。如果m_logs非空取 m_logs 最后一项的 index 和 term如果日志已经被快照压缩m_logs为空取 m_lastSnapshotIncludeIndex 取 m_lastSnapshotIncludeTerm这非常重要。生成快照不代表节点忘记了已压缩日志的历史位置否则一个日志很旧的 Candidate 可能因为本节点m_logs为空而错误获得选票。八、 日志不够新时拒绝if (!UpToDate(...)) { reply-set_term(m_currentTerm); reply-set_votegranted(false); return; }即使 Candidate 的任期更高只要日志不够新本节点仍然拒绝投票。例如本节点currentTerm8lastLog(term7,index20) 请求方term9lastLog(term6,index100)处理过程是本节点更新到任期9并变成 Follower 清空 votedFor 但因为请求方日志更旧拒绝投票这里也不重置选举计时器。日志过旧的 Candidate 不应该通过不断请求让拥有更新日志的节点无法发起选举。九、已经投给其他节点时拒绝if (m_votedFor ! -1 m_votedFor ! args-candidateid()) { reply-set_votegranted(false); return; }只有两种情况可以投票m_votedFor -1 本任期还没有投票 m_votedFor candidateId 之前已经投给同一个 Candidate如果已经投给另一个 Candidate就必须拒绝。这保证一个节点在一个任期内最多投给一个 Candidate。十、 为什么允许重复投给同一个 Candidate假设节点 B 投给了 Candidate A B 的响应在网络中丢失 A 重新发送同一个 RequestVote此时m_votedFor args-candidateid()B 应该再次返回voteGrantedtrue。这不是第二张票而是同一个投票决定的幂等重放。否则响应丢失就可能让 Candidate 永远无法知道自己已经获得这张票

相关新闻

云原生进入“泛在化”时代——2026年开发者必须关注的三个变化~YH

云原生进入“泛在化”时代——2026年开发者必须关注的三个变化~YH

云原生已经不是新概念。但2026年的云原生,和五年前的云原生,完全是两回事。变化一:从“上云”到“无处不在”2026年,云原生进入“泛在化”与“成本精细化”时代——混合云和边缘云的普及是这一趋势的核心驱动力。过去,…

2026/7/29 16:46:05 阅读更多 →
Awoo Installer终极指南:3分钟快速安装Switch游戏的免费利器

Awoo Installer终极指南:3分钟快速安装Switch游戏的免费利器

Awoo Installer终极指南:3分钟快速安装Switch游戏的免费利器 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 你是否曾经花费数小时下载…

2026/7/29 16:46:05 阅读更多 →
全球无张力烘干机市场持续扩容:预计2032年市场规模将达1.55亿美元,年复合增长率4.0%

全球无张力烘干机市场持续扩容:预计2032年市场规模将达1.55亿美元,年复合增长率4.0%

无张力烘干机是纺织后整理核心工艺设备,主打低张力、无张力面料烘干加工,是高端纺织染整生产线的关键配套装备。据QYResearch权威统计及预测数据,2025年全球无张力烘干机市场销售额已达1.10亿美元,行业市场进入稳步增长周期。预计…

2026/7/29 16:46:05 阅读更多 →

最新新闻

VP机器视觉,文件类型,圆工具,定位工具,卡尺工具

VP机器视觉,文件类型,圆工具,定位工具,卡尺工具

VP文件类型查看教程! 查看帮助信息:VPPVersion --help 查看类型:VPPVersion -v C:\Users\YingZhenYu\OneDrive\桌面\QuickBuild1.vpp(这个是vpp的路径),第一个是工具类型名称。 --------------------------…

2026/7/29 16:57:10 阅读更多 →
社区家政管理系统搭建,上门服务实时轨迹上传接口开发

社区家政管理系统搭建,上门服务实时轨迹上传接口开发

社区家政管理系统搭建,上门服务实时轨迹上传接口开发社区家政管理系统主打小区定点上门服务,涵盖日常保洁、家电维修、深度洗护、陪护服务等民生场景,相较于同城散单配送,家政上门服务具备固定起止点位、服务周期长、场景私密、履…

2026/7/29 16:57:10 阅读更多 →
mysql原理补充--日志,缓冲,架构

mysql原理补充--日志,缓冲,架构

日志 执行一条 update 语句,期间发生了什么?,比如这一条 update 语句: UPDATE t_user SET name xiaolin WHERE id 1;更新语句的流程会涉及到 undo log(回滚日志)、redo log(重做日志&#x…

2026/7/29 16:57:10 阅读更多 →
BiliBili-UWP:技术深度解析与架构演进

BiliBili-UWP:技术深度解析与架构演进

BiliBili-UWP:技术深度解析与架构演进 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端,当然,是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP BiliBili-UWP作为Windows平台上的第三方B站客户端&#xff0…

2026/7/29 16:57:10 阅读更多 →
如何让2007-2017年老款Mac免费升级最新macOS系统:终极指南

如何让2007-2017年老款Mac免费升级最新macOS系统:终极指南

如何让2007-2017年老款Mac免费升级最新macOS系统:终极指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老款Mac无法升级到最新mac…

2026/7/29 16:57:10 阅读更多 →
分布式共识系统选型指南:etcd、Consul、ZooKeeper 与自己实现 Raft 的决策矩阵

分布式共识系统选型指南:etcd、Consul、ZooKeeper 与自己实现 Raft 的决策矩阵

分布式共识系统选型指南:etcd、Consul、ZooKeeper 与自己实现 Raft 的决策矩阵 一、共识系统选型的多维约束 分布式共识系统的选型不是"选最成熟的",而是在一致性模型、性能、运维复杂度、生态集成、团队能力五个维度中找到最优匹配。四个选项…

2026/7/29 16:56:10 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻