想了解ZooKeeper,看这篇就够了
一、ZooKeeper是什么
ZooKeeper是一个集群管理者,监视集群中节点的状态,并根据状态进行下一步操作
ZooKeeper读请求是全局开放的,集群中的任意一台机器都可以处理,读请求在节点上注册监听器时,这个监听器的请是由链接的ZooKeeper机器处理
写请求会发给其他ZooKeeper机器,达成一致后,请求才返回
ZooKeeper机器越多,读请求吞吐量会提高但写请求会下降。
每个更新都有全局有序的,都唯一的时间戳(zxid)。读请求智慧相对于更新有序,每次读请求都会带有zxid。
二、ZooKeeper能提供什么
-
文件系统:提供多层级节点命名空间(znode),每个节点存放数据上限为1M。这些节点都可以设置关联的数据,为了保证高吞吐量和低延迟,在内存中维护树状目录结构,但不能存放大量数据
-
通知机制:client对这个某个znode建立一个watcher,但观察到节点发生变化时,这些client会收到zk的通知,然后client进行对应的业务操作
三、ZooKeeper能做什么:
-
命名服务:命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
-
配置管理 :程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。
-
集群管理 :所谓集群管理无在乎两点:是否有机器退出和加入、选举master。对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。
-
分布式锁 :有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。
-
队列管理:两种类型的队列:
-
同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
-
队列按照 FIFO 方式进行入队和出队操作。
-
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。
四、数据复制
Zookeeper作为一个集群提供一致的数据服务,自然,它要在所有机器间做数据复制。数据复制的好处:
-
容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作;
-
提高系统的扩展能力 :把负载分布到多个节点上,或者增加节点来提高系统的负载能力;
-
提高性能:让客户端本地访问就近的节点,提高用户访问速度。
从客户端读写访问的透明度来看,数据复制集群系统分下面两种:
-
写主(WriteMaster) :对数据的修改提交给指定的节点。读无此限制,可以读取任何一个节点。这种情况下客户端需要对读与写进行区别,俗称读写分离;
-
写任意(Write Any):对数据的修改可提交给任意的节点,跟读一样。这种情况下,客户端对集群节点的角色与变化透明。
对zookeeper来说,它采用的方式是写任意。通过增加机器,它的读吞吐能力和响应能力扩展性非常好,而写,随着机器的增多吞吐能力肯定下降(这也是它建立observer的原因),而响应能力则取决于具体实现方式,是延迟复制保持最终一致性,还是立即复制快速响应。
五、工作原理
Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。