分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

17 | Hashicorp Raft(一):如何跨过理论和代码之间的鸿沟?

appendEntries()
processRPC()
pipelineReplicate()
replicateTo()
replicate()
startStopReplication()
Log
AppendEntriesRequest
raftState
RaftState
runFollower(), runCandidate(), runLeader()
节点状态的变更
run()函数
网络通讯的实现
高效阅读源码的关键
数据结构和关键的代码执行流程
跟随者接收日志
领导者复制日志
日志相关的数据结构
RPC消息
数据结构
算法原理的角度
以最新稳定版v1.1.1为例
从代码实现和接口使用两个角度
需要理解API背后的代码实现
阅读Raft论文和API手册不够
理论和实践的差异
课堂思考
重点
复制日志
领导者选举
掌握Raft的代码实现
Raft开发分布式系统
开发系统感觉
内容小结
韩健
Hashicorp Raft

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
很多同学在开发系统的时候,都会有这样的感觉:明明自己看了很多资料,掌握了技术背后的原理,可在开发和调试的时候还是很吃力,这是为什么呢?
答案很简单,因为理论和实践本来就是两回事,实践不仅需要掌握 API 接口的用法,还需要理解 API 背后的代码实现。
所以,如果你在使用 Raft 开发分布式系统的时候,仅仅阅读 Raft 论文或者 Raft 实现的 API 手册,是远远不够的。你还要吃透 API 背后的代码实现,“不仅知其然,也要知其所以然”,这样才能“一切尽在掌握中”,从而开发实现能稳定运行的分布式系统。那么怎么做才能吃透 Raft 的代码实现呢?
要知道,任何 Raft 实现都承载了两个目标:实现 Raft 算法的原理,设计易用的 API 接口。所以,你不仅要从算法原理的角度理解代码实现,而且要从场景使用的角度理解 API 接口的用法。
而我会用两节课的时间,从代码实现和接口使用两个角度,带你循序渐进地掌握当前流行的一个 Raft 实现:Hashicorp Raft(以最新稳定版 v1.1.1 为例)。希望你在这个过程中集中注意力,勾划重点,以便提高学习效率,吃透原理对应的技术实现,彻底掌握 Raft 算法的实战技巧。
本节课,我会从算法原理的角度,聊一聊 Raft 算法的核心功能(领导者选举和日志复制)在 Hashicorp Raft 中是如何实现的。(如果 Raft 算法的原理你已经忘得差不多了,那你可以先回顾下 7~9 讲,加深印象之后,再进入今天的学习。)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Hashicorp Raft是一个流行的Raft实现,本文从算法原理和代码实现两个角度,带领读者逐步掌握了该实现的核心功能。文章首先强调了理论和实践之间的差异,强调了理解API背后的代码实现的重要性。接着,文章详细介绍了Hashicorp Raft中领导者选举的实现方式。通过分析源码,阐述了节点状态的数据结构和RPC消息的格式,以及领导者选举的具体步骤。在领导者选举过程中,文章重点介绍了跟随者、候选人和领导者三种节点状态对应的功能函数,以及选举领导者的具体步骤。通过对Hashicorp Raft的领导者选举实现进行深入剖析,读者可以更好地理解Raft算法的实际应用和技术细节。 本文详细介绍了Hashicorp Raft中日志复制的重要性以及其代码实现。读者通过学习日志相关的数据结构和代码实现,了解了日志复制是由领导者发起的,跟随者来接收的。文章强调了日志项的数据结构,包含了LogType和Extensions两个额外的字段,以及领导者复制日志和跟随者接收日志的具体步骤。在领导者复制日志过程中,文章详细介绍了启动新协程、流水线复制模式等关键步骤。而在跟随者接收日志过程中,文章着重介绍了处理接收到的RPC消息和核心函数appendEntries()的执行流程。 总的来说,本文通过深入剖析Hashicorp Raft的实现细节,帮助读者更好地理解了Raft算法的实际应用和技术细节,以及日志复制的重要性和代码实现。对于开发分布式系统的读者来说,本文提供了宝贵的学习资源,使他们能够更高效地阅读源码并理解Raft算法的实现原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 姜川
    Java版可以看dledger

    作者回复: 加一颗星:)

    2020-03-27
    2
    21
  • 吴小智
    Raft 说到底就是保证集群中各节点的日志一致,那么在 Consul、InfluxDB、IPFS 中,Raft 又是怎么被使用的呢?

    作者回复: 可以这么理解,Raft是通过实现各节点日志的一致等,最终实现了强一致性,能保证写操作完成后,就能立即和一直读到新数据,这也是Consul他们所需要的。

    2020-03-20
    2
    8
  • 沉淀的梦想
    流水线复制是如何优化日志复制的性能的呢?

    作者回复: 加一颗星:),发、收分离,持续异步发送日志项,不阻塞,也不需要考虑日志不一致等异常情况,纯复制。

    2020-03-20
    2
    7
  • 吴小智
    Leader 收到 client 请求,然后把日志写到自己的 disk 中,然后通知 Follower 复制日志,然后 leader 等待相应,收到大多数相应后,commit 该条日志;在代码中,只找到了 “Leader 收到 client 请求,然后把日志写到自己的 disk 中,然后通知 Follower 复制日志”,没找到 leader 是如何判断是否有大多数相应,且是在什么时候 commit 的。希望老师可以指点一下? PS:源代码中的 chan 通信,真的折磨人。

    作者回复: 加一颗星:),调用match()函数,来统计日志复制结果和判断大多数的,并将结果发送到commitCh,最终在leaderLoop()中处理committed日志项的。

    2020-03-24
    6
  • Ethan Liu
    老师 runFollower()里面这两个判断 if r.configurations.latestIndex == 0 和 if r.configurations.latestIndex == r.configurations.committedIndex && !hasVote(r.configurations.latest, r.localID) 原理是什么啊?

    作者回复: 加一颗星:),条件1,当前集群只有它一个节点,那么此时不需要进行领导者选举;条件2:该节点不具有投票权,不能进行领导者选举。

    2020-06-23
    2
  • Hashicorp Raft 找了半天 没有找到入口 main 函数

    作者回复: Hashicorp Raft是个package,可以将它理解成库(lib),是没有main函数的,可以通过API函数(比如AddVoter())或者核心函数(比如run()),作为入口函数,来进一步学习。

    2020-03-29
    2
  • 韩老师,您好,hashicorp 实现的raft package, 我看github上的标签是build failed, 我试过多个tag都是一样的。

    作者回复: package是无法直接编译的,需要在程序的main()中被调用后,才能编译。可以编译、研究下20讲的程序。

    2020-03-22
    2
  • 每天晒白牙
    好,下去结合之前的理论看看源码

    作者回复: 加油!有问题多交流:)

    2020-03-20
    2
  • cyq
    对于hashicorp/raft的代码中,如果一个节点是candidate状态。那么他是在什么时候会恢复为Follower的身份?

    作者回复: 加一颗星:),存在领导者,或者它发现了有比它更适合作为领导者的节点,具体来说,就是接收到领导者的心跳,或者接收到的投票请求的响应中的任期编号,比它的大。

    2020-05-27
    2
    1
  • Michael Tesla
    老师,是不是得先把大论文看一遍,再看代码,效果比较好?

    作者回复: 加一颗星:)。我推荐,先大概了解下算法的原理,然后将Raft实现(比如Hashicorp Raft)使用起来,有了感觉后,再将代码和论文结合着学习。

    2020-03-23
    1
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部