【ETCD】【源码阅读】 深入解析 raftNode.start`函数:Raft 核心启动逻辑剖析
raftNode.start方法 是 etcd 中 Raft 模块的核心启动点,其职责是管理 Raft 状态机的状态变迁、日志处理及集群通信等逻辑。通过对源码的逐行分析,我们将全面揭示其运行机制,探讨其设计背后的分布式系统理念。
函数核心结构
raftNode.start 方法在一个新的 goroutine 中启动了 Raft 主循环,核心逻辑是通过 for-select 结构不断处理以下任务:
- 定时器驱动的 Raft 心跳与选举。
- 接收并处理 Raft 的状态变更。
- 应用已提交的日志。
- 管理快照和硬状态的持久化。
- 发送消息以维持集群通信。
逐步拆解与分析
1. 初始化与 goroutine 启动
go func() {defer r.onStop()islead := false
onStop:确保 goroutine 优雅退出时清理资源。islead:标记当前节点是否为领导者(Leader),影响后续消息发送与日志处理。
2. 定时心跳驱动
case <-r.ticker.C:r.tick()
- 作用:
- Raft 使用定时器驱动节点的选举与心跳逻辑。
- 调用
r.tick(),触发内部逻辑,包括增加心跳计数器或超时选举。
- 意义:这是 Raft 协议中维持活跃性的核心机制。
3. 处理 Ready 状态
case rd := <-r.Ready():
Ready 是 Raft 状态机生成的待处理对象,包含领导者变更、已提交日志、快照等状态信息。
处理领导者变更
if rd.SoftState != nil {newLeader := rd.SoftState.Lead != raft.None && rh.getLead() != rd.SoftState.Leadif newLeader {leaderChanges.Inc()}if rd.SoftState.Lead == raft.None {hasLeader.Set(0)} else {hasLeader.Set(1)}rh.updateLead(rd.SoftState.Lead)islead = rd.RaftState == raft.StateLeaderif islead {isLeader.Set(1)} else {isLeader.Set(0)}rh.updateLeadership(newLeader)r.td.Reset()
}
SoftState:包含领导者 ID 及节点状态(Leader、Follower)。updateLead:更新领导者信息。updateLeadership:处理领导者身份的切换,包括暂停或恢复租约管理及日志压缩。
应用已提交日志
ap := toApply{entries: rd.CommittedEntries,snapshot: rd.Snapshot,notifyc: notifyc,raftAdvancedC: raftAdvancedC,
}
updateCommittedIndex(&ap, rh)select {
case r.applyc <- ap:
case <-r.stopped:return
}
CommittedEntries:已被集群达成共识的日志。updateCommittedIndex:更新已提交的日志索引。applyc通道:将日志传递给状态机应用层。
消息发送与持久化
if islead {r.transport.Send(r.processMessages(rd.Messages))
}
if err := r.storage.Save(rd.HardState, rd.Entries); err != nil {r.lg.Fatal("failed to save Raft hard state and entries", zap.Error(err))
}
- 领导者:并行发送日志复制消息(
Messages)给其他节点。 - 持久化:存储日志条目(
Entries)与硬状态(HardState),确保数据可靠性。
快照处理
if !raft.IsEmptySnap(rd.Snapshot) {if err := r.storage.SaveSnap(rd.Snapshot); err != nil {r.lg.Fatal("failed to save Raft snapshot", zap.Error(err))}notifyc <- struct{}{}r.raftStorage.ApplySnapshot(rd.Snapshot)r.lg.Info("applied incoming Raft snapshot", zap.Uint64("snapshot-index", rd.Snapshot.Metadata.Index))
}
- 保存快照:优先持久化快照,保证系统能够从快照中恢复。
- 应用快照:将快照数据加载到 Raft 存储,更新系统状态。
4. 通信与配置变更
confChanged := false
for _, ent := range rd.CommittedEntries {if ent.Type == raftpb.EntryConfChange {confChanged = truebreak}
}if confChanged {select {case notifyc <- struct{}{}:case <-r.stopped:return}
}
- 配置变更:处理
EntryConfChange类型的日志,涉及集群成员的增加或删除。 - 同步机制:确保配置变更日志在所有节点应用后生效。
5. 优雅退出
case <-r.stopped:return
- 关闭信号:通过监听
r.stopped通道,结束循环并退出 goroutine。
设计亮点与分布式理念
-
解耦与扩展性:
- Raft 状态的变更通过
Ready对象传递。 - 应用层通过
applyc通道独立处理日志,增强模块化设计。
- Raft 状态的变更通过
-
并行与性能优化:
- 领导者通过并行发送日志复制消息提升性能。
- 快照优先持久化,避免数据不一致。
-
可靠性:
- 所有状态变更均通过持久化操作保证数据一致性。
- 通过定时器和心跳机制维持集群活跃。
总结
raftNode.start 是 etcd 中实现 Raft 协议的核心方法,涵盖了领导者选举、日志复制、状态持久化及快照管理等功能。其设计不仅符合 Raft 协议的理论要求,还通过模块化和并行优化,提升了分布式系统的可靠性与性能。
相关文章:
【ETCD】【源码阅读】 深入解析 raftNode.start`函数:Raft 核心启动逻辑剖析
raftNode.start方法 是 etcd 中 Raft 模块的核心启动点,其职责是管理 Raft 状态机的状态变迁、日志处理及集群通信等逻辑。通过对源码的逐行分析,我们将全面揭示其运行机制,探讨其设计背后的分布式系统理念。 函数核心结构 raftNode.start 方…...
Robust Depth Enhancement via Polarization Prompt Fusion Tuning
paper:论文地址 code:github项目地址 今天给大家分享一篇2024CVPR上的文章,文章是用偏振做提示学习,做深度估计的。模型架构图如下 这篇博客不是讲这篇论文的内容,感兴趣的自己去看paper,主要是分享环境&…...
NEFTune,SFT训练阶段给Embedding加噪音
仿照CV里,数据增强的思路(给图像做旋转、反转、改变亮度等);NLP里,SFT训练数据较少时,也可往embedding上加噪音,来增加训练数据的丰富程度。进而提升最终训练效果。 前提假设:Embed…...
uniapp -- 实现页面滚动触底加载数据
效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</...
L22.【LeetCode笔记】相交链表(新版)
目录 1.题目 代码模板 2.分析 编辑 算法误区 正确方法1 但不能通过所有的测试用例 修改后 提交结果 正确方法2 节省代码的技巧 1.题目 https://leetcode.cn/problems/3u1WK4/description/ 给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单…...
智能时代网络空间认知安全新观察
文章目录 前言一、历史上的四次认知革命二、人工智能革命掀起认知安全新浪潮三、人工智能技术塑造认知安全新范式四、人工智能治理应对认知安全新思考 前言 12月5日,在2024第三届北外滩网络安全论坛上以“智能时代网络空间认知安全新观察”为主题作主旨演讲&#x…...
游戏如何应对模拟器作弊
模拟器是指能在PC端模拟出安卓手机系统的软件,市面上比较常见的安卓模拟器有:雷电模拟器、MuMu模拟器、夜神模拟器等。 市面上常见的模拟器 模拟器既可以节省手机内存空间,避免长时间玩游戏手机发烫发热的尴尬,也可以用键盘鼠标对…...
c++ 判断一个 IP 地址(可能是 IPv6 或 IPv4)是否属于特定范围
在 C 中,判断一个 IP 地址(可能是 IPv6 或 IPv4)是否属于特定范围时,需要考虑两种不同的地址格式和它们的范围比较。IPv6 和 IPv4 地址结构完全不同,因此需要分别处理这两种地址类型。 实现思路: 识别 IP…...
计算机视觉——相机标定(Camera Calibration)
文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变(Radial Distortion&a…...
【qt环境配置】windows下的qt与vs工具集安装\版本对应关系
vs工具集安装通过vs的在线安装器勾选工具集即可 工具包下载路径:https://www.microsoft.com/zh-cn/download/details.aspx?id40784 配置工具集在qt中可以自动扫描到 《正确在 Windows 上配置 MSVC(2019) 作为 Qt 编译器》https://b3logfile.com/pdf/article/15922…...
GitHub使用
太久不用GitHub发现自己又有些不会了,突发奇想为何不把每次看到的有指导意义的博客收录一下以便下次查阅呢 如何上传文件夹到GitHub上(配图详解)?_github上傳資料夾-CSDN博客 github上如何删除自己的仓库_github删除仓库-CSDN博…...
元宇宙时代的社交平台:Facebook的愿景与实践
随着科技的不断进步,元宇宙(Metaverse)这一概念逐渐走进了人们的视野。作为全球最大的社交平台之一,Facebook(现Meta)在这场元宇宙革命中扮演着重要角色。Meta不仅在不断扩展其社交平台的边界,还…...
vue2中各种钩子函数的总结以及使用场景
在 Vue 2 中,生命周期钩子函数是 Vue 实例在不同阶段自动调用的函数。这些钩子允许开发者在组件的创建、更新和销毁的特定时刻插入自定义逻辑。以下是 Vue 2 中的各种生命周期钩子函数的总结及其使用场景。 生命周期钩子函数总结 1、beforeCreate 调用时机&#…...
软件架构:从传统单体到现代微服务的技术演变
1.引言 在软件开发中,架构设计不仅仅是程序员的技术任务,它更是一个项目成功的关键。无论是小型应用还是大型分布式系统,软件架构都直接影响着系统的可维护性、可扩展性、性能和稳定性。理解软件架构的必要性,能够帮助开发人员做…...
git新建远程分支后,无法切换
git remote # 列出所有远程主机 git remote update origin --prune # 更新远程主机origin 整理分支 git branch -r # 列出远程分支 git branch -vv # 查看本地分支和远程分支对应关系 git checkout -b gpf origin/gpf # 新建本地分支gpf与远程gpf分支相关…...
【SpringBoot】31 Session + Redis 实战
Gitee https://gitee.com/Lin_DH/system 介绍 【SpringBoot】30 Cookie、Session、Token https://blog.csdn.net/weixin_44088274/article/details/144241595 背景 Spring Session 是 Spring 的一个子项目,它提供了一种管理用户会话信息的方法,无论…...
在Windows环境下的rknn-toolkit环境搭建
首先安装好conda,我是用的是anaconda,miniconda也可以。 下载rknn_toolkit的轮子。可以直接在瑞芯微的git仓库中下载,地址为:github.com/rockchip-linux/rknn-toolkit/releases。我这里下载的是1.7.5版本的。选择rknn-toolkit-v1.…...
Facebook广告突然无消耗?原因解析与解决方案。
在Facebook广告投放中,广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间,还可能导致营销活动停滞,影响业务发展。那么,广告无消耗的原因是什么?又该如何解决呢? 一、Facebook广告无消耗的…...
Rabbitmq 镜像队列
RabbitMQ 支持高可用性队列(HA Queues),可以在多个节点之间复制队列,确保即使某个节点失败,消息仍然可用。将 RabbitMQ 部署为集群,确保高可用性和负载均衡。 RabbitMQ 的镜像队列集群(Mirrore…...
TensorBoard
1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...
WarcraftHelper终极指南:3步解决魔兽争霸3现代系统兼容性问题
WarcraftHelper终极指南:3步解决魔兽争霸3现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专门为…...
WebPlotDigitizer:高效精准图表数据提取的智能化解决方案
WebPlotDigitizer:高效精准图表数据提取的智能化解决方案 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 副标题࿱…...
上海计算机学会2026年2月月赛C++丙组T1 乘积的秘密
乘积的秘密 题目描述 给定两个整数 A 与 B,保证 A ≤ B。请求出从 A 一直乘到 B 的符号: 如果乘积大于 0,输出 Positive;如果乘积小于 0,输出 Negative;如果乘积等于 0,输出 Zero。 输入格式 两…...
2026年上海网站GEO优化方法大揭秘,让你的网站脱颖而出!
在数字化浪潮席卷的当下,拥有一个出色的网站是企业立足市场的关键。而在上海这个充满机遇与挑战的商业之都,网站的GEO优化更是成为了众多企业提升竞争力的重要手段。那么,在2026年,究竟有哪些有效的GEO优化方法能让你的网站脱颖而…...
2026年3月Github开源项目精选Top10
📅统计周期:2026-02-28 ~ 2026-03-29 🌋数据来源:www.ffgithub.com 📚数据更新:2026-03-29 Top1. 666ghj/MiroFish 🔺 总星标数量:43670⭐🔺 周增长数量:63…...
PhotoMaker性能基准测试终极指南:建立你的AI人像生成速度参考标准
PhotoMaker性能基准测试终极指南:建立你的AI人像生成速度参考标准 【免费下载链接】PhotoMaker 项目地址: https://ai.gitcode.com/hf_mirrors/TencentARC/PhotoMaker 想要了解PhotoMaker的实际性能表现吗?作为一款革命性的AI人像生成工具&#…...
Open Event Server数据导入导出完全指南:支持JSON、XML、iCal格式的终极教程
Open Event Server数据导入导出完全指南:支持JSON、XML、iCal格式的终极教程 【免费下载链接】open-event-server The Open Event Organizer Server to Manage Events https://test-api.eventyay.com 项目地址: https://gitcode.com/gh_mirrors/op/open-event-ser…...
OpenClaw飞书机器人进阶:Qwen3.5-9B图片问答自动回复
OpenClaw飞书机器人进阶:Qwen3.5-9B图片问答自动回复 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合? 去年我们团队内部遇到一个典型问题:产品文档和功能说明分散在各个Confluence页面,新同事遇到界面不熟悉时,老员工需要…...
Fish Speech 1.5API文档增强:OpenAPI 3.0规范生成与Swagger UI集成
Fish Speech 1.5 API文档增强:OpenAPI 3.0规范生成与Swagger UI集成 1. 引言:为什么需要API文档增强? 在实际开发中,我们经常遇到这样的场景:团队新成员需要快速了解API接口,第三方开发者想要集成语音合成…...
极验点选验证码识别避坑指南:如何应对验证码图片更新带来的挑战
极验点选验证码动态对抗实战:从数据迭代到模型优化的全链路解决方案 当你的验证码识别模型突然失效时,第一反应是什么?上个月刚跑通的极验点选验证码识别系统,在验证码图片更新后准确率从92%暴跌至17%,这是我们团队最近…...
