转自知乎@爱搓麻将的小青年
可以把server和raft分层来对待。
打个比方,一个县有三个社区(server), 每个社区都有一个自己的居委会(raft), 负责商议各项提案(request)是否执行。现在这个县收到一个上级(client)的提案(request)。由master居委会(master raft)所在的社区接收这个提案,居委会将其记录在案(log),然后组织三个居委会开始讨论商议(appendentry),只要两个及以上的居委会表示赞成,那么这个县就决定执行这个提案,但是决议不代表这个事就完成了,还要发动社区的人去做事的(commit != execute)。 为了号召相应社区的群众去完成这个提案,必须在社区公告上对该提案进行公示通知(记录commitIndex),意思说群众们,咱们社区又有事要干了。但是完成事情是要时间的,社区(server)只能按照公告栏上提案被公示的时间顺序(commitIndex表示的是最后公示的提案)来一件一件完成相应的提案(lastApplied的表示这个社区刚做完的提案)。所以一个关系是,社区做完的事永远慢于社区需要做的事(lastApplied <= commitIndex)。只有等社区完成了(而不是仅仅通过了)这个提案,上级才能看的到。