背景

分布式环境中,最难的问题为:拜占庭将军问题

拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文[1]中提出的分布式对等网络通信容错问题。 在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论,从而破坏系统一致性。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。

分布式对等网络中需要按照共同一致策略协作的成员计算机即为问题中的将军,而各成员计算机赖以进行通讯的网络链路即为信使。拜占庭将军问题描述的就是某些成员计算机或网络链路出现错误、甚至被蓄意破坏者控制的情况。

Paxos主要就是如何保证在分布式网络环境下,各个服务器如何达成一致最终保证数据的一致性问题。

介绍

ZAB协议为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。

基于Paxos的一个改进。

Zookeeper并没有完全采用Paxos算法,而是采用ZAB(Zookeeper Atomic Broadcast)

原理

  • 在Zookeeper的主备模式下,通过ZAB协议来保证集群中各个副本数据的一致性
  • Zookeeper使用的是单一的主进程来接收并处理所有的事务请求,并采用ZAB协议把数据的状态变更以事务请求的形式广播到其它节点
  • ZAB协议在主备模式架构中,保证了同一时刻只能有一个主进程来广播服务器的状态变更
  • 所有的事务请求必须由全局唯一的服务器(leader)来协调处理,主要负责把客户端的事务请求转化为一个事务提议(proposal),并分发给集群中的所有follower节点,再等到所有follower节点的反馈。一旦超过半数服务器进行了正确的反馈,那么leader就会commit这条消息

作用

  • 崩溃恢复
  • 原子广播
    • 要么同时成功、要么同时失败(分布式事务)

工作原理

什么情况下ZAB协议会进入崩溃恢复模式

崩溃恢复:服务器崩溃了,从崩溃到恢复正常中间会丢失消息,恢复时需要同步丢失的消息

  • 当服务器启动时
  • 当leader服务器出现网络中断、崩溃或者重启的情况
  • 集群中已经不存在过半的服务器与该leader保持正常通信

ZAB协议进入崩溃恢复模式会做什么

  • 当leader出现问题,ZAB协议进入崩溃恢复模式,并且选举出新的leader。当新的leader选举出来以后,如果集群中已经有过半机器完成了leader服务器的状态同步(数据同步),则退出崩溃模式,进入消息广播模式
  • 当新的机器加入到集群中的时候,如果已经存在leader服务器,那么新加入的服务器就会自觉进入数据恢复模式,找到leader进行数据同步

问题

  • 如果客户端发了一个事务请求给到leader, 而leader发送给各个follower以后,并且收到了ack,leader已经commit。 在准备ack给各个follower节点comit的时候,leader挂了,怎么处理的。
    • ZAB协议,一定需要保证已经被leader提交的事务也能够被所有follower提交。
    • 选取新的leader(zxid的最大值)
    • 同步给其它的follower
  • 假设一个事务在leader服务器提交请求,没有发送到follow之前,leader挂掉了,怎么办?
    • ZAB协议需要保证,在崩溃恢复过程中跳过那些已经被丢弃的事务