zoukankan      html  css  js  c++  java
  • Zookeeper zab协议学习

    一、zookeeper基础概念

    1、zookeeper是个啥

           zookeeper是一个JAVA实现的分布式协调服务,最早由Yahoo开发,后交给Apache维护。 分布式协调技术主要用来解决分布式环境当中的多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止异常。 最常见的例如分布式锁就是一种分布式协调服务的具体实现。

    2、Zookeeper能做什么

    ZooKeeper is a high-performance coordination service for distributed applications. It exposes common services - such as naming, configuration management, synchronization, and group services - in a simple interface so you don't have to write them from scratch. You can use it off-the-shelf to implement consensus, group management, leader election, and presence protocols. And you can build on it for your own, specific needs.

          以上文字是从zookeeper官网抄下来,翻译一下大概是,zookeeper是个高可用的分布式协调服务,可以用于命名服务,配置管理,数据同步和集群管理等,可以通过它实现共识、集群管理、leader选举、存在协议。并且可以根据以这些功能为基础实现自己的特定需求。

          翻译不到位,但是大致意思就是如此。

    3、Zookeeper基本数据结构

      如上左图,Zookeeper的DateTree类似于一个文件的目录结构,不同的是每个节点都可以进行数据数据存储,节点之间像树一样,节点之前可能存在父子关系,如图中X节点在zookeeper中的Path就是使用/A/X来表示。

      图上的每个节点(A、B、C、X、Y)都是一个Znode,Znode的结构如右上图所示,节点内主要包含Data(存储二进制数据),Children(子节点引用),ACL(节点权限的相关数据),Stat(状态数据,类似版本号之类数据保存在里面)。

      Znode创建的时候可以设置节点类型,是否顺序、是否临时节点。主要类型和对应的使用场景有四种,持久型(配置信息),临时型(mainstay的服务提供、消费者节点),顺序持久(消息通知),顺序临时(分布式锁)。

    二、ZAB协议

      了解ZAB之前需要先了解一下CAP,懒得打字,直接贴个图。

    2、Zookeeper集群的角色

     

       Zookeeper集群有三种角色,Leader、Follower、Observer。当集群在选举的时候或者某台机器寻主的时候,都处于LOOKING状态。

    3、ZAB中机器的状态流转

    1、机器启动后,初始化QuorumPeer,执行startLeaderElection ()方法,状态置为Election

    2、选举完成,状态置为DISCOVERY进行数据读取,确认epoch等参数,leader实例进行loadData()保存snapshot;follower链接leader,启动sender线程等一系列准备动作

    3、状态设置为SYN,进行主从数据同步,等待半数以上机器同步完成后,进入广播状态(未同步完成的机器仍然在上一个状态中),正常工作

    4、Leader节点挂掉等原因导致集群重新选主

    4、集群选举

      集群选举主要通过每个非Observer机器进行投票。通过比如zxid和serverId来确定Leader,规则是优先选zxid大的机器,zxid相同,对比机器id,机器id大的获得选票。当选举完成后有新机器加入集群,新机器处于选举状态,其他机器会告诉它,谁是当前的leader

    5、数据同步

      zookeeper的数据存储大致如下图,DataTree为内存数据,读写时直接操作。事务日志和快照文件可以理解为文件的备份

       当集群中机器的状态进入到数据同步时,大致是这么一个流程

    6、Zookeeper集群工作时处于广播状态

    三、PAXOS/RAFT

      Paxos是目前市面大部分一致性算法的基础,Basic paxos 有三种角色 Proposer、Acceptor、Learner,同一个节点可以有多个角色 ,Proposer发起提议, Acceptor进行投票, Learner学习最终的结果 ,Basic paxos算法因为没有leader,存在提案冲突的可能,极限情况会出现活锁,因此muti-paxos出现了leader,ZAB更接近于muti-paxos。

      raft是另外一个非常流行的一致性算法,也是基于paxos。跟zab不一样的是,raft的选主是通过分配时间片,然后每台机器有随机的过期时间,通过这种方式来防止选主投票时分票导致选主失败的情况。不过多赘述。有兴趣可以参考 https://raft.github.io 进行了解。

    四、总结

      这次学习ZAB协议的时候,整了一个PPT,因为懒得多打字,所以直接把PPT截图放到博客中,以后复习的时候留个草稿。不用多打字是真的爽,半个小时不到就整完了。

  • 相关阅读:
    spring3: Bean的命名与Bean的实例化
    极客软件测试52讲总结分享
    如何有效地搭建测试环境?
    用xshell 连接docker Linux服务器
    python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告
    CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
    jenkins 关联 钉钉机器人
    Jenkins pipeline 语法详解
    jenkins 添加 证书凭证Credentials
    项目中使用的S2SH整合中使用的struts.xml(参考模板)
  • 原文地址:https://www.cnblogs.com/null-qige/p/14852817.html
Copyright © 2011-2022 走看看