选举机制

选举的时机

  1. 集群初始化启动时
  2. Leader节点宕机时:集群初始化完毕之后,新节点加入或者Follower节点宕机不会触发选举,Leader保持不变。当Leader宕机,集群暂停服务并触发选举。

节点的状态

  • LOOKING,竞选状态。
  • FOLLOWING,随从状态,同步leader状态,参与投票。
  • OBSERVING,观察状态,同步leader状态,不参与投票。
  • LEADING,领导者状态。

投票的依据

  • sid,即节点的唯一ID,ID越大,权重越高
  • zxid,事务ID,ID越大,数据越新,权重越高

节点类型

自动编号\持久性 持久 短暂
自动编号节点 自动编号持久节点 自动编号短暂节点
非自动编号节点 非自动编号持久节点 非自动编号短暂节点
  • 持久性

    • 持久性节点:客户端与服务器断开连接之后,客户端创建的数据不删除
    • 短暂性节点:客户端与服务器断开连接之后,客户端创建的数据自动删除(适用于动态上下线)
  • 顺序号

    • 创建ZNode时设置顺序标识,ZNode名称后会增加一个单调递增的数值,由父节点维护。

Slat结构体

  • ls2后者get命令的输出结果,有zookeeper管理的元数据
1
2
3
4
5
6
7
8
9
10
11
- czxid 创建节点的事务 zxid
- ctime 创建节点的时间戳毫秒数
- mzxid 最后更新的事务zxid
- mtime 最后修改的时间毫秒数
- pZxid 最后更新的子节点zxid
- cversion 子节点变化号(修改次数)
- dataversion 数据变化号
- aclVersion 访问控制列表变化号
- ephemeralOwner 临时节点,其值为ZNode拥有者的sessionid,如果不是临时节点则为0
- dataLength 数据长度
- numChildren 子节点数量

监听器原理

  • 创建zookeeper客户端时,会创建两个线程。一个负责网络连接通信(connect),一个负责监听(listener)。
  • connect线程将监听注册事件发送给zookeeper,zookeeper维护一个监听器注册列表
  • 目录或者数据变化时,zookeeper通过listener线程通知客户端
  • listener线程通过process方法回调处理业务逻辑

读写数据流程

读数据

  • 由于zookeeper节点之间数据是完全一致的,所以可以连接任意的节点进行数据读取

写数据

  • 某节点接收到写数据请求时,如果其不是Leader节点,其会将请求转发到Leader节点
  • Leader节点将写数据广播到其余节点
  • 当超过半数节点写入成功时,认为数据写入成功并通知客户端。