分布式协调服务

  • Zookeeper是分布式协调服务框架
  • 分布式协调技术: 次要用来解决分布式环境当中多个过程之间的同步控制,让过程有序的去拜访某种临界资源,避免造成"脏数据"的结果
  • 分布式协调技术的外围就是实现分布式锁

    分布式锁

  • 分布式锁: 为了避免分布式系统中的多个过程之间互相烦扰,须要分布式协调技术对过程进行调度,这个分布式协调技术的外围就是实现分布式锁

    分布式锁条件

  • 在分布式系统环境下,一个办法在同一时间只能被一个机器的一个线程执行
  • 高可用的获取锁与开释锁
  • 高性能的获取锁与开释锁
  • 具备可重入个性
  • 具备锁生效机制,避免死锁
  • 具备非阻塞锁个性

    分布式锁的实现

  • Zookeeper
  • Redis
  • Memcached
  • Chubby

    Redis分布式锁的实现

  • 分布式锁实现的三个外围因素:加锁,解锁,锁超时
  • Redis是单线程的

    加锁

  • 应用setnx命令
  • key是锁的惟一标识,按业务来决定命名
  • value能够设置成任意值
  • 当一个线程执行setnx返回1,阐明key本来不存在,该线程胜利失去锁.当一个线程执行setnx返回0,阐明key曾经存在,该线程抢锁失败

    解锁

  • 当失去锁的线程执行完工作,须要开释锁,以便其它线程能够进入,应用del指令开释锁之后,其它线程就能够继续执行setnx命令取得锁

    锁超时

  • 一个失去所得线程在执行工作的过程中呈现问题,不能显式开释锁,这些资源将永远被锁住,造成死锁的状态
  • setnx的key要设置一个超时工夫,保障锁没有被显式开释时,会在肯定工夫后主动开释.setnx不反对超时参数,须要额定的指令expire

  • Redis分布式锁问题:

    • 非原子性操作:

      • 解决方案: 通过应用set命令set(key,value,expire) 设置为原子操作
    • 误删锁:

      • 在设置锁超时的状况下,操作没有实现,当操作实现时,del命令删除的是其它过程的锁
      • 解决方案: 判断是否为本过程的锁.带着key和value=threadID线程ID判断是否为本过程的锁
    • 在设置锁超时的状况下,操作没有实现

      • 解决方案: 开释锁时判断操作是否实现, 减少守护线程:为锁超时加时,提早开释