Raft(6.824-lab2/3)
Raft : 分布式的一致性算法
Raft动画 http://thesecretlivesofdata.com/raft/ // 很棒
主要解决 分布式系统下共识的问题
每个节点有三个状态: Follower(追随者), Candidate(候选人), Leader(领导者)
两种RPC:RequestVote(请求投票),AppendEntries(追加log,同时作为心跳包)
以及两个超时设置来控制选举:election timeout(选举超时,会随机在150~300ms),heartbeat time(心跳时间)
LAB2 :保证能完成选主,并在Leader宕机后重新选主。
开始所有节点都在Follower状态,开始等待选举超时,对于先超时的节点会成为候选人,给自己发送投票同时会发送请求投票给其他节点,当节点本term没有给其他节点投票过时,就会投票给候选人,并且重置选举超时时间。当某个候选人在本term获得大多数投票,就会成为领导者。领导者会发送日志给其他追随者以心跳时间,追随者会响应追加的日志,领导者发现过半追随者已经获得某个日志以后,本个日志就可以交给状态机来执行。
难点就是理解这张图。
LAB3 :对于每个raft节点,同时作为server。客户端通过找到leader来进行追加数据。
Leader将本次请求分配一个递增的index,当有超过n/2个节点保存了本次请求数据,就可以进行提交,并返回请求成功。
对于日志过多时,可以进行快照操作,例如kv数据可以直接将kv映射进行序列化保存,而去掉日志。并在某个raft节点数据缺少过多时,直接发送快照。
个人Raft相关代码 :https://github.com/hrbust-liu/Raft
参考资料:
Raft论文 英文:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf
中文:https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md
参数讲解:https://www.cnblogs.com/lushilin/p/9268969.html
参考其中代码:https://blog.csdn.net/qq_42397248/article/details/100064450