设为首页 收藏本站
查看: 961|回复: 0

[经验分享] zookeeper实现的一个锁

[复制链接]

尚未签到

发表于 2015-9-7 08:19:57 | 显示全部楼层 |阅读模式
  要求: 分布在不同机器上的进程,同时扫描某个ftp目录,得到文件目录,下载文件,但是要保证每个文件都只被一个进程获取


思路:
1.  文件以RW方式打开,比较暴力 ,另FTP支持RW方式打开吗。。。没了解过
2.  实现一个分布式锁,
  2.1  redis:   
         redis单机的事务能否实现?   应该可以,保证一个list,然后不断poll即可。
         redis集群的一致性能否实现?  从表面上看,最终一致性不能保证。。。。。 ------------- 待测试验证
         http://redisbook.com/preview/replication/replicate-before-2-8.html
        http://redisbook.com/

2.2 zookeeper
zookeeper状态信息:  http://coolxing.iteye.com/blog/1871328
zookeeper使用帮助:http://zookeeper.apache.org/doc/trunk/recipes.html
zookeeper介绍及典型场景: http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
apache- zookeeper-lock :  https://svn.apache.org/repos/asf/zookeeper/trunk/src/recipes/lock/src/java/org/apache/zookeeper/recipes/lock/WriteLock.java

  
实现时候的zookeeper内文件结构:

[zk: localhost:2181(CONNECTED) 79] ls /na/lock/ftp/2014/12/01/test6/0.log
[x-309002431815222022-0000000001, x-164887243784979208-0000000000, x-381060026091242234-0000000002]
/na/lock/ftp/2014/12/01/test6/0.log 是 目标文件
x-309002431815222022-0000000001, x-164887243784979208-0000000000, x-381060026091242234-0000000002 是3个客户端创建的子文件
子文件结构  x- [sessionid] - [zk内部sequence]   309002431815222022 是sessionid  0000000001 是 seq
3个客户端提交的create请求将在zk内部通过类似cas(或者就是cas)来竞争达到排序的目的,然后大家看谁的seq最靠前谁就获得锁。

   apache提供的lock需要改进的地方:
       1. path自适应,parent不存在的时候能够自动创建parent
       2. 两个进程中的线程同时create一个文件的时候会有keeperexception,需要catch下,判定有exception的没有获取到锁
       3. znodename做sortmap的时候,拿prefix在内做了compare,容易出问题,需要改成直接拿sequence比较。
           int answer = this.prefix.compareTo(that.prefix);    // --  line79
=》
         // int answer = this.prefix.compareTo(that.prefix); 注释掉
       4. create子节点的时候,line186,用了临时的SEQUENTIAL文件类别,原意是控制单个文件的并发写入,这个文件是可以重入的,在锁占用进程关闭zkclient之后,另外的进程是可以进入的。但是在本案例中,文件下载下来就不能再处理了,所以要改成PERSISTENT_SEQUENTIAL
   code如下 :
           id = zookeeper.create(dir + "/" + prefix, data, getAcl(), CreateMode.EPHEMERAL_SEQUENTIAL);
=>
           id = zookeeper.create(dir + "/" + prefix, data, getAcl(), CreateMode.PERSISTENT_SEQUENTIAL);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-110332-1-1.html 上篇帖子: windows安装zookeeper单机版 下篇帖子: Hadoop学习之ZooKeeper理论知识和集群安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表