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