过程
一旦一个领导人被选举出来,他就开始为客户端提供服务。客户端的每一个请求都包含一条被复制状态机执行的指令。领导人把这条指令作为一条新的日志条目附加到日志中去,然后并行的发起附加条目 RPCs 给其他的服务器,让他们复制这条日志条目。当这条日志条目被安全的复制(下面会介绍),领导人会应用这条日志条目到它的状态机中然后把执行的结果返回给客户端。如果跟随者崩溃或者运行缓慢,再或者网络丢包,领导人会不断的重复尝试附加日志条目 RPCs (尽管已经回复了客户端)直到所有的跟随者都最终存储了所有的日志条目。
日志条目
每一个日志条目存储一条状态机指令和从领导人收到这条指令时的任期号。在日志中的任期号是用来检查不一致情况。每一条日志条目同时也都有一个整数索引值来表明它在日志中的位置。
安全性
目标:一旦日志应用于状态机,其他状态机不会出现不同的值
Raft安全属性:如果leader认可日志项目可提交,那么这些可提交的日志也会出现在未来的leader的日志里。
如何保证?
- leader从来不会重写它们的日志
- 只有领导者日志中的条目可以提交
- 应用到状态机之前,日志条目必须是认为可提交