zookeeper适用场景:分布式锁实现
2016-06-08 14:11
399 查看
在zookeeper应用场景有关于分布式集群配置文件同步问题的描述,设想一下如果有100台机器同时对同一台机器上某个文件进行修改,如何才能保证文本不会被写乱,这就是最简单的分布式锁,本文介绍利用zk实现分布式锁。下面是写锁的实现步骤
分布式写锁
create一个PERSISTENT类型的znode,/Locks/write_lock
客户端创建SEQUENCE|EPHEMERAL类型的znode,名字是lockid开头,创建的znode是/Locks/write_lock/lockid0000000001
调用getChildren()不要设置Watcher获取/Locks/write_lock下的znode列表
判断自己步骤2创建znode是不是znode列表中最小的一个,如果是就代表获得了锁,如果不是往下走
调用exists()判断步骤2自己创建的节点编号小1的znode节点(也就是获取的znode节点列表中最小的znode),并且设置Watcher,如果exists()返回false,执行步骤3
如果exists()返回true,那么等待zk通知,从而在回掉函数里返回执行步骤3
释放锁就是删除znode节点或者断开连接就行
*注意:上面步骤2中getChildren()不设置Watcher的原因是,防止羊群效应,如果getChildren()设置了Watcher,那
么集群一抖动都会收到通知。在整个分布式锁的竞争过程中,大量重复运行,并且绝大多数的运行结果都是判断出自己并非是序号最小的节点,从而继续等待下一次
通知—,这个显然看起来不怎么科学。客户端无端的接受到过多的和自己不相关的事件通知,这如果在集群规模大的时候,会对Server造成很大的性能影响,
并且如果一旦同一时间有多个节点的客户端断开连接,这个时候,服务器就会像其余客户端发送大量的事件通知——这就是所谓的羊群效应。
分布式写锁
create一个PERSISTENT类型的znode,/Locks/write_lock
客户端创建SEQUENCE|EPHEMERAL类型的znode,名字是lockid开头,创建的znode是/Locks/write_lock/lockid0000000001
调用getChildren()不要设置Watcher获取/Locks/write_lock下的znode列表
判断自己步骤2创建znode是不是znode列表中最小的一个,如果是就代表获得了锁,如果不是往下走
调用exists()判断步骤2自己创建的节点编号小1的znode节点(也就是获取的znode节点列表中最小的znode),并且设置Watcher,如果exists()返回false,执行步骤3
如果exists()返回true,那么等待zk通知,从而在回掉函数里返回执行步骤3
释放锁就是删除znode节点或者断开连接就行
*注意:上面步骤2中getChildren()不设置Watcher的原因是,防止羊群效应,如果getChildren()设置了Watcher,那
么集群一抖动都会收到通知。在整个分布式锁的竞争过程中,大量重复运行,并且绝大多数的运行结果都是判断出自己并非是序号最小的节点,从而继续等待下一次
通知—,这个显然看起来不怎么科学。客户端无端的接受到过多的和自己不相关的事件通知,这如果在集群规模大的时候,会对Server造成很大的性能影响,
并且如果一旦同一时间有多个节点的客户端断开连接,这个时候,服务器就会像其余客户端发送大量的事件通知——这就是所谓的羊群效应。
相关文章推荐
- 用Hadoop1.0.3实现KMeans算法
- Logistic回归---从疝气病症预测马的死亡率
- JavaScript onmousewheel鼠标滚轮示例
- React.render is not a function
- Java中使用WebUploader插件上传大文件单文件和多文件的方法小结
- 项目适配iOS9遇到的一些问题及解决办法
- ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图
- JavaScript Cookie的使用实例
- hadoop下实现kmeans算法——一个mapreduce的实现方法
- android webview与js交互时遇到的问题解决
- javascript 使用btoa和atob来进行Base64转码和解码
- linux网络编程常用头文件总结
- gulp详细学习教程
- ADE simulation的背后
- Crossin先生的微信打飞机游戏(2)
- hadoop下的Kmeans算法实现
- 使用Thinkphp框架开发移动端接口
- 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
- docker on mac:误删default vm的处理方法
- python中xrange和yield的用法