ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是
Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名
服务、分布式同步、组服务等。html
分布式协调服务就是为用户的分布式应用程序提供协调服务 。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。java
Zookeeper是为别的分布式程序服务的 ;node
Zookeeper自己就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务,因此通常zk都是奇数台服务器) linux
Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务…… 算法
zookeeper在底层其实只提供了两个功能:apache
管理(存储,读取)用户程序提交的数据;编程
并为用户程序提供数据节点监听服务;服务器
Zookeeper集群的角色: Leader 和 follower (Observer)
只要集群中有半数以上节点存活,集群就能提供服务网络
Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫作Znode
ZooKeeper包含一个简单的原语集,提供Java和C的接口。调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列session
分布式应用程序能够基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其
中分布锁和队列有Java和C两个版本,选举只有Java版本。
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,
有可能互相排斥致使没有一个proposer能提交成功,而Fast Paxos做了一些优化,经过选举产生一个leader,只
有leader才能提交proposer,具体算法可见Fast Paxos。所以,要想弄懂ZooKeeper首先得对Fast Paxos有所了
解。
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序能够基于它实现同步服务,配置维护和命名服务等。
一、选举Leader。
二、同步数据。
三、选举Leader过程当中算法有不少,但要达到的选举标准是一致的。
四、Leader要具备最高的zxid。
五、集群中大多数的机器获得响应并follow选出的Leader。
Znode分为四种类型:
1.持久节点 (PERSISTENT)
默认的节点类型。建立节点的客户端与zookeeper断开链接后,该节点依旧存在 。
2.持久节点顺序节点(PERSISTENT_SEQUENTIAL)
所谓顺序节点,就是在建立节点时,Zookeeper根据建立的时间顺序给该节点名称进行编号:
3.临时节点(EPHEMERAL)
和持久节点相反,当建立节点的客户端与zookeeper断开链接后,临时节点会被删除:
4.临时顺序节点(EPHEMERAL_SEQUENTIAL)
顾名思义,临时顺序节点结合和临时节点和顺序节点的特色:在建立节点时,Zookeeper根据建立的时间顺序给该节点名称进行编号;当建立节点的客户端与zookeeper断开链接后,临时节点会被删除。
获取锁
首先,在Zookeeper当中建立一个持久节点ParentLock。当第一个客户端想要得到锁时,须要在ParentLock这个节点下面建立一个临时顺序节点 Lock1。
以后,Client1查找ParentLock下面全部的临时顺序节点并排序,判断本身所建立的节点Lock1是否是顺序最靠前的一个。若是是第一个节点,则成功得到锁。
若是再有一个客户端 Client2 前来获取锁,则在ParentLock下载再建立一个临时顺序节点Lock2。
Client2查找ParentLock下面全部的临时顺序节点并排序,判断本身所建立的节点Lock2是否是顺序最靠前的一个,结果发现节点Lock2并非最小的。
因而,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。
若是又有一个客户端Client3前来获取锁,则在ParentLock下载再建立一个临时顺序节点Lock3。
Client3查找ParentLock下面全部的临时顺序节点并排序,判断本身所建立的节点Lock3是否是顺序最靠前的一个,结果一样发现节点Lock3并非最小的。
因而,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3一样抢锁失败,进入了等待状态。
这样一来,Client1获得了锁,Client2监听了Lock1,Client3监听了Lock2。这偏偏造成了一个等待队列,很像是Java当中ReentrantLock所依赖的AQS(AbstractQueuedSynchronizer)。
释放锁
释放锁分为两种状况:
1.任务完成,客户端显示释放
当任务完成时,Client1会显示调用删除节点Lock1的指令。
2.任务执行过程当中,客户端崩溃
得到锁的Client1在任务执行过程当中,若是Duang的一声崩溃,则会断开与Zookeeper服务端的连接。根据临时节点的特性,相关联的节点Lock1会随之自动删除。
因为Client2一直监听着Lock1的存在状态,当Lock1节点被删除,Client2会马上收到通知。这时候Client2会再次查询ParentLock下面的全部节点,确认本身建立的节点Lock2是否是目前最小的节点。若是是最小,则Client2瓜熟蒂落得到了锁。
同理,若是Client2也由于任务完成或者节点崩溃而删除了节点Lock2,那么Client3就会接到通知。
最终,Client3成功获得了锁。
用Zookeeper实现分布式锁和Redis实现分布式锁的区别
Zookeeper和Redis分布式锁的比较
下面的表格总结了Zookeeper和Redis分布式锁的优缺点:
Zookeeper和Redis实现的分布式锁支持可重入,二者均可以在客户端实现可重入逻辑。者均可以在客户端实现可重入逻辑。
Zookeeper TTL机制
键值系统有一个对应用配置颇有帮助的特性,能够给每个键或目录指定一个存活时限(TTL,即Time To Life)。TTL的单位是秒,当指定的秒数过去之后,若是相应的键或目录没有获得更新,就会被自动从Etcd记录中移除。
在zookeeper中,当你建立一个PERSISTENT或者PERSISTENT_SEQUENTIAL的节点的时候,能够有选择性给这个节点设置一个毫秒的TTL时间,若是这个节点在ttl时间以内没有获得更新而且没有孩子节点,这个节点就会在server端被删除掉。
什么是TTL : https://blog.csdn.net/Frozen_fish/article/details/2245462
TTL(生存时间)介绍 :https://blog.csdn.net/tanga842428/article/details/52932221
1.最终一致性:client不论链接到哪一个Server,展现给它都是同一个视图,这是zookeeper最重要的功能。
2.可靠性:具备简单、健壮、良好的性能,若是消息m被到一台服务器接受,那么它将被全部的服务器接受。
3.实时性:Zookeeper保证客户端将在一个时间间隔范围内得到服务器的更新信息,或者服务器失效的信息。但因为网络延时等缘由,Zookeeper不能保证两个客户端能同时获得刚更新的数据,若是须要最新数据,应该在读数据以前调用sync()接口。
4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每一个client都能有效的等待。
5.原子性:更新只能成功或者失败,没有中间状态。
6.顺序性:包括全局有序和偏序两种:全局有序是指若是在一台服务器上消息a在消息b前发布,则在全部Server上消息a都将在消息b前被发布;偏序是指若是一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
ZooKeeper数据模型
Zookeeper会维护一个具备层次关系的数据结构,它很是相似于一个标准的文件系统,如图所示:
Zookeeper这种数据结构有以下这些特色:
1)每一个子目录项如NameService都被称做为znode,这个znode是被它所在的路径惟一标识,如Server1这个znode的标识为/NameService/Server1。
2)znode能够有子节点目录,而且每一个znode能够存储数据,注意EPHEMERAL(临时的)类型的目录节点不能有子节点目录。
3)znode是有版本的(version),每一个znode中存储的数据能够有多个版本,也就是一个访问路径中能够存储多份数据,version号自动增长。
4)znode的类型:
Persistent 节点,一旦被建立,便不会意外丢失,即便服务器所有重启也依然存在。每一个 Persist 节点便可包含数据,也可包含子节点。
Ephemeral 节点,在建立它的客户端与服务器间的 Session 结束时自动被删除。服务器重启会致使 Session 结束,所以 Ephemeral 类型的 znode 此时也会自动删除。
Non-sequence 节点,多个客户端同时建立同一 Non-sequence 节点时,只有一个可建立成功,其它匀失败。而且建立出的节点名称与建立时指定的节点名彻底同样。
Sequence 节点,建立出的节点名在指定的名称以后带有10位10进制数的序号。多个客户端建立同一名称的节点时,都能建立成功,只是序号不一样。
5)znode能够被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化能够通知设置监控的客户端,这个是Zookeeper的核心特性,Zookeeper的不少功能都是基于这个特性实现的。
6)ZXID:每次对Zookeeper的状态的改变都会产生一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,若是zxid1小于zxid2,则zxid1在zxid2以前发生。
ZooKeeper Session
Client和Zookeeper集群创建链接,整个session状态变化如图所示:
若是Client由于Timeout和Zookeeper Server失去链接,client处在CONNECTING状态,会自动尝试再去链接Server,若是在session有效期内再次成功链接到某个Server,则回到CONNECTED状态。
注意:若是由于网络状态很差,client和Server失去联系,client会停留在当前状态,会尝试主动再次链接Zookeeper Server。client不能宣称本身的session expired,session expired是由Zookeeper Server来决定的,client能够选择本身主动关闭session。
ZooKeeper Watch
Zookeeper watch是一种监听通知机制。Zookeeper全部的读操做getData(), getChildren()和 exists()均可以设置监视(watch),监视事件能够理解为一次性的触发器,官方定义以下: a watch event is one-time trigger, sent to the client that set the watch, whichoccurs when the data for which the watch was set changes。Watch的三个关键点:
*(一次性触发)One-time trigger
当设置监视的数据发生改变时,该监视事件会被发送到客户端,例如,若是客户端调用了getData("/znode1", true) 而且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件,而若是 /znode1 再一次发生了变化,除非客户端再次对/znode1 设置监视,不然客户端不会收到事件通知。
*(发送至客户端)Sent to the client
Zookeeper客户端和服务端是经过 socket 进行通讯的,因为网络存在故障,因此监视事件颇有可能不会成功地到达客户端,监视事件是异步发送至监视者的,Zookeeper 自己提供了顺序保证(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的znode发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event)。网络延迟或者其余因素可能致使不一样的客户端在不一样的时刻感知某一监视事件,可是不一样的客户端所看到的一切具备一致的顺序。
*(被设置 watch 的数据)The data for which the watch was set
这意味着znode节点自己具备不一样的改变方式。你也能够想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视(data watches and child watches) getData() 和exists()设置数据监视,getChildren()设置子节点监视。或者你也能够想象 Zookeeper 设置的不一样监视返回不一样的数据,getData() 和 exists() 返回znode节点的相关信息,而getChildren() 返回子节点列表。所以,setData() 会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的create() 操做则会出发当前节点上所设置的数据监视以及父节点的子节点监视。一次成功的 delete操做将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的child watch。
Zookeeper 中的监视是轻量级的,所以容易设置、维护和分发。当客户端与 Zookeeper 服务器失去联系时,客户端并不会收到监视事件的通知,只有当客户端从新链接后,若在必要的状况下,之前注册的监视会从新被注册并触发,对于开发人员来讲这一般是透明的。只有一种状况会致使监视事件的丢失,即:经过exists()设置了某个znode节点的监视,可是若是某个客户端在此znode节点被建立和删除的时间间隔内与zookeeper服务器失去了联系,该客户端即便稍后从新链接 zookeeper服务器后也得不到事件通知。
Consistency Guarantees
Zookeeper是一个高效的、可扩展的服务,read和write操做都被设计为快速的,read比write操做更快。
顺序一致性(Sequential Consistency):从一个客户端来的更新请求会被顺序执行。
原子性(Atomicity):更新要么成功要么失败,没有部分红功的状况。
惟一的系统镜像(Single System Image):不管客户端链接到哪一个Server,看到系统镜像是一致的。
可靠性(Reliability):更新一旦有效,持续有效,直到被覆盖。
时间线(Timeliness):保证在必定的时间内各个客户端看到的系统信息是一致的。
ZooKeeper的工做原理
在zookeeper的集群中,各个节点共有下面3种角色和4种状态:
角色:leader,follower,observer
状态:leading,following,observing,looking
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫作Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步之后,恢复模式就结束了。状态同步保证了leader和Server具备相同的系统状态。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。全部的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
每一个Server在工做过程当中有4种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻。
LEADING:当前Server即为选举出来的leader。
FOLLOWING:leader已经选举出来,当前Server与之同步。
OBSERVING:observer的行为在大多数状况下与follower彻底一致,可是他们不参加选举和投票,而仅仅接受(observing)选举和投票的结果。
Leader Election
当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式须要从新选举出一个新的leader,让全部的Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程:
1.选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
2.选举线程首先向全部Server发起一次询问(包括本身);
3.选举线程收到回复后,验证是不是本身发起的询问(验证zxid是否一致),而后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
4.收到全部Server回复之后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
5.线程将当前zxid最大的Server设置为当前Server要推荐的Leader,若是此时获胜的Server得到n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置本身的状态,不然,继续这个过程,直到leader被选举出来。
经过流程分析咱们能够得出:要使Leader得到多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1.
每一个Server启动后都会重复以上流程。在恢复模式下,若是是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并按期进行快照,方便在恢复时进行状态恢复。
fast paxos流程是在选举过程当中,某Server首先向全部Server提议本身要成为leader,当其它Server收到提议之后,解决epoch和zxid的冲突,并接受对方的提议,而后向对方发送接受提议完成的消息,重复这个流程,最后必定能选举出Leader。
Leader工做流程
Leader主要有三个功能:
1.恢复数据;
2.维持与follower的心跳,接收follower请求并判断follower的请求消息类型;
3.follower的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不一样的消息类型,进行不一样的处理。
PING消息是指follower的心跳信息;REQUEST消息是follower发送的提议信息,包括写请求及同步请求;
ACK消息是follower的对提议的回复,超过半数的follower经过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。
Follower工做流程
Follower主要有四个功能:
1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2.接收Leader消息并进行处理;
3.接收Client的请求,若是为写请求,发送给Leader进行投票;
4.返回Client结果。
Follower的消息循环处理以下几种来自Leader的消息:
1.PING消息:心跳消息
2.PROPOSAL消息:Leader发起的提案,要求Follower投票
3.COMMIT消息:服务器端最新一次提案的信息
4.UPTODATE消息:代表同步完成
5.REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session仍是容许其接受消息
6.SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制获得最新的更新。
Zab: Broadcasting State Updates
Zookeeper Server接收到一次request,若是是follower,会转发给leader,Leader执行请求并经过Transaction的形式广播此次执行。Zookeeper集群如何决定一个Transaction是否被commit执行?经过“两段提交协议”(a two-phase commit):
Leader给全部的follower发送一个PROPOSAL消息。
一个follower接收到此次PROPOSAL消息,写到磁盘,发送给leader一个ACK消息,告知已经收到。
当Leader收到法定人数(quorum)的follower的ACK时候,发送commit消息执行。
Zab协议保证:
1) 若是leader以T1和T2的顺序广播,那么全部的Server必须先执行T1,再执行T2。
2) 若是任意一个Server以T一、T2的顺序commit执行,其余全部的Server也必须以T一、T2的顺序执行。
“两段提交协议”最大的问题是若是Leader发送了PROPOSAL消息后crash或暂时失去链接,会致使整个集群处在一种不肯定的状态(follower不知道该放弃此次提交仍是执行提交)。Zookeeper这时会选出新的leader,请求处理也会移到新的leader上,不一样的leader由不一样的epoch标识。切换Leader时,须要解决下面两个问题:
1. Never forget delivered messages
Leader在COMMIT投递到任何一台follower以前crash,只有它本身commit了。新Leader必须保证这个事务也必须commit。
2. Let go of messages that are skipped
Leader产生某个proposal,可是在crash以前,没有follower看到这个proposal。该server恢复时,必须丢弃这个proposal。
Zookeeper会尽可能保证不会同时有2个活动的Leader,由于2个不一样的Leader会致使集群处在一种不一致的状态,因此Zab协议同时保证:
1) 在新的leader广播Transaction以前,先前Leader commit的Transaction都会先执行。
2) 在任意时刻,都不会有2个Server同时有法定人数(quorum)的支持者。
这里的quorum是一半以上的Server数目,确切的说是有投票权力的Server(不包括Observer)。
总结:简单介绍了Zookeeper的基本原理,数据模型,Session,Watch机制,一致性保证,Leader Election,Leader和Follower的工做流程和Zab协议。
下载zookeeper-3.4.6安装包
[root@localhosts ~]# cd/usr/developSoft/
[root@localhosts ~]# wget http://www.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解压到 /usr/local/ 目录下
[root@localhosts ~]# tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
进入/usr/local/zookeeper-3.4.6/bin目录
./zkServer.sh start 启动服务
./zkServer.sh stop 中止服务
下载zookeeper的安装包以后, 解压到合适目录. 进入zookeeper目录下的conf子目录
将zoo_sample.cfg复制一份成zoo.cfg
在解压的目录中建立data和logs目录
个人目录:
/opt/zookeeper-3.4.8/data
/opt/zookeeper-3.4.8/logs
配置zoo.cfg
[root@localhosts ~]# cd /usr/local/zookeeper-3.4.6/conf
[root@localhosts ~]# vi zoo.cfg
修改
dataDir=/opt/zookeeper-3.4.8/data
增长
dataLogDir=/opt/zookeeper-3.4.8/logs
保存退出
启动zookeeper
进入bin目录
[root@localhosts ~]# cd bin
./zkServer.sh start-foreground #之前台程序启动服务
或者
./zkServer.sh start #之后台程序启动zkServer 服务器
./zkServer.shstop #中止zkServer服务器
使用客户端链接
./zkCli.sh
配置文件zoo.cfg参数说明:
tickTime:这个时间是做为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是tickTime时间就会发送一个心跳
initLimit:这个配置项是用来配置zookeeper接收客户端(这所说的客户端是zookeeper服务器集群中链接到leader的Follower服务器)初始化链接时最长能忍受多少个心跳时间间隔数。当已经超过initLimit个心跳的时间(也就是tickTime)长度后zookeeper服务器尚未收到客户端的返回信息,那么代表这个客户端链接失败。总的时间长度就是tickTime * initLimit
syncLimit:这个配置标识Leader与Follower之间发送信息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是syncLimit * tickTime
clientPort:这个端口就是客户端链接zookeeper服务器的端口,zookeeper会监听这个端口,接收客户端的访问请求。
dataDir:存储数据的目录
dataLogDir:日志目录,若是不设置,会存放在dataDir
执行 tar -zxvf zookeeperXXX.tar.gz -C /modules
将zookeeper解压到指定的modules目录,根据用户本身的须要进行替换。
将zookeeper根目录中conf文件夹下的zoo_sample.cfg重命名为zoo.cfg,修改后zookeeper即可以识别到该文件
在该文件中根据须要添加以下配置:
#发送心跳的间隔时间,单位:毫秒 tickTime=2000 #zookeeper保存数据的目录 dataDir=/modules/zookeeper-3.4.5-cdh5.11.1/data #日志目录 dataLogDir=/modules/zookeeper-3.4.5-cdh5.11.1/dataLog #端口 clientPort=2181 #leader和follower初始化链接时最长能忍受多少个心跳时间的间隔数 initLimit=5 #leader和follower之间发送消息,请求和英达时间长度,最长不能超过多少个tickTime的时间长度 syncLimit=2 #zookeeper机器列表,server.order这里的Order依据集群的机器个数依次进行递增,这里的server一、server二、server3表示机器IP地址 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888
Ps:上面的data目录和dataLog目录默认是没有的,须要本身预先创建好。而且真正用户开发环境的配置文件,尽可能删除删掉上面的注释,以及多余的空白字符(划重点),有可能会形成zookeeper的读取失败
在server1机器中,在上面配置的data目录下,新建一个名为 myid的文件,文件内容填写 1,对的,没有听错,文件中只保留一个数字 1。zookeeper是根据该文件来决定zookeeper集群各个机器的身份分配。
通过上面的五个步骤zookeeper已经配置完毕,而后将其依次拷贝的集群的其余机器中。快捷一点可使用 scp 命令来作这件事:
scp 本地zookeeper安装目录 登录远程机器的用户名@远程机器地址 : 远程机器存放zookeeper的地址
eg:scp zookeeper skyler@slave1:/modules/
而后修改data目录的下的myid 文件中的数字,在这里即为将server2的myid内容修改成2,将server3的myid内容修改成3。对于不一样的集群,根据须要进行修改,与配置文件中的order保持一致。
修改完成后,在每台机器上依次使用bin/zkServer.sh start
来启动zookeeper服务,待启动完成后使用 bin/zkServer.sh status
来查看该机器的身份
使用 bin/zkCli.sh
来检验zookeeper是否能够链接成功,若出现以下提示,则表示zookeeper服务已经安装成功。
参考连接:https://blog.csdn.net/u011186019/article/details/65034540?locationNum=11&fps=1
参考:
《ZooKeeper—Distributed Process Coordination》 by FlavioJunqueira and Benjamin Reed
http://zookeeper.apache.org/doc/trunk/zookeeperOver.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
《ZooKeeper的一致性算法赏析》https://my.oschina.net/pingpangkuangmo/blog/778927
漫画:如何用Zookeeper实现分布式锁? :https://mp.weixin.qq.com/s/u8QDlrDj3Rl1YjY4TyKMCA
连接:
5分钟让你了解 ZooKeeper 的功能和原理 : https://www.jianshu.com/p/370f61549395
zookeeper的安装分为三种模式:单机模式、集群模式和伪集群模式。 : https://www.cnblogs.com/jxwch/p/6433310.html
zookeeper原理 : https://mp.weixin.qq.com/s/6S1YBp3ZpJYMeral2KADyw
ZooKeeper系列教学 : https://blog.csdn.net/weixin_39800144/article/details/79312457
一、Zookeeper深刻理解(一)(概念及基础)
http://hao0.me/zookeeper/2015/02/28/zk-basic.html
二、Zookeeper深刻理解(二)(编程实践之Master-Worker)
http://hao0.me/zookeeper/2015/03/02/zk-program-master-worker.html
三、Zookeeper深刻理解(二)(编程实践之故障处理)
http://hao0.me/zookeeper/2015/03/10/zk-failure.html
四、Zookeeper深刻理解(二)(编程实践之Zookeepr使用警告)
http://hao0.me/zookeeper/2015/03/15/zk-caveat-emptor.html
五、Zookeeper深刻理解(二)(编程实践之高级API:Curator)
http://hao0.me/zookeeper/2015/03/20/zk-curator.html
六、Zookeeper深刻理解(三)(Zookeeper管理以内部组件)
http://hao0.me/zookeeper/2015/03/25/zk-admin-internals.html
七、Zookeeper深刻理解(三)(Zookeeper管理之运维)
http://hao0.me/zookeeper/2015/04/25/zk-admin-running.html
zookeeper-概述:https://mp.weixin.qq.com/s/SSP1CiBvvMBCuLA6iOcT2g
zookeeper-原理:https://mp.weixin.qq.com/s/kzI7t546Mybhk9AUGAVroA
zookeeper原理 https://mp.weixin.qq.com/s/6S1YBp3ZpJYMeral2KADyw
zookeeper-理论基础-paxos协议:https://mp.weixin.qq.com/s/EhBUomPcg4lQ2woUdxKEmQ
zookeeper-理论基础-zab协议:https://mp.weixin.qq.com/s/cH1LZulz4PFTGu93OOYFRQ
构建高可用ZooKeeper集群 : https://www.csharpkit.com/2017-10-14_72138.html
又一个支持断线重连、永久watcher、递归操做 ZooKeeper 客户端 :https://www.csharpkit.com/2017-10-14_50672.html
支持断线重连、永久watcher、递归操做而且能跨平台(.NET Core)的ZooKeeper异步客户端 : https://www.csharpkit.com/2017-10-14_50632.html
zookeeper 基本原理 : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486649&idx=2&sn=208d5ee0a8c401b9bde345921e2a6881&chksm=e91b69a5de6ce0b34c072a354d4d5f8bae314197ab2921feeb4b6ac622dac1308b794165091e&scene=21#wechat_redirect
(W3Cschool)Zookeeper教程 : https://www.w3cschool.cn/zookeeper/index.html
zookeeper安装及使用(集群模式(可用于生产)配置):https://blog.csdn.net/jasnet_u/article/details/71514094
zookeeper机制原理 : https://blog.csdn.net/paul_wei2008/article/details/19355393
Zookeeper :https://blog.csdn.net/m0_37450089/article/category/7308836
使用zookeeper实现集群和负载均衡 : https://blog.csdn.net/hxpjava1/article/details/8612228
原 分布式锁基于zookeeper实现 : https://blog.csdn.net/hxpjava1/article/details/45191573
Zookeeper详细教程、分布式协调服务原理 : http://blog.51cto.com/13904503/2158549
转 分布式协调服务---Zookeeper : https://blog.csdn.net/hzhsan/article/details/7884925
转 ZooKeeper典型使用场景一览 : https://blog.csdn.net/hzhsan/article/details/7884861
zookeeper清理日志 : http://blog.51cto.com/roidba/1923375
Zookeeper的简介和应用场景 : https://mp.weixin.qq.com/s/u39PT3wLrxAr-OpcWYU07Q
【七张图】完全讲清楚ZooKeeper分布式锁的实现原理【石杉的架构笔记】 : https://mp.weixin.qq.com/s/jn4LkPKlWJhfUwIKkp3KpQ