一、日志复制背景
当raft集群选出领导者的时候,集群就开始提供服务了。这个时候,会有客户端向raft集群发出请求。请求里面会包含一个可以被raft状态机执行的命令。leader会把这个命令作为一个entry(理解成raft中的一小段日记就可以)首先添加到自己的日志中,然后并发的向followeri节点发送请求,让他们复制这一小段日志。当日志安全复制成功后,leader将这段日志applied到自己的状态及,然后把命令的执行结果返回给客户端。如果在日志的复制过程中,有节点因为网络原因或者什么七七八八的原因,导致日志没有复制成功。leader会一直给这个节点发送append请求,直到复制成功。
下面这张图就描述了raft集群中日志的组成结构。每一个小方框就是entry,小方框里面的数字就是entry创建时对应的任期。每一个小方框自己对应的位置就是logIndex。

leader会对收到的entry进行判断,判断什么时候是安全的,是可以把这个entry应用到状态机上。可以被应用到状态机上的entry被称为committed。raft算法保证提交的entry都是持久化存储的,并且保证所有可用的状态机都会执行这个entry。
二、什么是entry的committed状态
entry的committed的状态是由entry在raft集群中有多少个副本而决定的。如果该entry有多数副本,则判断这个entry是committed状态。从figure6中可以看到index为5、6、7的entry都是committed的,因为这几个entry在raft集群中都有三个副本以上,占大多数。也就是说如果index为7的entry是committed状态的,那么index在7前面的entry都是committed状态,即便这个entry是其他leade

本文介绍了Raft一致性算法中的日志复制过程及日志冲突的解决方法。包括日志复制背景、committed状态定义、日志特性、日志冲突场景及解决策略等内容。
最低0.47元/天 解锁文章
8948

被折叠的 条评论
为什么被折叠?



