Raft 是一个 replication log + State Machine 的模型,我们只能通过 leader 进行写入,leader 会将 command 通过 log 的形式复制到 followers,当集群的大多数节点都收到了这个 log,我们就认为这个 log 是 committed,可以 apply 到 State Machine 里面。
TiKV 的 Raft 主要移植 etcd Raft,支持 Raft 所有功能,包括:
Leader election
Log replicationLog compaction
Membership changesLeader transfer
Linearizable / Lease read
经典raft协议数据处理流程
1. Leader 收到 client 发送的 request。
2. Leader 将 request append 到自己的 log。
3. Leader 将对应的 log entry 发送给其他的 follower。
4. Leader 等待 follower 的结果,如果大多数节点提交了这个 log,则 apply。
5. Leader 将结果返回给 client。
6. Leader 继续处理下一次 request。
异步Raft协议改造
1.Leader 接受一个 client 发送的 request。
2. Leader 将对应的 log 发送给其他 follower 并本地 append。
3. Leader 继续接受其他 client 的 requests,持续进行步骤 2。
4.Leader 发现 log 已经被 committed,在另一个线程 apply。