分布式锁,进程间并发控制的一种方式,实现悲观锁,有2个要求:
- 任何时刻,一个锁只能被一个客户端持有
- 当持有锁的客户端崩溃、出现分区,最终总能获得锁
1 Redis 实现
1.1 单实例 redis
获取锁
另开一个 watchdog 线程,定期监控获取到锁的执行线程,如果正常,使用 EXPIRE 续期。SET key random NX EX 3
# random 客户端生成随机值,释放锁时有用
# NX 当 key 不存在时设置
# EX 超时 3 秒
释放锁
执行 Lua 脚本(保证原子性),检查 key 的 value,如果和 random 相同才能 DEL。2 ZooKeeper 实现
2.1 非公平锁
各 client 创建同一个临时节点,创建成功的 client 获得锁,其余监听。
牧群效应(Herd),当释放锁时,通知了很多 client 竞争锁,但只有1个能成功,其余做了无用功。2.2 公平锁
各 client 在加锁时创建临时顺序节点,序列号最小的获得锁,其余 watch 比自己序列号小的上一个节点,等待释放。
curator 采用了该方案,没有牧群效应。参考文献