ZooKeeper知识总结

Posted DEFECT FIXER

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeper知识总结相关的知识,希望对你有一定的参考价值。

数据模型

ZooKeeper数据模型是一个树状的数据结构,类似于文件系统;和文件系统的区别在于树中的每一个节点(叶子节点与非叶子节点)都可以保存数据,且每个节点的访问都必须从根节点开始,以斜线作为分隔的访问路径,如 /root/a/b/,它没有相对路径的概念,所有的节点都必须通过绝对路径来访问;

Znode

ZooKeeper树中的节点被称之为znode,znode维护了一个stat结构,其中包含了版本号和时间戳;版本号是一直递增的,每一次znode中包含的数据被更新,版本号也会发生改变;

当客户端尝试去更新或者删除一个znode的时候,必须提供它要更新/删除的znode的当前版本号,如果版本号不正确,这个更新/删除就会失败(有点类似于数据库操作的乐观锁)。

观察者

客户端可以给znode添加一个观察者(类似于事件),当znode发生改变时,这个观察者会被触发,相应的客户端就会收到一个通知;

Zookeeper客户端可以给三个操作设置观察者:exists、getChildren、getData:

操作 触发的时间点
getChildren 当znode的子节点被创建或者删除、当znode自身被删除时触发
exists 当znode被创建、删除,或者数据被更新时触发
getData 当znode被删除或znode的数据被更新时触发

观察者只会被触发一次,如果想被多次触发,则需要在触发之后重新注册;观察者的常用地方在于,使用ZooKeeper作为一个配置中心,各个客户端(应用程序)通过观察者监听znode从而获取最新的配置;

顺序性Znode

当创建一个Znode时,你可以要求ZooKeeper添加一个单调递增的计数器到这个znode上,这样你就可以在同一个父节点下创建多个相同的znode,而每个znode会以一串数字结尾,并单调递增;

这个计数器只在同一个父节点下唯一,最大值为2147483647,超过之后则会溢出;

暂时性Znode

Znode包含两种类型:暂时性znode持久性znode;当创建这个znode的客户端session超时时,暂时性znode会被删除,而持久性的znode与客户端session无关,只能被显式的删除;

暂时性Znode不能有子节点,但它对所有的客户端是可见的;

顺序性Znode和暂时性Znode相结合可以作为分布式锁,具体操作为:创建顺序性znode的最小值的客户端作为分布式锁的获得者,当这个客户端关闭Session时,其创建的znode会被删除,而剩下的顺序性znode最小值的创建者将捕获这个分布式锁;为避免惊群效应,每一个客户端只需要在比它稍小的那个znode上设置一个观察者,这样当znode被删除时,只会唤醒一个客户端。

一致性

选举

ZooKeeper使用Master/Slave模式,通过ZAB算法实现Leader的选举机制;

ZooKeeper的所有机器可以分为三类:Leader、Follower、Learner,Learner主要用于同步Znode数据,因此选举主要在多个Follower之间进行;目的主要在多个Follower中选举出持有zxid和myid(ZooKeeper服务器的标识ID)相对较大(超过过半数的zxid+myid即可)的那个机器作为Leader;

在ZooKeeper集群中的每一个更新操作都会有一个全局性的唯一性标识,这个标识叫做zxid,又称之为ZooKeeper的事务ID,它永远是递增的;

Zxid是一个64位的数字,包含两部分:任期(epoch)和计数器(counter);其中高32位为任期,低32位为计数器;当一个新的Leader选举出来之后,任期会加1,在同一个Leader任期内保持计数器(counter)递增,通过此种方式记录操作的顺序性。

ZAB算法的核心在于多个Follower之间两两比较,如果一个Follower的zxid + myidn/2+1(n为Follower的总数)个Follower都大,则会被选举出来作为Leader;

正因为选举需要比较过半数的Follower,如果过半数的Follower宕机,则集群崩溃。

写操作

ZooKeeper集群的写操作都是由Leader来完成的,然后再通过Leader同步到Follower,Zookeeper在返回结果到客户端之前并不会保证会同步到所有的Follower,只需要过半(n/2+1)Follower同步成功即可;

读操作

客户端可以连接到集群中任何一台机器进行读操作,但不能保证都能读到最新的数据,因此在getData之前最好调用sync操作同步最新的数据再读取。

 

我的豆瓣账号:https://www.douban.com/people/joenzhang

以上是关于ZooKeeper知识总结的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper协议篇-Paxos算法与ZAB协议,Java语言基础知识总结

【知识总结】6.服务注册发现框架比较(Consul/Zookeeper/etcd/Eureka)

2021大厂Java社招最全面试题,最全Java知识总结

成功从小公司跳槽进蚂蚁定级P6,最全Java知识总结

kafka知识总结

Dubbo相关知识总结