在分布式系统中,为了提高系统的可用性,达到99.999%的指标,我们通常会对服务节点做集群,采用主从互备的方式增强服务的可用性。在主从互备的集群中,主节点和从节点需要保证数据一致,主节点服务出现问题后,需要在从节点中选举出一个新的主节点,那么常用的分布式选举算法有Bully算法、Raft算法、ZAB算法。本节主要对ZAB算法进行分析。

定义

ZAB(Zookeeper Atomic Broadcast)是Zookeeper 原子消息广播协议,Zookeeper 使用一个主进程处理客户端的请求,采用ZAB的原子广播协议,将数据的状态变化广播给集群中的其他节点。

选举状态

ZAB选举涉及四种状态:
选举状态,选举过程中所有节点的状态,观察者节点除外
领导状态,领导节点的状态,领导节点可以向其他节点广播合同步信息。
跟随状态,非领导节点的状态
观察状态,观察者具有的状态,无投票合选举权

选举流程

ZAB选举中的每个节点都记录三个元素,节点ID、事务ID、选举轮数,投票信息包括节点ID(被选举节点)、事务ID(投票节点具有的)。
选举原则事务ID最大当选,事务ID一致则节点ID最大的当选。

  1. 集群初始化时,不存在领导者需要进行选举,此时也没有任何事务处理,所以事务ID都为0,选举轮数为1,我们以三个节点举例,每个节点向其他两个节点发送投票信息,都选举自己当领导者。如下图所示:
    在这里插入图片描述
  2. 三个节点交换信息后,事务ID都为0,那么就需要找节点ID了,最大为3,所以另外两个节点就需要修改投票信息。如下图所示:
    在这里插入图片描述
  3. 节点3当选成领导者,然后节点3变成领导状态,其他节点变成跟随状态。

选举过程结束后,领导者会向其他节点同步信息,领导者接收的客户端事务请求会广播提议信息给跟随者节点。

ZAB算法中所有来自客户端的事务请求都由一个全局服务器来协调处理,这样的服务器叫作领导者,集群中的其他服务器叫作跟随者,此外还引入了观察者,领导者负责将客户端的事务请求转换成一个提议,并将该提议分发给集群中的所有跟随者,之后领导者需要等待所有跟随者的反馈信息,得到超过半数跟随者的反馈以后,领导者会再次向所有的跟随者发布消息,告知提议已经半数通过了,并提交和提议对应的事务请求。
摘自《分布式架构原理与实践》崔皓.著

Logo

鸿蒙生态一站式服务平台。

更多推荐