Zookeeper 分布式锁

实现思路

  • 利用create进行独占抢锁,抢到锁的会返回成功
  • 利用临时节点保证会话断开(抢到锁的进程崩溃)后能够自动删除节点
  • 利用监听机制实现锁释放后可以快速抢到锁
  • 利用临时顺序节点,实现公平锁,每个节点只要监听前面一个节点就可以
  • 只有排在最前面的节点才可以抢到锁
  • 如果中间有节点放弃了锁,则后面的自动向前监听

  • Zookeeper 实现的是公平锁,有”先来后到”,实际上是实现了分布式网络队列

与 redlock 对比

redlock 算法属于类 CAS 自旋锁,存在轮询问题。

  • 在多台 Client 访问多台 Redis 实例时,有两种情况可能出问题:

    1. 在并发情况下,可能多个 Client 获得一部分锁,之后反复随机重试,多次通信浪费时间
    2. 在过半数实例锁认证成功情况下,其中两台在主从同步之前就挂掉,会导致锁被新的请求拿到,同时拿到锁导致严重问题
  • 与 Redis 的 redlock 相比,Zookeeper 锁的并发性能差一些(硬盘写入、分布式节点确认),但是 Zookeeper 集群稳定性更好,不需要类 CAS 轮询

  • 到底选哪种锁需要Tradeoff(权衡利弊)

    • 如果对锁的一致性要求高,那么就用Zookeeper
    • 如果对锁的速度要求高,那么可以用高配单机Redis+redlock
    • 如果介于两者之间,可以用多实例Redis+redlock