参考:
- 《从Paxos到Zookeeper分布式一致性原理与实践》 –倪超
注:学习Zookeeper强烈建议读这本书。
Zookeeper 特性
Zookeeper大致有下面几个特性,对Zookeeper的运用也都是运用这些特性解决实际的问题:
节点类型:
- 临时节点:客户端和服务端之间的Session过期之后节点会自动消失。
- 持久节点:创建节点之后,节点就会一直存在,除非手动删除。
- 临时顺序节点:拥有临时节点的特性,同时会根据创建的顺序给节点添加一个编号(编号作为节点名字的一部分)。
- 持久顺序节点:拥有持久节点的特性,同时会根据创建的顺序给节点添加一个编号(编号作为节点名字的一部分)。
Watcher机制:节点数据变更注册时,在该节点的Watcher都会被通知。子节点列表变化注册该节点的Watcher也会被通知。
多个客户端同时创建一个节点,保证只有一个客户端可以创建成功。
对于有N台服务器组成的集群,保证有小于等于(N/2)-1 台服务器不能提供服务时,集群的数据仍然保持完整。
Zookeeper 应用场景
分布式系统配置文件动态更新:利用Zookeeper的可靠性,以及Watcher机制。把配置数据保存在Zookeeper的节点下,系统启动的时候,从数据节点读取配置信息,同时在数据节点注册Watcher,之后当配置数据变更的时候系统就会得到通知,从而实现配置参数动态变更。
分布式系统的悲观锁:系统创建同一个临时节点(防止客户端出现网络问题,或者客户端断开后节点一直存在,而导致死锁问题),创建成功的获取锁,任务执行完成之后删除节点,创建不成功的监听父节点列表变更事件,收到变更通知之后重新尝试创建。
分布式队列:
- 系统在父节点下创建临时顺序节点。
- 获取父节点的子节点列表。如果创建的节点是最小节点,则执行业务逻辑。如果创建的节点不是最小的节点,则监听创建节点前面那一个节点的变更事件。
- 收到通知之后重复步骤2。
全局唯一ID,假设业务模块为
job
- 需要Id的时候就在节点下创建
job-
的顺序子节点,然后会返回带包含编号的节点名字,这个名字就可以作为一个Id使用。
- 需要Id的时候就在节点下创建