如何用ZK实现分布式锁
我们这里用最基础的ZK的API来模拟一个分布式锁竞争的场景:
-
假设现在有两个角色:
Node1
,Node2
-
时刻1:
#Node1 获取锁
create -e /lock
- 时刻2:
#Node2 尝试获取锁
create -e /lock
#加锁失败,返回 Node already exists:/lock
- 时刻3:
# 1. Node2 查看 /lock 节点的状态
# 2. 并注册监听 /lock 节点的变化
stat -w /lock
# 会输出一堆关于节点的信息,由于我们是实现分布式锁,可以不用关系输出的东西
- 时刻4:
#Node1 退出客户端,或宕机客户端断开连接
quit
- 时刻5:
#Node2 监听到锁被释放,监听是一次性的
WatchedEvent state: SyncConnected type:NodeDeleted path:/lock
- 时刻6:
#Node2 尝试加锁
create -e /lock
总结
-
用ZK实现分布式锁,本质上就是多个客户端竞争 创建 临时节点的执行权
-
ZK提供的API保证了如下几点特性:
-
- 只有一个客户端能够创建成功 Znode
-
- 如果Znode是临时节点, 客户端崩溃,则Znode自动删除
-
- 当Znode被释放,会通知其他监听的客户端
-
有了这几点,也就有了实现分布式锁的基本条件
-
各个语言可以实现自己语言环境的分布式锁