分布式一致性协议 | 青训营笔记

78 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

1. 分布式系统

1.1 分布式系统面临的挑战

  • 数据规模越来越大
  • 服务可用性要求越来越高
  • 快速迭代的业务要求系统足够易用

1.2 理想中的分布式系统

  • 高性能:可扩展、低时延、高吞吐量
  • 正确:一致性、易于理解
  • 可靠:容错、高可用

2. 一致性与共识算法

2.1 多节点系统

在单个节点存在故障的可能性,一旦故障,系统将不可用,可以复制一个副本节点,防止系统不可用的情况发生。

无副本.jpg

两个副本.jpg

2.2 Raft共识算法

多个副本节点之间需要共识算法来维持一致性,Raft就是一种经典的共识算法。

Raft算法中一个节点可以处于以下三种状态之一:

  • Follower跟随者状态;
  • Candidate候选者状态;
  • Leader领导者状态。

Raft算法流程:

  • Leader Election

所有的节点都以跟随者状态开始,如果跟随者没有收到领导者的消息,那么他们可以成为候选人;然后,候选人从其他节点请求投票,节点将以他们的投票进行回复;如果候选人从多数节点中获得选票,它将成为领导者,这个过程称为领导人选举Leader Election。

在Raft中,有两个超时设置可控制选举,一个是election timeout选举超时,另一个是heartbeat timeout心跳超时。

election timeout选举超时是指followers跟随者成为candidates候选者之前所等待的时间。election timeout被随机分配在150毫秒至300毫秒之间,选举超时后,跟随者成为候选者并开始新的election term选举任期,为自己投票并向其他节点发送Request Vote请求投票消息。如果接收节点在这个任期中还没有投票,那么它将投票给候选人并且节点将重置其election timeout选举超时,一旦候选人获得多数票,便成为领导者。

领导者开始向其追随者发送Append Entries追加条目消息,这些消息以heartbeat timeout心跳超时指定的时间间隔发送。跟随者然后响应每个Append Entries追加条目消息。此选举任期将持续到追随者停止接收心跳并成为候选人为止。

每个任期只能选出一位领导者,如果两个节点同时成为候选节点,则可能会发生分裂投票。如果发生分裂投票节点将等待新的选举,然后再试一次。

  • Log Replication

系统的所有更改现在都要通过领导者,每次更改都将添加为节点日志中的条目。要提交条目,节点首先将其复制到跟随者节点,然后领导者等待,直到大多数节点都写了该条目,领导者通知跟随者该条目已提交。现在,集群已就系统状态达成共识,此过程称为Log Replication日志复制。

当选出一位领导者后,领导者需要将系统的所有更改复制到全部节点,通过使用与心跳相同的Append Entries添加条目消息来完成此操作。

该过程描述如下:

首先,客户端将更改操作发送给领导者,更改操作将添加到领导者的日志中,然后将更改操作在下一个心跳发送给追随者。一旦大多数追随者认可,便提交该条目。然后将响应发送给客户端。

面对网络分区,Raft也可以保持一致。

3. 其他常见共识算法

除了Raft外,还有许多共识算法,例如PBFT(实用拜占庭容错)算法。

PBFT算法流程

pbft.jpg

PBFT算法的共识过程

  1. 客户端(Client)发起消息请求request,并广播转发至每一个副本节点(Replica);
  2. 由其中一个主节点(Leader)发起提案消息pre-prepare,并广播;
  3. 其他节点获取原始消息,在校验完成后发送prepare消息;
  4. 每个节点收到2f+1个prepare消息,即认为已经准备完毕,并发送commit消息;
  5. 当节点收到2f+1个commit消息时,我们就认为该消息已经被确认完成reply。

参考资料:

[1] Raft容易理解的Distributed Consensus分布式共识算法