Zookeeper原理
选举机制
选举的时机
- 集群初始化启动时
- Leader节点宕机时:集群初始化完毕之后,新节点加入或者Follower节点宕机不会触发选举,Leader保持不变。当Leader宕机,集群暂停服务并触发选举。
节点的状态
- LOOKING,竞选状态。
- FOLLOWING,随从状态,同步leader状态,参与投票。
- OBSERVING,观察状态,同步leader状态,不参与投票。
- LEADING,领导者状态。
投票的依据
- sid,即节点的唯一ID,ID越大,权重越高
- zxid,事务ID,ID越大,数据越新,权重越高
节点类型
自动编号\持久性 | 持久 | 短暂 |
---|---|---|
自动编号节点 | 自动编号持久节点 | 自动编号短暂节点 |
非自动编号节点 | 非自动编号持久节点 | 非自动编号短暂节点 |
持久性
- 持久性节点:客户端与服务器断开连接之后,客户端创建的数据不删除
- 短暂性节点:客户端与服务器断开连接之后,客户端创建的数据自动删除(适用于动态上下线)
顺序号
- 创建ZNode时设置顺序标识,ZNode名称后会增加一个单调递增的数值,由父节点维护。
Slat结构体
ls2
后者get
命令的输出结果,有zookeeper管理的元数据
1 | - czxid 创建节点的事务 zxid |
监听器原理
- 创建zookeeper客户端时,会创建两个线程。一个负责网络连接通信(connect),一个负责监听(listener)。
- connect线程将监听注册事件发送给zookeeper,zookeeper维护一个监听器注册列表
- 目录或者数据变化时,zookeeper通过listener线程通知客户端
- listener线程通过process方法回调处理业务逻辑
读写数据流程
读数据
- 由于zookeeper节点之间数据是完全一致的,所以可以连接任意的节点进行数据读取
写数据
- 某节点接收到写数据请求时,如果其不是Leader节点,其会将请求转发到Leader节点
- Leader节点将写数据广播到其余节点
- 当超过半数节点写入成功时,认为数据写入成功并通知客户端。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Equator's Blog!