方圆

Zookeeper-Note

2019-09-01

zookeeper = 文件系统+通知机制,和文件系统一样每一个目录项称作znode,能够增加、删除、增加删除子节点,不同的是每个znode可以存储数据。

  • 节点类型

    1. PERSISTENT-持久化目录节点
    2. PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    3. EPHEMERAL-临时目录节点
    4. EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

    临时节点在会话结束时会自动移除。

  • 通知机制
    客户端注册监听它关心的目录节点,目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

  • 原理

    1. Zab协议

      包括恢复模式(选主)和广播模式(同步),当服务启动或者在leader崩溃后,Zab就进入恢复模式,当leader选定并且大多数server完成了和leader的同步,进入广播模式。广播模式利用递增的事务id(zxid,高32位表示leader是否改变,低32位1递增计数)保证proposal被按序处理。

    2. 选举流程

      zk提供了LeaderElection、AuthFastLeaderElection, FastLeaderElection 共3种选举策略,默认使用 FastLeaderElection 。

      • FastLeaderElection

        1. 服务器启动或者leader挂掉,余下的follower将状态改为Looking,进入选举状态;
        2. 每个server产生一个投票(zxid,sid)发送给集群中所有机器。系统初始时zxid为0,运行期间每个server的zxid可能不同,取决于最后一个更新的数据。
        3. 接收并检查投票,如果是本轮投票并且来自Looking状态的server;
        4. 收到的票和自己的投票进行比较,zxid较大的优先为leader,zxid相同时sid较大的为leader,更新自己的投票并再次发送。
        5. 每次投票后服务器统计投票信息,如果半数收到相同投票,那么leader产生,否则进行下一轮。
        6. 产生后改变自己的状态为Leading或Following。
      • 注意

        1. 发送投票时还有:

          • electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中,该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。
          • peerEpoch:被推举的Leader的epoch。
          • state:当前服务器的状态。
        2. 为了能够相互投票,每两台服务器之间都会建立网络连接,为避免重复建立TCP连接,zk的server只允许sid大于自己的服务器与自己建立连接,否则断开当前连接,并主动和对方建立连接。

  • 应用

    1. 配置中心(数据发布与订阅)

      客户端向服务端注册自己需要关注的节点,节点发生变动,服务端就向客户端发送事件通知,客户端接收到通知主动到服务端拉去最新的数据。

    2. 命名服务

      通过使用命名服务,客户端能根据指定名字获取资源或服务的地址、提供者信息。比如RPC中的服务地址列表。通过在zookeeper创建一个全局唯一路径就是一个名字。

    3. 分布式协调/通知

      不同客户端对ZK上同一个节点进行注册,如果该节点发生变化,所有客户端都能接收到通知,并作出相应处理。

    4. 心跳检测

      传统方法是机器之间互相ping。基于ZK的临时节点特性,可以让不同进程都在zk的一个指定节点下创建临时子节点,其他进程可根据这个临时节点判断某进程是否存活。这样消除了进程之间的直接耦合。

    5. 工作进度汇报

      任务分发后,通过在指定节点下每个worker创建临时节点,既可以用于判断worker存活状态,worker也可以在该节点写记录工作进度。

    6. master选举

      多个节点同时创建某个相同路径,ZK的一致性能保证只有一个节点能创建成功,创建成功的就是master,不成功的就监听这个节点;当master故障,会话结束,这个临时节点消失,ZK通知其他节点来重新竞争。

    7. 分布式锁

      和master选举思路类似。

  • 基本使用

    1
    2
    3
    4
    ls /
    create /zkPro test
    set /zkPro testMod
    delete /zkPro
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章