Raft 是一种分布式协议,也是一种分布式数据一致性方案,是为了解决分布式系统中的数据一致性问题儿诞生的一张协议。

Raft 协议介绍

它通过 Leader、Follower、Candidate 三个角色,通过解决 Leader Election (保证 Leader 可用性,Leader 宕机后的选举问题)、Log Replication(数据库数据同步,采用的日志复制方案) 和 Safety(安全机制) 三个问题确保数据在分布式系统中的一致性

Raft 采用的是 Leader 管理所有备份,一个 raft 集群中,只有一个合法的 Leader,所有客户端的 Log 操作,都需要通过 Leader 决定是否 commit.

日志复制(Log Replication)

AppendEntries RPC: raft 服务器节点之间的通信主要基于各种 rpc,其中 appendEntries RPC 用于复制条目,同时也用来发送心跳.
日志格式: 日志由日志编号、任期、操作组成.
日志复制: 客户端向 etcd 发起修改请求. leader 收到请求后将负责指令的执行,首先 leader 将新的日志条目添加到日志中,然后并行的发起 AppendEntries RPC 请求给其他服务器,让它们复制这条信息. 当大多数服务器复制了这条日志,这条日志将会进行 commited 操作.
日志压缩: 随着日志的不断增多,占用的空间越来越多,并且需要花更长的时间重放,这将会带来可用性的问题. 所以需要日志压缩技术,比如快照技术, 它被用在了 zookeeper、chubby 中,raft 中也应用了快照技术。

安全机制(Safety)

安全性是用于保证每个节点都执行相同序列的安全机制,避免新 Leader 产生后存在 Log 覆盖问题的机制. Safety 用于保证选举出来的 Leader 一定包含先前 Committed Log 的机制.

  1. 选举安全性: 每个 term 周期最多只有一个 Leader 被选举出来.
  2. Leader 完整性: Log 在 commited 后,后续 term 的 Leader 都必须包含该 log.