Zookeeper(八)ZAB协议和CAP理论

一、什么是ZAB协议?

  Zab 借鉴了 Paxos 算法,是特别为Zookeeper设计的支持崩溃恢复的原子广播协议。基于该协议,Zookeeper设计为只有一台客户端(Leader)负责处理外部的写事务请求,然后 Leader 客户端将数据同步到其他Follower节点。即Zookeeper只有一个Leader可以发起提案(proposal)。

  Zab 协议主要包括两部分:消息广播崩溃恢复

  整个Zookeeper就是在这两个模式之间切换。 当Leader服务可以正常使用,就进入消息广播模式,当Leader不可用时,则进入崩溃恢复模式

二、消息广播

  ZAB协议的消息广播过程使用的是一个原子广播协议,类似一个二阶段提交过程

  对于客户端发送的写请求,全部由Leader接收,Leader将请求封装成一个事务提案(proposal),将其发送给所有Follwer,如果超过半数Follwer成功响应,则执行commit操作(先提交自己,再发送commit给所有Follwer)。

广播流程图解

  • (1)客户端发起写操作请求
  • (2)Leader服务器将客户端的请求转化为事务Proposal提案【同步写请求】,同时为每个Proposal分配一个全局的ID,即zxid。
  • (3)Leader服务器为每个Follower服务器分配一个单独的队列,然后将需要广播的Proposal依次放到队列中去,并且根据FIFO策略进行消息发送。
  • (4)Follower接收到Proposal后,会首先将其以事务日志的方式写入本地磁盘中,写入成功后向Leader反馈一个ACK响应消息。
  • (5)Leader接收到超过半数以上Follower的ACK响应消息后,即认为消息发送成功,可以发送commit消息。
  • (6)Leader向所有Follower广播commit消息,同时自身也会完成事务提交。Follower接收到commit消息后,会将上一条事务提交

  PS:Zab协议的核心,就是只要有一台服务器提交了Proposal,就要确保所有的服务器最终都能正确提交Proposal

三、崩溃恢复

  一旦Leader服务器出现崩溃或者由于网络原因导致Leader服务器失去了与过半Follower的联系,那么就会进入崩溃恢复模式。

出现异常的两种情况

  • (1)假设一个事务在Leader提出之后,Leader挂了
  • (2)一个事务在Leader上提交了,并且过半的Follower都响应Ack了,但是Leader在Commit消息发出之前挂了

Zab协议崩溃恢复原则

  • (1)确保已经被Leader提交的提案Proposal,必须最终被所有的Follower服务器提交。【已经产生的提案,Follower必须执行】
  • (2)确保丢弃已经被Leader提出的,但是没有被提交的Proposal。【丢弃Leader最终没确认commit的提案】

恢复方式

  恢复方式主要就是选取新的Leader,再进行数据同步,选取Leader的流程可以详见我上一篇文章《Zookeeper(七)Zookeeper集群角色及选举原理分析》

四、CAP理论

什么是CAP理论?

  • 一致性(C:Consistency)
  • 可用性(A:Available)
  • 分区容错性(P:Partition Tolerance)

  CAP理论告诉我们,一个分布式系统不可能同时满足以上三种

  PS:这三个基本需求,最多只能同时满足其中的两项,因为P是必须的,因此往往选择就在CP或者AP中。

一致性(C:Consistency)

  在分布式系统完成某写操作后任何读操作,都应该获取到该写操作写入的那个最新的值。相当于要求分布式系统中的各节点时时刻刻保持数据的一致性。

可用性(A:Available)

  客户端一直可以正常访问并得到系统的正常响应。从用户角度来看就是不会出现系统操作失败或者访问超时等问题。

分区容错性(P:Partition Tolerance)

  指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务。也就是说部分故障不影响整体使用。 

Zookeeper如何应用CAP理论?

  PS:Zookeeper保证的是CP

  原因如下:

  • (1)ZooKeeper不能保证每次服务请求的可用性。【在极端环境下,ZooKeeper可能会丢弃一些请求,需要用户重新请求进行获取】
  • (2)进行Leader选举时集群都是不可用的状态。
原文地址:https://www.cnblogs.com/riches/p/15178314.html