Raft是一种分布式一致性算法,相比Paxos更加容易理解,易于实现。整个算法分为选举过程和复制过程。
一、选举过程(Leader Election)
节点有三种角色:
Leader节点
Follower节点
Candidate节点
有两个超时时间控制选举,一个是election timeout,一个是heartbeat timeout(BroadcastTime)
当Follower节点超过election timeout时(election timeout在150ms~300ms随机生成),它会变成Candidate节点,当收到leader 的heartbeat时,会重置election timeout。
变成Candidate节点会先给自己有一票,然后会发送要求投票(RequestVote)的消息到其他节点,其他节点最多能给一个候选人投票,采用先到先服务原则。
获得超过半数投票则可称为Leader节点,若选举超时,没有任何一台服务器赢得选举,则自增当前任期(Term),重新发起选举;
二、复制过程(log replication)
Leader选出后,就开始接收客户端的请求。Leader把请求作为日志条目(Log entries)加入到它的日志中,然后并行的向其他服务器发起 AppendEntries RPC 复制日志条目。
(1)客户端提交数据,Leader节点将数据写到自己的log中
(2)Leader节点然后通过AppendEntries发送给Follower节点,Follower节点收到后回复确认。
(3)Leader节点收到超过半数的确认后先自己提交记录,然后回复客户端。
(4)Leader节点向Follower节点发送确认提交消息