Zookeeper中分布式锁的实现原理
Zookeeper中的数据存储结构就像一棵树,树上的节点叫做Znode。这里,Znode有四种类型:
- 持久节点;
- 持久节点顺序节点
- 临时节点
- 临时节点顺序节点
所谓的顺序节点,即在创建节点时,Zookeeper会根据创建的时间顺序给节点的名称进行编号;
Redis实现分布式锁时,需要实现三个核心要素:
- 加锁;
- 解锁
- 锁超时机制
Redis实现分布式锁时,存在三个问题:
- 保证原子性操作,即保证加锁和锁超时的操作要一次性完成;
- 防止误删锁;
- 添加守护线程,为锁续命。
Zookeeper基于临时节点有序节点的实现分布式锁
通过创建和释放临时节点,实现加锁和解锁。
通过创建和释放临时节点有序节点,实现加锁、解锁和对临界资源的有序访问。
通过Watch事件通知机制,就可以在锁释放时,即删除一个临时节点有序节点,通知下一个客户端执行操作。基于此,Zookeeper实现了顺序访问临界资源。
Zookeeper和Redis分布式锁的比较
分布式锁实现 | 优点 | 缺点 |
---|---|---|
Zookeeper | 1.有封装好的框架,容易实现; 2.有等待锁的队列,大大提升了抢占锁的效率 |
添加和删除节点性能较低。 |
Redis | Set和Del指令的性能较高 | 1.实现复杂,需要考虑超时、原子性、误删等情形; 2.在客户端自旋来等待锁的释放,效率低下。 |