分布式系统中的一致性共识算法
- Basic Paxos
- Multi Paxos
- Raft
- Zab
- Gossip
Paxos算法
在分布式系统中,造成系统不可用的场景很多,比如服务器硬件损坏、网络数据丢包等问题
解决这些问题的根本思路是:多副本,副本是分布式系统解决高可用的唯一手段,也就是主从模式。
那么如何在保证一致性的前提下,提高系统的可用性,Paxos 就被用来解决这样的问题,而 Paxos 又分为 Basic Paxos 和 Multi Paxos
Raft算法
Raft 是 Multi Paxos 的一种实现,是通过一切以领导者为准的方式,实现一系列值的共识,然而不是所有节点都能当选 Leader 领导者。
Raft 算法对于 Leader 领导者的选举是有限制的,只有最全的日志节点才可以当选。
Zab算法
zookeeper使用的共识算法
Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。
所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字
- 高32位: 是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。
- 低32位: 用于递增计数。
Gossip算法
Gossip 的协议原理有一种传播机制叫谣言传播。
谣言传播:指的是当一个节点有了新数据后,这个节点就变成了活跃状态,并周期性地向其他节点发送新数据,直到所有的节点都存储了该条数据。
这种方式达成的数据一致性是 “最终一致性”,即执行数据更新操作后,经过一定的时间,集群内各个节点所存储的数据最终会达成一致,很适合动态变化的分布式系统。
总结
共识算法的选择和数据副本数量的多少息息相关
如果副本少、参与共识的节点少,推荐采用广播方式,如 Paxos、Raft 等协议。
如果副本多、参与共识的节点多,那就更适合采用 Gossip 这种最终一致性协议。