基本结构
- 数据模型:树形结构,根节点下可创建子节点,使用绝对路径查询。
- 节点类型: - 持久节点:会话关闭后依然存在,需显式删除。- 临时节点:会话关闭后自动删除,可用于监控。- 有序节点:创建时自动添加递增序号。
节点数据与状态
- 节点数据:二进制数组,存储数据、ACL、子节点信息等。
- 节点状态:每个节点有状态信息,可通过
stat
命令查看。 - 节点版本:三种类型,更新操作会引起版本变化。
数据存储
- 内存数据:通过
DataTree
类存储。 - 数据日志:记录服务运行状态,用于异常分析。
- 事务日志:记录事务请求,用于数据同步。
- 快照文件:定期备份内存数据到磁盘。
会话机制
- 会话创建:连接即会话,包含会话ID、超时时间、关闭状态。
- 超时时间:客户端与服务端协商决定。
- 会话状态:包括连接、重新连接、关闭等状态。
- 分桶策略:按时间间隔管理会话过期时间。
集群
- 角色:Leader、Follow、Observer。
- Leader:管理集群,工作分配和调度。
- Follow:处理非事务请求,参与Leader选举。
- Observer:处理查询请求,不参与选举。
选举机制
- 发生在集群启动或Leader失效时。
- 包括发起投票、接收投票、统计投票三个步骤。
- 投票基于ZXID和myid决定Leader。
基本原理
- 序列化机制:使用Jute,二进制方式。
- ZAB协议:原子广播协议,解决数据一致性问题。
Watch机制
- 订阅节点变化,触发通知。
- 分布式环境下的观察者模式。
- Watch事件触发取决于会话状态和注册事件类型。
- Watch是一次性的,需重新添加。
权限控制
- ACL由模式、授权对象、权限信息组成。
- 模式包括范围验证、口令验证、World模式。
- 授权对象可以是IP、用户名或所有用户。
- 权限包括创建、更新、读取、删除、管理。
应用场景
- 悲观锁:通过创建节点获取锁。
- 乐观锁:使用节点version属性校验。
- 分布式锁:使用ZooKeeper节点实现,避免死锁和羊群效应。
分布式锁实现流程
- 客户端连接ZooKeeper,创建/lock下临时有序子节点。
- 判断是否为最小序号子节点,是则获得锁。
- 未获得锁的客户端监听子节点变更。
- 获得锁后执行业务流程,完成后删除子节点释放锁。
本文转载自: https://blog.csdn.net/modelsetget/article/details/141021169
版权归原作者 modelsetget 所有, 如有侵权,请联系我们删除。
版权归原作者 modelsetget 所有, 如有侵权,请联系我们删除。