2019独角兽企业重金招聘Python工程师标准>>>
ZooKeeper简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是
Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名
服务、分布式同步、组服务等。
分布式协调服务就是为用户的分布式应用程序提供协调服务 。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper是为别的分布式程序服务的 ;
Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务,所以一般zk都是奇数台服务器)
Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
zookeeper在底层其实只提供了两个功能:
-
管理(存储,读取)用户程序提交的数据;
-
并为用户程序提供数据节点监听服务;
Zookeeper集群的角色: Leader 和 follower (Observer)
只要集群中有半数以上节点存活,集群就能提供服务
Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode
ZooKeeper包含一个简单的原语集,提供Java和C的接口。调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列
分布式应用程序可以基于 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是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多数的机器得到响应并follow选出的Leader。
Znode分为四种类型:
1.持久节点 (PERSISTENT)
默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。
2.持久节点顺序节点(PERSISTENT_SEQUENTIAL)
所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:
3.临时节点(EPHEMERAL)
和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除:
4.临时顺序节点(EPHEMERAL_SEQUENTIAL)
顾名思义,临时顺序节点结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与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
ZooKeeper设计目的
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以T1、T2的顺序commit执行,其他所有的Server也必须以T1、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安装包
- 在官网中下载,对于在墙内的用户,并不推荐该方式下载速度可能比较慢
- 推荐方式:在cloudera仓库进行下载,相较于官网下载更加稳定快速,地址http://archive.cloudera.com/cdh5/cdh/5/,选择需要版本下载tar.gz的安装包
-
下载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便可以识别到该文件
四、修改zoo.cfg配置文件
在该文件中根据需要添加如下配置:
#发送心跳的间隔时间,单位:毫秒
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依据集群的机器个数依次进行递增,这里的server1、server2、server3表示机器IP地址
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888
Ps:上面的data目录和dataLog目录默认是没有的,需要自己预先建立好。并且真正用户开发环境的配置文件,尽量删除删掉上面的注释,以及多余的空白字符(划重点),有可能会造成zookeeper的读取失败
五、新建myid文件
在server1机器中,在上面配置的data目录下,新建一个名为 myid的文件,文件内容填写 1,对的,没有听错,文件中只保留一个数字 1。zookeeper是根据该文件来决定zookeeper集群各个机器的身份分配。
六、将配置好的zookeeper分发到集群的所有机器
经过上面的五个步骤zookeeper已经配置完毕,然后将其依次拷贝的集群的其他机器中。快捷一点可以使用 scp 命令来做这件事:
scp 本地zookeeper安装目录 登陆远程机器的用户名@远程机器地址 : 远程机器存放zookeeper的地址
eg:scp zookeeper skyler@slave1:/modules/
然后修改data目录的下的myid 文件中的数字,在这里即为将server2的myid内容修改为2,将server3的myid内容修改为3。对于不同的集群,根据需要进行修改,与配置文件中的order保持一致。
七、启动zookeeper服务
修改完成后,在每台机器上依次使用bin/zkServer.sh start
来启动zookeeper服务,待启动完成后使用 bin/zkServer.sh status
来查看该机器的身份
八、启动zookeeper客户端检验服务是否可用
使用 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
1、Zookeeper深入理解(一)(概念及基础)
http://hao0.me/zookeeper/2015/02/28/zk-basic.html
2、Zookeeper深入理解(二)(编程实践之Master-Worker)
http://hao0.me/zookeeper/2015/03/02/zk-program-master-worker.html
3、Zookeeper深入理解(二)(编程实践之故障处理)
http://hao0.me/zookeeper/2015/03/10/zk-failure.html
4、Zookeeper深入理解(二)(编程实践之Zookeepr使用警告)
http://hao0.me/zookeeper/2015/03/15/zk-caveat-emptor.html
5、Zookeeper深入理解(二)(编程实践之高级API:Curator)
http://hao0.me/zookeeper/2015/03/20/zk-curator.html
6、Zookeeper深入理解(三)(Zookeeper管理之内部组件)
http://hao0.me/zookeeper/2015/03/25/zk-admin-internals.html
7、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安装与配置 : http://t.bosenrui.com/dev/b81c87f4b5ec3b4f6996c666deaa367a.html
zookeeper安装及使用(集群模式(可用于生产)配置):https://blog.csdn.net/jasnet_u/article/details/71514094
基于ZooKeeper的分布式Session实现 :https://blog.csdn.net/jacktan/article/details/6112806
Session的两种实现机制 : https://blog.csdn.net/SMCwwh/article/details/6755597
ZooKeeper实战(四)处理Zookeeper的session过期问题 : https://blog.csdn.net/guzicheng/article/details/40784029
什么是Zookeeper? : https://mp.weixin.qq.com/s/B90wB1ICR4qSHkDL9AlYNg
zookeeper机制原理 : https://blog.csdn.net/paul_wei2008/article/details/19355393
Zookeeper分布式锁 : https://blog.csdn.net/paul_wei2008/article/details/53366645
Zookeeper :https://blog.csdn.net/m0_37450089/article/category/7308836
(来源掘金小册)ZooKeeper 搭建 solr 集群 : https://juejin.im/post/5b5834cff265da0f990d5fc7
(来源掘金小册)Solr 入门 : https://juejin.im/post/5b55736d5188251b1e1fce45
使用zookeeper实现集群和负载均衡 : https://blog.csdn.net/hxpjava1/article/details/8612228
Zookeeper总览 : https://mp.weixin.qq.com/s/CqMo9mYxwhz3ubRoCWpiUQ
原 分布式锁基于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
linux安装zookeeper安装 :https://mp.weixin.qq.com/s/10CunPU4u5OINWST_1Nnew
Zookeeper的简介和应用场景 : https://mp.weixin.qq.com/s/u39PT3wLrxAr-OpcWYU07Q
【七张图】彻底讲清楚ZooKeeper分布式锁的实现原理【石杉的架构笔记】 : https://mp.weixin.qq.com/s/jn4LkPKlWJhfUwIKkp3KpQ