一、什么是Zookeeper
Zookeeper是一个开源的分布式协调服务,它设计的目的就是将那些复杂容易出错的分布式一致性服务封装起来,提供统一的解决方案。
ZooKeeper 为我们提供了高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
二、Zookeeper的数据模型
采用层次化多叉树结构,每个节点上都可以存储数据,最小存储节点是 Znode,每个节点的大小限制是1M,我们通常将ZNode分为4个种类:
- 持久节点 :一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除
- 临时节点:生命周期与seesion绑定
- 持久顺序节点:具有持久特性,并且子节点具有顺序性,例如node/0001, node/0002
- 临时顺序节点
2.1 Znode的结构
每个Znode分为两部分组成:
- stat : 存储状态信息,例如:事务id,创建时间,子任务id
- data
三、Watcher(事件监听器)
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是ZooKeeper 实现分布式协调服务的重要特性。(Zookeeper实现分布式事务就利用了这一特性)
四、Zookeeper实现分布式锁
4.1 加锁
锁在zookeeper下就是一个临时节点的形式存在,当有客户端来申请加锁时,
- 会生成一个
临时顺序节点
且会进行编号。 - 获取整个节点链表,判断当前是否是第一个
- 如果是第一个,加锁成功
- 如果不是前一个,说明前面还有锁没有释放,会对上一个顺序节点添加一个
监听器
4.2 释放锁
释放锁很简单,就是将自己创建的临时顺序节点删除。删除了那个节点之后,zk 会负责通知监听这个节点的监听器,“锁有人释放了”,通知等待着的客户端重新尝试获取锁
4.3 整个过程如下:
参考
《石衫架构笔记》
使⽤ redis 如何设计分布式锁?使⽤ zk 来设计分布式锁可以吗?这两种分布式锁的实现⽅ 式哪种效率⽐较⾼?