• 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选举时集群都是不可用的状态。
  • 相关阅读:
    QT+Linux+FFmpeg+C/C++实现RTSP流存储为MP4视频文件
    FFmpeg接收RTSP并将H264保存为MP4
    第一次在此定义 多重定义 multiple definition of
    无法定位程序输入点_ZdaPvj于动态链接库 Qt5Core.dl Qt5Gui.dll上
    QObject::startTimer: QTimer can only be used with threads started with QThread
    ONVIF开发编译时提示stdsoap2.o中multiple definition of 'namespaces'问题的解决
    ONVIF开发(1)生成开发框架
    VUE从入门到放弃(项目全流程)————VUE
    UI库colorui的使用————小程序
    超简单详细的搭建个人网站————静态网站
  • 原文地址:https://www.cnblogs.com/riches/p/15178314.html
Copyright © 2020-2023  润新知