分布式协调服务
- 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 判断是否为本过程的锁
-
在设置锁超时的状况下, 操作没有实现
- 解决方案: 开释锁时判断操作是否实现, 减少守护线程: 为锁超时加时, 提早开释
-