17 | Hashicorp Raft(一):如何跨过理论和代码之间的鸿沟?
17 | Hashicorp Raft(一):如何跨过理论和代码之间的鸿沟?
讲述:于航
时长16:52大小15.44M
Hashicorp Raft 如何实现领导者选举?
数据结构
选举领导者
Hashicorp Raft 如何复制日志?
数据结构
领导者复制日志
跟随者接收日志
内容小结
课堂思考
赞 15
提建议
精选留言(21)
- 姜川2020-03-27Java版可以看dledger
作者回复: 加一颗星:)
共 2 条评论20 - 吴小智2020-03-20Raft 说到底就是保证集群中各节点的日志一致,那么在 Consul、InfluxDB、IPFS 中,Raft 又是怎么被使用的呢?
作者回复: 可以这么理解,Raft是通过实现各节点日志的一致等,最终实现了强一致性,能保证写操作完成后,就能立即和一直读到新数据,这也是Consul他们所需要的。
共 2 条评论8 - 沉淀的梦想2020-03-20流水线复制是如何优化日志复制的性能的呢?
作者回复: 加一颗星:),发、收分离,持续异步发送日志项,不阻塞,也不需要考虑日志不一致等异常情况,纯复制。
共 2 条评论7 - Ricky Fung2021-06-30c++ 实现可以看百度开源的 braft:https://github.com/baidu/braft java实现可以看蚂蚁金服开源的sofa-jraft:https://github.com/sofastack/sofa-jraft6
- 吴小智2020-03-24Leader 收到 client 请求,然后把日志写到自己的 disk 中,然后通知 Follower 复制日志,然后 leader 等待相应,收到大多数相应后,commit 该条日志;在代码中,只找到了 “Leader 收到 client 请求,然后把日志写到自己的 disk 中,然后通知 Follower 复制日志”,没找到 leader 是如何判断是否有大多数相应,且是在什么时候 commit 的。希望老师可以指点一下? PS:源代码中的 chan 通信,真的折磨人。展开
作者回复: 加一颗星:),调用match()函数,来统计日志复制结果和判断大多数的,并将结果发送到commitCh,最终在leaderLoop()中处理committed日志项的。
6 - Ethan Liu2020-06-23老师 runFollower()里面这两个判断 if r.configurations.latestIndex == 0 和 if r.configurations.latestIndex == r.configurations.committedIndex && !hasVote(r.configurations.latest, r.localID) 原理是什么啊?
作者回复: 加一颗星:),条件1,当前集群只有它一个节点,那么此时不需要进行领导者选举;条件2:该节点不具有投票权,不能进行领导者选举。
2 - 一步2020-03-29Hashicorp Raft 找了半天 没有找到入口 main 函数
作者回复: Hashicorp Raft是个package,可以将它理解成库(lib),是没有main函数的,可以通过API函数(比如AddVoter())或者核心函数(比如run()),作为入口函数,来进一步学习。
2 - 坤2020-03-22韩老师,您好,hashicorp 实现的raft package, 我看github上的标签是build failed, 我试过多个tag都是一样的。
作者回复: package是无法直接编译的,需要在程序的main()中被调用后,才能编译。可以编译、研究下20讲的程序。
2 - 每天晒白牙2020-03-20好,下去结合之前的理论看看源码
作者回复: 加油!有问题多交流:)
2 - Ricky Fung2021-06-30java实现可参考蚂蚁金服开源的 sofa-jraft:https://github.com/sofastack/sofa-jraft c++实现可参考百度开源的 braft:https://github.com/baidu/braft共 1 条评论2
- cyq2020-05-27对于hashicorp/raft的代码中,如果一个节点是candidate状态。那么他是在什么时候会恢复为Follower的身份?
作者回复: 加一颗星:),存在领导者,或者它发现了有比它更适合作为领导者的节点,具体来说,就是接收到领导者的心跳,或者接收到的投票请求的响应中的任期编号,比它的大。
共 2 条评论1 - Michael Tesla2020-03-23老师,是不是得先把大论文看一遍,再看代码,效果比较好?
作者回复: 加一颗星:)。我推荐,先大概了解下算法的原理,然后将Raft实现(比如Hashicorp Raft)使用起来,有了感觉后,再将代码和论文结合着学习。
1 - 冷笑的花猫2020-03-20选举leader那段,先投自己一票,然后通过rpc让其它节点投票给自己。有些不理解,1 如果随机时间没收到投票怎么办?2 其它节点是如何回应这个投票信息的,基于什么标准决定投还是不投? 谢谢
作者回复: 加一颗星:),问题1:重新发起新的选举。问题2:主要是任期编号,更多信息可以参考下07讲的内容。
1 - tiny🌾2022-04-17只有一个领导节点能写,那怎么保证性能了? 如果写性能扛不住怎么办啊
- DavidJiang2021-09-22这个日志复制复制的具体是啥?和mysql中的binlog有什么本质的区别,看上去都是指令在本地执行.那么是否也会面临binlog复制的问题?
- Geek_a2ca6c2021-04-14我看这个实现的源代码里,requestvote函数,先是检查本地状态机的leader信息有没有,如果有leader信息,并且和发起投票的节点不一致,就拒绝本次投票。那是不是说并不是最先超时发起投票的节点不一定成为主几点,的集群大多数人超时后失去leader信息后,才会发起投票吗。
- David2021-04-01老师好,订阅这门课程有收获,谢谢! 在阅读Raft源代码时,有个疑问(可能是还没有看明白原因):follower接收投票请求时,会做些参数验证,具体代码是这几行: if leader := r.Leader(); leader != "" && leader != candidate && !req.LeadershipTransfer { r.logger.Warn(fmt.Sprintf("Rejecting vote request from %v since we have a leader: %v", candidate, leader)) return } 我的疑问是这样的:某候选者进入拉票阶段时,因每个follower的timeout不一样,这行代码: leader := r.Leader(); leader != "" && leader != candidate && !req.LeadershipTransfer 有概率似乎为true的,请问老师这里怎么理解呢,非常感谢!展开
- 青鸟飞鱼2020-11-12最近正好学习了go,真是干货满满。
- 蚂蚁内推+v2020-06-27startStopReplication和replicate函数区别是啥?怎么都是日志复制相关功能...
作者回复: 加一颗星:),不同的函数封装,replicate函数是在startStopReplication函数中被调用的,可以结合源码来理解哈。
- cbping2020-04-20源码在哪里呢?
作者回复: 文章开始处有链接,在这里,我显式贴下:https://github.com/hashicorp/raft