作者:李小翠
1、raft协议是什么?
容错性。
复制状态机(Repilcated State Machine,RSM),它有一个很重要的性质——确定性(deterministic):
每个server上Log的一致性!
因此,raft是一致性协议,是用来保障servers上副本一致性的一种算法。
遵循的性质
Election Safty
2.1 如何保证Election Safty
2.2 如何保证Log Matching
preLogIndex和preLogTerm这两个信息,follower收到消息的时候,
首先判断它最新日志条目的index和term是否和rpc中的一样
(不是最新的,新的leader被选举可能会发生overwrite的情况),首先找到与preLogIndex相同index处的entry是否和preLogTerm相同,如果一样,才会append.
2.3 如何保证Leader Completeness
这个在raft协议中是有完整证明的,这个证明比较简短,用反正法,我在看的时候加了一些标注。
第一个没有包含leaderT中commitT点(T<U)
误解成了这个约定是用来保证之前任期内已经被复制到大多数server却没有被提交的日志在新的仍期内不会被覆盖。 实际上,论文中的figrure8的过程是一个正确的过程。
在(c)中,index=2并没有被提交,在(d)中被复制了是一个正确的做法。论文想阐述的是:如果在(c)中,leader提交了这个之前任期内的entry,在(d)中依然会被覆盖,也就是说被commit的entry覆盖了,这是一个错误!因此约定“can not commit entries from previous term”
raft的解决方法就是two phase approch,引入一个过度配置,称为共同一致状态。具体的做法和图示:
考虑上述过程:
此时就需要做log compaction
写时复制的snapshot(写是复制在linux中可以通过fork来完成)
网易云大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者李小翠授权发布。