Zookeeper 分布式锁原理
2016-11-19 16:55
204 查看
Zookeeper节点类型
持久节点:PERSISTENT:创建后,一直存着,直至手动删除。
临时节点:EPHEMERAL
临时节点的生命周期和客户端会话绑定。
临时节点不能创建子节点
特殊属性:SEQUENTIAL属性。
节点被创建的时候,Zookeeper自动在节点名后的追加整数数字,由父节点维护的自增节点
因此有可以划分出两类:
持久顺序节点:PERSISTENT_SEQUENTIAL
临时顺序节点:EPHEMERAL_SEQUENTIAL
zookeeper分布式锁的原理
锁分:排它锁(X 锁),共享锁(S 锁);示例:/exclusive_lock/lock 该节点被定义为锁
排它锁(X 锁)的核心:保证当前有且只有一个事务获得锁,并且锁被释放后,所有正在等待锁的事务能被通知到。
X锁获取过程:所有客户端通过create()创建锁,在该锁位置下创建临时节点/exclusive_lock/lock。但有且只有一个能够创建成功。该客户端获得锁,其他客户端到该节点上注册节点变更Watcher监听。
X锁释放过程:由于是临时节点,通过2种方式释放锁
当前获取锁的客户端会话失效,Zookeeper删除该临时节点
正常执行完业务逻辑,客户端主动删除该临时节点
当锁释放后,通知所有注册Watcher的客户端,重新开始竞争锁
注:红色字体已避免"羊群效应"
共享锁 (S 锁)的核心:不同的事务可以同时对一个数据对象进行读取操作,而更新操作必须在当前没有事务进行读写情况下进行。
示例:/shared_lock/[hostname]-请求类型-序列
S锁获取过程:所有客户端在/shared_lock/该节点创建临时顺序节点。
如果是读操作,创建类似/shared_lock/192.168.0.1-R-0000000001
如果是写操作,创建类似/shared_lock/192.168.0.1-W-0000000001
getChildren()获取所有已创建的子节点信息,确定自己在该子节点所在的位置
对于读操作:如果没有比自己序列小,或者所有比自己小的序列都是读操作,标明可以获取S锁,开始执行读取操作;如果碰到有比自己序列小的写操作,进入等待状态。如果进入等待状态,调用exist()对比自己小的最后一个写节点进行Watcher监视。
对于写操作:如果自己不是序列中最小的,进入等待状态。如果进入等待状态,向比自己序列小的最后一个写节点注册Watcher监视。
S锁释放过程:与X锁释放过程一致
参考资料:
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》
相关文章推荐
- 分布式系统设计原理与方案Dubbo+Zookeeper+Spring整合
- zookeeper分布式锁的原理
- zookeeper分布式锁的原理
- Zookeeper详细教程、分布式协调服务原理
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
- 分布式指南zookeeper的原理及应
- zookeeper 分布式锁原理:
- Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务
- hadoop-2.7.4+hbase-1.3.1+zookeeper-3.4.9搭建分布式集群环境
- 使用redis和zookeeper实现分布式锁
- Zookeeper在大型分布式系统中的应用
- zookeeper深入学习(3)---简单分布式共享锁的实现
- zookeeper使用和原理探究(一)
- 分布式服务协调员zookeeper - 应用场景和监控
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- zookeeper分布式配置管理
- 分布式服务下的交易一致性原理及解决(下)
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- zookeeper 和分布式系统的一般问题
- 分布式架构中一致性解决方案——Zookeeper集群搭建