Raft分布式一致性协议

什么是分布式一致性

让我们举个栗子。比方说我们有1个单节点的系统。这个栗子中,你可以设想我们的节点是一个只存有1个value的数据库服务器。同样我们有1个client可以向服务器发送value。可以看到,在一个节点中,value很容易与客户端达成一致(因为没有在其他可存value的节点,不存在一致性问题)。但当有多个节点时,我们怎么保持一致性呢?这就是分布式一致性问题。Raft是一个实现分布式一致性的协议。让我们概览以下它是如何工作的。

领导者选举(leader election)

一个节点有3种状态:Fllower(跟随者状态)/candidate(后选人状态)/Leader(领导者状态)。所有节点以跟随者状态开始。如果跟随者们没有从领导者获得响应,则他们可以成为(领导者的)后选人。此时,后选人请求其他节点对自己进行投票。如果后选人获得了大多数节点(半数以上)的投票,则后选人将成为领导者。这个过程称为领导者选举。

日志复制(log replication)

所有对系统的变动现在都通过领导者进行。每一个变动都会作记录添加到节点的日志中。此时日志记录尚未提交,所以它不会更新节点的value。为了提交记录,领导者节点首先复制日志记录到所有跟随者节点。领导者等待直到大多数节点都进行了日志登记。此时领导者节点提交日志变更登记,节点的value改变.领导者随后通知跟随者变更登记已经提交。现在集群的节点达成了分布式一致性。这个过程称为日志复制。

领导者选举

Raft用2种超时设置来控制选举选举超时和心跳超时。
选举超时是一个跟随者等待成为一个候选人的总时间。选举超时时间在150ms和300ms间随机产生。选举超时后,跟随者成为一个候选人并且开始新的选举周期,发送投票请求到其他(跟随者)节点来为自己进行投票。如果接收节点还未在本周期内进行投票,则其投票给后选人,并重置它的选举超时时间。一旦后选人获得大多数的投票即成为领导者。领导者开始发送附加的登记信息给他的跟随者。这些信息会以心跳超时所指定的间隔时间被发送。跟随者对每一个附加登记信息做应答。选举周期一直进行直到跟随者停止接收心跳并成为后选人。一个选举周期内只有一个领导者被选出。如果在同一时刻有2个节点成为后选人,则会产生分裂投票。此时选举周期会循环进行,直到大多数节点选出一个领导者。

猜你喜欢

转载自blog.csdn.net/ikevin/article/details/73358999