了解Zookeeper/Zookeeper入门

欢迎来到zookeeper的世界


Apache ZooKeeper是一款致力于开发和维护开放源代码的高度可靠的分布式协调器的杰作。

什么是zookeeper?


zk是一个集配置服务、命名服务、分布式锁、分组服务的服务。这些服务经常在分布式系统中被用到这个或者那个。每次这些服务被实现时,都有大量的工作去做,比如修复bug以及不可避免的意外情况。鉴于实现这些服务的困难,很多应用开始去避免使用它们,这使得系统在面对变化时变得脆弱和难以应对。即便这些服务被正确的实现了,当应用发布后,不同的实现方式可能会导致管理复杂。

了解更多ZooKeeper的知识请点击 Zookeeper Wiki

获得开始


在一台机器或者一个小型集群上安装Zookeeper开始

  1. 通过读这个文档学习更多ZooKeeper
  2. 通过这个发行页面下载Zookeeper

获得参与


ZooKeeper是Apcahe软件基金会下的一个志愿者项目,我们鼓励你更多的了解这个项目并且捐赠你的慷慨,这里是几个参与者的链接

  1. 查看我们如何捐赠Zookeeper页面。
  2. 给我们反馈:什么我们可以做的更好?
  3. 参与邮件列表:和社区保持联系。

ZooKeeper(以下简称ZK)的核心功能

  • 1) 文件系统
  • 2) 通知机制

zk的核心功能只有以上两个,确构成了zk上的所有功能。文件系统指的是zk是一个类似windows资源管理功能的目录服务,不过他没有文件夹(目录)和文件之分,他只有节点NODE,也有人称为目录,每个NODE有名字,有值,也有其他属性,能存储少量的信息,这不由得让人想起设计模式的组合模式。

它的节点分为临时节点和永久,临时指的是创建节点的客户端需要一直和zk保持连接,一旦断开一段时间,节点就会被zk删除。

节点的另一个划分维度是顺序节点和非顺序节点,顺序节点zk会在节点名后加上 1,2,3...

两个维度组合出四种节点类型,四种节点类型在不同的应用场景中发挥着重要的作用。

通知机制,可以订阅zk节点,zk的节点发生变化(增删改)时便会通知订阅方,这使得它天然可以实现订阅-发布。

ZK可以做什么?


配置管理

我们的App总是需要很多的配置,比如properties文件,如果程序分散部署在多台机器上(前端做负载均衡),要修改配置,就需要逐个修改,不仅复杂还可能需要重启。现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就可以了,这是配置中心的思想。

名字服务

          名字服务可以类比JNDI,用不变(自定义个名字)封装、屏蔽变化,将易变化的value值,存储到一个固定的NODE上,当值发生变化时,收到通知,程序再做相应的变化。

分布式锁

          都耳熟能详了,解决多个JVM的线程无法共用一把锁的问题,既然无法共用,那么就锁抽离出来。因此无论ZK,还是redis/memcache,甚至数据库,只要多个JVM去同一个地方获取锁,就是分布式锁了。锁从某种程度上讲只是一个信号而已,当然具体采用哪种方案要根据并发量、性能要求做决定。curator中已有基于ZK的分布式锁的实现,它的锁类型更加丰富。

获取分布式锁的总体思路(排他锁)

在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。

客户端调用createNode方法在locker下创建临时顺序节点,然后调用getChildren(“locker”)来获取locker下面的所有子节点,如果发现自己在之前创建的子节点序号最小,那么就认为该客户端获取到了锁。

如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,对其注册事件监听器。

之后这个被关注的节点删除,则客户端会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如皋是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。

集群管理

所谓集群管理无在乎两点:①是否有机器退出 ②加入选举master。 

对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,增加机器时,机器向父目录下写入自己的节点;如果挂掉,超过一定时间zk会自动删除。客户端只需要订阅读取该目录就可以调用到后方的server,且与之解耦,server可以根据需要随意增减机器。

client端从zk上获取server列表保存在本地,每次从本地存根中随机(或者其他负载算法)取一个调用。 当然客户端要做失败重试,因为server挂掉的通知不会太及时地通知到客户端,往往有几秒钟的时间,dubbo就是这个功能典型的应用。

对于第二点,我们自定义下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。

另外cutator也实现了选举功能,基于paxos协议。

分布式计数器

分布式队列

参考

http://zookeeper.apache.org/

https://www.cnblogs.com/felixzh/p/5869212.html

https://www.jianshu.com/p/70151fc0ef5d

猜你喜欢

转载自blog.csdn.net/flyfeifei66/article/details/82497385