Raft日志数据复制

当选择了领导者后,客户端就可以发送数据给领导者了。领导者在通知集群中的其他节点。

假设接下来客户端发起一个SET 5的请求,这个请求会首先由leader即节点a接收到,并且节点a写入一条日志到日志表中,但是还未正式提交系统。由于这条日志还没被其他任何节点接收,所以它的状态是未提交 (uncommitted)。

raft未提交状态

为什么日志为未提交呢?假设客户端数据一来,Leader直接把数据提交给自己,然后再告知其他跟随者节点,如果其他跟随者节点未收到这个数据,或者收到这个数据,但是写入错误,那么,是不是集群的状态就不一致了呢?

所以日志需要先为未提交状态,直到其他节点反馈了日志是否被记录,那么Leader才会变为提交状态。


什么是Raft心跳

为了提交这条日志,Leader会将这条日志通过心跳消息复制给其他的Follower节点。

节点成功写入日志

心跳是什么?可能很多铜须会问。

心跳检测在网络程序中常常被用到,在客户端和服务器之间暂时没有数据交互时,就需要心跳检测对方是否存活。心跳检测可以由客户端主动发起,也可以由服务器主动发起

一旦有大多数节点成功写入这条日志,那么Leader节点的这条日志状态就会更新为committed状态,并且值更新为5:

leader已提交状态

Leader节点然后通知其他Follower节点,其他节点也会将值更新为5。如下图所示,这个时候集群的状态是完全一致的,这个过程就叫做 Raft日志复制(Log Replication)

raft状态一致