zoukankan      html  css  js  c++  java
  • 20200209 ZooKeeper 3. Zookeeper内部原理

    ZooKeeper 3. Zookeeper内部原理

    3.1 选举机制(重点)

    1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

    2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

    3)以一个简单的例子来说明整个选举的过程。

    假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么,如图所示。

    img

    (1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。

    (2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。

    (3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。

    (4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。

    (5)服务器5启动,同4一样当小弟。

    3.2 节点类型

    1. Znode有两种类型

      短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自动删除

      持久(persistent):客户端和服务器端断开连接后,创建的节点不删除

    2. Znode有四种形式的目录节点(默认是persistent )

      (1)持久化目录节点(PERSISTENT)

      ​ 客户端与zookeeper断开连接后,该节点依旧存在

      (2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)

      ​ 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

      (3)临时目录节点(EPHEMERAL)

      ​ 客户端与zookeeper断开连接后,该节点被删除

      (4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)

      ​ 客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

    3. 创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

    4. 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

    说明:

    创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。

    注意:

    在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。

    3.3 Stat结构体

    [zk: localhost:2187(CONNECTED) 9] stat /
    cZxid = 0x0
    ctime = Wed Dec 31 16:00:00 PST 1969
    mZxid = 0x0
    mtime = Wed Dec 31 16:00:00 PST 1969
    pZxid = 0x0
    cversion = -1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 1
    

    1)czxid-创建节点的事务zxid

    每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。

    事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。

    2)ctime - znode被创建的毫秒数(从1970年开始)

    3)mzxid - znode最后更新的事务zxid

    4)mtime - znode最后修改的毫秒数(从1970年开始)

    5)pZxid-znode最后更新的子节点zxid

    6)cversion - znode子节点变化号,znode子节点修改次数

    7)dataversion - znode数据变化号

    8)aclVersion - znode访问控制列表的变化号

    9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。

    10)dataLength - znode的数据长度

    11)numChildren - znode子节点数量

    3.4 监听器原理

    img

    监听原理详解:

    1. 首先要有一个main()线程
    2. 在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
    3. 通过connect线程将注册的监听事件发送给Zookeeper。
    4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
    5. Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
    6. listener线程内部调用了process()方法。

    常见的监听:

    1. 监听节点数据的变化:

      get path [watch]
      
    2. 监听子节点增减的变化

      ls path [watch]
      

    3.5 写数据流程

    1. Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
    2. 如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2,各个Server写成功后就会通知Leader。
    3. 当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。
    4. Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。ZooKeeper 整个写数据流程就是这样的。
  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12287568.html
Copyright © 2011-2022 走看看