Zookeeper 从 0 到 1 学习 ——第三章 Zookeeper内部原理

1. 选举机制(面试重点)

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

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

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

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

    在这里插入图片描述

    Zookeeper 的选举机制

1.1 Zookeeper 选举过程

  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一样当小弟。

2. 节点类型

在这里插入图片描述

3. Stat 的结构

  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子节点数量

4. 监听器原理(面试重点)

4.1 监听器原理图解

监听器原理,如下图所示:

在这里插入图片描述

监听器原理

4.2 监听原理详解

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

4.3 常见的监听事件

  1. 监听节点数据变化

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

    ls path [watch]
    

5. 写数据流程

5.1 写数据流程图解

写数据流程,如下图所示:
在这里插入图片描述

写数据流程图解

5.2 写数据流程详解

  1. Client 向 Zookeeper 的 Server1 上写数据,发送一个写请求。
  2. 如果 Server1 不是 Leader,那么 Server1 会把接收到的写请求转发给 Leader 节点。
  3. Leader 节点接收到写请求,检查 zxid 是否可用。
  4. Leader生成 Proposal协议,广播 Proposal到 Follower 节点。等待 Follower 响应。
  5. Follower 节点接收到 Proposal后,把 Proposal 写入事务日志,写入完成后发送 ack 消息给 Leader 服务器。
  6. Leader 接收到超过 半数的 Follower 响应了后,广播 commit 消息给 Follower 。
  7. Follower 写入成功后,Leader 通知 client 写入成功。

猜你喜欢

转载自blog.csdn.net/dwjf321/article/details/110288903