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

[经验分享] zookeeper学习之二(高级特性)

[复制链接]

尚未签到

发表于 2017-4-19 08:33:27 | 显示全部楼层 |阅读模式
一、三个概念
 
1.CreateMode
在create的时候可以设置znode的类型
  主要有四种:
  PERSISTENT (持续的,相对于EPHEMERAL,不会随着client的断开而消失)
  PERSISTENT_SEQUENTIAL(持久的且带顺序的)
  EPHEMERAL (短暂的,生命周期依赖于client session)
  EPHEMERAL_SEQUENTIAL  (短暂的,带顺序的)
   
  2.Watcher
  Watcher是一种反向推送机制,即zonde(包括他的child)有改变的时候会通知客户端。
  可以自定义Watcher,注册给zonde。
  watcher分为两大类:data watches和child watches。前者监听数据的变动,后者监听子node的变动。
  Watcher是一次性的!一旦被调用,则需要重新注册。
   
  3.ACL
  acl即access control。zookeeper通过ACL机制来控制权限。创建znode的时候可以指定。前边我们讲过,一套zookeeper会被多个程序使用。就像linux支持多用户一样。所以需要有一套权限控制:不然自己创建的节点,被别的应用程序无缘无故删了,那找谁去?
   
  Zookeeper的权限级别:
  READ: 允许获取该节点的值和列出子节点。
  WRITE: 允许设置该节点的值。
  CREATE: 允许创建子节点。
  DELETE: 可以删除子节点。
  ADMIN: 超级权限。相当于root
  从上到下递次增强,后面的权限包含前面的权限。
   
   
  zookeeper的很多高级特性,都是基于以上三个概念来实现的。特别是CreateMode和Watcher
   
  二、java客户端
  zookeeper官方提供了java客户端。提供的接口也比较基础。比前一篇测试用到的telnet客户端唯一强的一点就是:我们可以在代码里实现Watcher接口实现扩展的业务!在命令行可是做不到这点的。。
  maven依赖:

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
   下面是一些重要的接口列表。
  
DSC0000.jpg
 
   接口都很直观,描述也很详细。就不做额外的说明了。
  三、一些高级特性实现原理。
   
  1.Name Service:有点类似JNDI,树形目录天生的就有全局唯一名称。这功能实践中也没什么用,而且替代方案也很多。略。
   
  2.配置推送:比如某个前端网站有100台机器,我们要做的是在每台机器上都有一个main程序连zookeeper,注册好Watcher。在本地连zookeeper把配置写入,zookeeper就会通过Watcher,自动把配置推送到这些机器上。而不需要去手动去更新。(相当于运维的脚本。)
  
DSC0001.jpg
 
   
  3.集群管理:
  每个Server起来之后都在 Zookeeper 上创建一个 EPHEMERAL 类型的znode,假设他们都有一个共同的父GroupMembers!我们在每个Server上调用getChildren(GroupMembers)方法,并注册一个 Child Watcher。由于是 EPHEMERAL 的znode,当创建它的 Server 死去,这个znode也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watcher 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。
   
  4.Leader选举
  和集群管理的设计基本一样,不同的地方是,这次创建的znone类型是EPHEMERAL_SEQUENTIAL ,不仅仅随着member的同生同灭,而且是有顺序的。我们只要把编号最小的member认为是Master,就可以做到Leader的动态选举!
   
  
DSC0002.jpg
 
   
  5.全局锁
       zookeeper可以利用他优秀的数据一致性算法来提供可靠的全局锁服务。
  获得锁是一个递归的过程
  1.创建znode "/distributed_lock"
  2.在distributed_lock下新建子节点"/distributed_lock/xxxxxx",EPHEMERAL_SEQUENTIAL 模式,当前序号假如是i。
  3.对distributed_lock调用getChildren(),如果i是children列表里最小的,则获得锁;否则进入第4步
  4.等待children列表里紧跟在i后边的那个节点被删除的通知(exists()方法)。记为j。而j又依赖于仅比j小的节点k。一直递归等待最小的znode的被删除。。
   
  注:虽然EPHEMERAL_SEQUENTIAL是递增的,但仍然不能粗暴的认为紧跟在i后边的节点j=i-1。这是因为释放锁的顺序并不是完全按照节点顺序!
   
  释放锁:
  删除自己创建的子节点即可
   
  6.分布式队列
  类似于上边全局锁的设计。只要确保每次消费的时候编号都是最小的。就能做到先进先出。
   
  7 。。。略  根据zookeeper创建节点类型的不同,再结合Watcher特性。还可以提供其他很多的功能。比如各种类型queue,各种类型的Lock(上面仅仅介绍了write锁),barriers,信号量Semaphore  原子类型AtomicInteger等等。。。
  所有的这些都是分布式的,高可靠的。
  更多更全的功能在netflix 公司开源的 zookeeper客户端Curator中有实现。作为普通开发者,直接使用Curator是最高效的!
   
  还等什么,一起移步下篇  zookeeper学习之三(Curator客户端)
   
   本文参考:
  http://zookeeper.apache.org/
  http://curator.apache.org/curator-recipes/index.html
  http://www.cnblogs.com/zhangchaoyang/articles/2536178.html
  http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
   

运维网声明 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-366122-1-1.html 上篇帖子: Zookeeper常用命令转载 下篇帖子: zookeeper学习之二(高级特性)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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