Raft——最容易懂的Raft日志复制

当 leader 收到 client 的数据修改指令后,集群进行一系列通信后节点们完成一致的数据修改,这个过程叫做日志复制。

下面完成描述下整个过程。

在选举出一个leader之后,就需要复制所有的变更信息到系统里的所有节点。这些是通过和心跳检测相同的的Append Entries message来完成的。

Raft——最容易懂的Raft日志复制_第1张图片

我们来看下这个过程。一开始, client会向leader发送一个变更。

Raft——最容易懂的Raft日志复制_第2张图片

这个变更会加到 leader的log中(由于这条日志还没被其他任何节点接收,所以它的状态是uncommitted),并会在下一次心跳检测的时候发给 follower。

Raft——最容易懂的Raft日志复制_第3张图片

follower在收到消息之会,都会给 leader 发送响应的 ack消息。

Raft——最容易懂的Raft日志复制_第4张图片

收到大多数的 follower 响应之后, leader 会提交这个entry,并且发送响应给 client。

Raft——最容易懂的Raft日志复制_第5张图片

Raft——最容易懂的Raft日志复制_第6张图片

并在下次心跳的时候,通知 follower 们执行提交操作。

Raft——最容易懂的Raft日志复制_第7张图片

follower 在写入完成后再给 leader 发送响应。 一旦有大多数节点成功写入这条日志,那么Leader节点的这条日志状态就会更新为committed状态,并且值更新为5:

Raft——最容易懂的Raft日志复制_第8张图片

此时集群的状态是完全一致的,这个过程就叫做日志复制(Log Replication)。

此时 Client 又给给 leader 发送消息,要给X 来执行个 加2 的操作。leader 将消息添加到 log 之后,给各个follower 发送心跳。

Raft——最容易懂的Raft日志复制_第9张图片

follower 们收到之后继续返回响应。

Raft——最容易懂的Raft日志复制_第10张图片

leader 收到 ack 之后,确认本次执行进行 commit ,然后给 client 发回响应。并在下次心跳的时候,把写入发给各个 follower。

Raft——最容易懂的Raft日志复制_第11张图片

此时,咱们的系统里 X变成了7,各个节点的数据保持一致。

Raft——最容易懂的Raft日志复制_第12张图片

你可能感兴趣的:(raft)