1. 选举机制

  1. 半数机制:半数以上机器存活,集群可用,所以ZooKeeper适合安装奇数台服务器
  2. 工作时自动选举出Leader,其他则为Follower(以下以5台服务器举例)
    1. 服务器1启动,此时它发出的报文没有任何响应,故它的选举状态一直是LOOKING
    2. 服务器2启动,它与服务器1互相交换选举结果,此时两者都没有历史数据,故id较大的服务器2获胜。此时服务器2获得2票,小于5的半数以上,故仍未产生Leader
    3. 服务器3启动,与服务器1、2分别交换选举结果,由id较大的服务器3获胜,获得3票,当选Leader
    4. 之后的服务器4和5启动,虽然id较3更大,但服务器3已当选Leader,需要等到服务器3出故障down机之后重新选举

      2. 节点类型

  • 持久节点(Persistent):客户端和服务器断开连接后,创建的节点不删除
    • 持久化目录节点
    • 持久化顺序节点:断开连接后,节点依然存在,只是ZooKeeper对节点名称进行顺序编号
  • 短暂节点(Ephemeral):客户端和服务器断开连接后,创建的节点自己删除
    • 临时目录节点
    • 临时顺序节点

      3. stat结构体

  1. czxid-创建节点的事务zxid
    1. 每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID
    2. 事务ID是ZooKeeper中所有修改总的次序,每个修改都有唯一的zxid
  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. 监听器原理

    image.png

  12. client需要一个主线程main()

  13. 主线程创建两个线程listener(监听)和connect(网络连接通信)
  14. connect将注册的监听事件发送给ZooKeeper服务器
  15. ZooKeeper服务器在监听器列表中插入这个监听事件
  16. ZooKeeper一旦监听到这个监听器监听的节点有数据或路径变化,就会将这个消息发送给listener线程
  17. listener线程内部执行process方法执行业务流程