基于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/10/14 2:25:30 阅读更多 →
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/10/8 18:32:47 阅读更多 →
全球无张力烘干机市场持续扩容:预计2032年市场规模将达1.55亿美元,年复合增长率4.0%

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

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

2026/10/4 20:31:30 阅读更多 →

最新新闻

Windows平台Rust开发环境配置与优化指南

Windows平台Rust开发环境配置与优化指南

1. Rust语言与Windows环境适配背景Rust作为一门系统级编程语言,其编译器工具链对操作系统底层有着深度依赖。在Windows平台进行Rust开发需要特别注意环境配置的差异性——与Linux/macOS不同,Windows存在MSVC和GNU两种ABI(应用程序二进制接口&…

2026/10/14 2:25:24 阅读更多 →
长波红外超构透镜偏振复用FDTD仿真全流程解析

长波红外超构透镜偏振复用FDTD仿真全流程解析

1. 项目背景与核心价值长波红外超构透镜偏振复用聚焦技术是近年来光学领域的前沿研究方向。作为一名光学工程师,我在实际项目中发现传统红外光学系统存在体积大、重量沉、功能单一等问题。而基于超构表面的偏振复用透镜,能在单层平面上实现多通道光学功能…

2026/10/14 2:25:24 阅读更多 →
2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

一、前言:2026 高校论文审核新难题随着高校学术审核体系不断升级,知网、维普等主流检测平台全面上线AIGC 智能检测功能,当代毕业生的论文写作与修改迎来双重考验。以往论文仅需攻克重复率超标问题,如今还要规避AI写作痕迹检测风险…

2026/10/14 2:25:24 阅读更多 →
摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱、写真、儿童摄影的修图营销与交付版本 v1.0  2026年10月写在前面:这本手册解决什么这本手册写给三类人:开婚纱影楼的老板与修图主管、拍个人写真和家庭照的独立摄影师、做儿童摄影工作室的店长与后期。你大概率已…

2026/10/14 2:25:24 阅读更多 →
流水线设计实战:从冒险机制到乱序执行的性能优化

流水线设计实战:从冒险机制到乱序执行的性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:25:24 阅读更多 →
【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

2026/10/14 2:24:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →