raft算法——日志复制
raft算法的日志复制是一个简化后的两阶段提交。减少一半的往返消息,降低了一半的消息延迟。
一,主从是如何复制日志的
步骤如下:
1 领导者接受到来自客户端的添加指令,会发送AppendEntriesRpc指令到各个节点,将日志项复制到集群中其他节点。
2 集群中各节点复制成功后,会回复领导者“复制成功”,当领导者收到半数以上的跟随者回复“复制成功”后,他将日志项提交到自己的状态机,如果没有收到半数以上回复成功,那么领导者会返回错误给客户端。
3 由于领导者的日志复制rpc消息和心跳消息,包含了最大的将被提交的日志项索引值,所以通过这些信息,跟随者就能知道领导者日志提交的位置了。
二,如何实现主从日志项的一致
算法中领导者强制要求跟随者复制自己的日志项来处理不一致的消息
图片来源于网络
具体步骤:
1 领导者发送当前最新的日志项(索引编号8)到跟随者,这个日志项的prevLogEntry值是7,prevLogTeam为4
prevLogEntry:表示当前要复制的日志项前面一条日志项的索引编号。
prevLogTeam:表示当前要复制的日志项前面一条日志项的任期编号。
2 如果跟随者在自己的日志项中找不到prevLogEntry值是7,prevLogTeam为4的日志项,就说明领导者和跟随者的日志不一致,跟随者拒收新的日志项,并返回失败给领导者。
3 这时领导者会递减发送日志项的索引编号,此时这个发送日志项的prevLogEntry值是6,prevLogTeam为3
4 如果跟随者在自己的日志项中找到了prevLogEntry值是6,prevLogTeam为3的日志项,日志复制rpc返回成功,那么领导者就知道在prevLogEntry值是6,prevLogTeam为3的日志项位置是和自己一致的,
5 领导者根据日志复制rpc更新覆盖该索引值后面的日志项。保证跟随者和自己的日志项是一致的,最终实现集群个节点的日志项是一致的。
领导者是通过日志复制rpc一致性检查找到相同日志项的索引值,然后更新覆盖该索引值后面的日志项。