当ZooKeeper集合启动时,它会等待客户端链接。客户端将链接到ZooKeeper的集合的其中一个节点。它多是一个领导者或跟随者节点。当客户机链接时,该节点分配会话ID给特定的客户端,并发送一个确认消息给客户端。若是客户端没有获得确认,它会尝试链接ZooKeeper集合的另外一个节点。当链接到一个节点后,客户端将以规则的间隔发送心跳到节点,以确保链接不会丢失。
-
若是客户想要读取特定的znode,它发送一个读请求使用znode路径的节点,所述节点从其本身的数据库中获取它返回所请求的znode。出于这个缘由,读取在动物园管理员集合中速度很是快。
-
若是客户但愿将数据存储在ZooKeeper 集合,它发送znode路径和数据到服务器。链接的服务器将请求转发到领导者,那么领导者将从新发出书面请求到全部的追随者。若是只有一个数节点成功响应,接着写请求将成功及一个成功的返回代码将被发送到客户端。不然,写请求将失败。严格大部分节点被称为定额。
ZooKeeper集合的节点
让咱们来分析ZooKeeper集合不一样数量的节点的做用。
-
若是咱们有一个节点,那么当该节点出现故障时ZooKeeper集合失败。它有利于“单一失败教程”,它不建议用在生产环境中。
-
若是咱们有两个节点,一个节点出现故障,咱们也没有“多数”,由于二分之一并非一个大多数。
-
若是咱们有三个节点及其一个节点发生故障,咱们有大多数,所以它是最低要求。它强制 ZooKeeper 集合在实际生产环境中至少有三个节点。
-
若是咱们有四个节点及其有当两个节点失败,它相似于有三个节点。额外的节点没有任何做用,所以,最好是单数增长节点,例如,3, 5, 7.
咱们知道,写处理它比在 ZooKeeper 集合读过程是昂贵的,因为全部的节点须要写相同的数据在其数据库中。所以,最好是具备节点(3,5或7)比具备大量节点的一个平衡的环境的数量少。
下图描述了ZooKeeper 的工做流程以及在随后的表说明了其不一样的组件。

组件 | 描述 |
---|---|
写入 | 写过程是由领导节点处理。领导者转发写请求到全部znodes及其等待来自znodes应答。若是一半的znodes的回复,那么写入过程就完成了。 |
读取 | 读取在内部由特定链接znode进行的,因此没有必要与集群交互。 |
复制数据库 | 它是用来将数据存储在zookeeper。每一个znode都有本身的数据库及其每一个znode 在一致性的做用下,每次有相同的数据。 |
领导者(节点) | 领导者是由Znode负责处理写请求。 |
追随者(节点) | 追随者收到来自客户端的写请求,并将其转发到领导znode。 |
请求处理器 | 目前仅在领导节点。它从跟随节点的请求支配写入。 |
原子广播 | 负责从领导节点到从节点广播更改。 |
Zookeeper领导人选举
让咱们来分析一下一个领导节点在ZooKeeper集合的选举。考虑集群中有N多的节点。领导人选举的过程以下 −
-
全部节点建立一个顺序,znode具备相同路径,/app/leader_election/guid_。
-
ZooKeeper 的集合将追加的10位序列号的路径,创造了 znode 将会是 /app/leader_election/guid_0000000001, /app/leader_election/guid_0000000002, ...等。
-
对于给定的实例,它在znode建立最小数量的节点成为领导者以及全部其余节点的追随者。
-
每个追随者节点监控下一个最小号的znode。
及其该节点建立znode /app/leader_election/guid_0000000007 将监控znode /app/leader_election/guid_0000000006.
-
若是领导停机,接着其对应的znode/app/leader_electionN被删除。
-
跟随节点接下来将经过观察者获得关领导去除的通知。
-
跟随节点接下来会检查是否有其余znodes用最小数量。 若是没有,接着它将承担领导者的角色。不然,它会找到哪些用最小数创造了znode做为领导者的节点。
-
一样,其余全部跟随节点选举创造了znode用最小数做为领导者的节点。
领导人选举时,它从头开始作一个复杂的过程。但ZooKeeper服务,使得它很是简单。让咱们在接下来的章节介绍 ZooKeeper 安装和开发。
Zookeeper CLI
ZooKeeper 命令行界面(CLI)是用来与 ZooKeeper 集成做开发进行交互的。这是在调试和使用不一样的选项时的工做有用。
为了执行ZooKeeper的CLI操做, ZooKeeper服务器首先要启动 (“bin/zkServer.sh start”) , 而后使用 ZooKeeper 客户端 (“bin/zkCli.sh”). 当客户端启动后,能够执行如下操做 -
- 建立znodes
- 获取数据
- 监视 znode 变化
- 设置数据
- 建立 znode 的子 znode
- 列出一个 znode 的子 znode
- 检查状态
- 删除一个 znode
如今,让咱们一个个用一个例子地来看上面的命令。
建立Znodes
由一个给定的路径来建立znode。flag参数指定了建立的 znode 是否为短暂的,持久的,或连续的。默认状况下,全部的 znodes是持久的。
-
短暂 znodes(flag: e)当会话过时或当客户端断开链接将被自动删除。
-
连续 znodes 保证 znode 路径是惟一的。
-
ZooKeeper集成将沿着添加序列号使用10位填充到znode路径。例如,znode路径 /myapp 将被转换为 /myapp0000000001 以及下一个序列号将是 /myapp0000000002. 若是没有指定flag,那么 znode 是持久的。
语法
create /path /data
示例
create /FirstZnode “Myfirstzookeeper-app”
输出结果
[zk: localhost:2181(CONNECTED) 0] create /FirstZnode “Myfirstzookeeper-app” Created /FirstZnode
要建立一个连续znode,以下图所示添加 -s 标志。
语法
create -s /path /data
示例
create -s /FirstZnode second-data
输出
[zk: localhost:2181(CONNECTED) 2] create -s /FirstZnode “second-data” Created /FirstZnode0000000023
要建立一个临时Znode,添加-e标志,以下图所示。
语法
create -e /path /data
示例
create -e /SecondZnode “Ephemeral-data”
输出
[zk: localhost:2181(CONNECTED) 2] create -e /SecondZnode “Ephemeral-data” Created /SecondZnode
记住,当丢失一个客户端链接,在临时 znode 将被删除。能够经过退出 ZooKeeper CLI 尝试,而后从新打开命令行。
获取数据
它返回 znode 的相关数据和指定 znode 元数据。这里将获得信息,例如当数据最后一次修改,在那里它被修改和有关数据的信息。此外 CLI 还用于分配监视显示通知有关的数据。
语法
get /path
示例
get /FirstZnode
输出
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Myfirstzookeeper-app” cZxid = 0x7f ctime = Tue Sep 29 16:15:47 IST 2015 mZxid = 0x7f mtime = Tue Sep 29 16:15:47 IST 2015 pZxid = 0x7f cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 numChildren = 0
要访问顺序znode,必须输入znode的完整路径。
示例
get /FirstZnode0000000023
输出
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode0000000023 “Second-data” cZxid = 0x80 ctime = Tue Sep 29 16:25:47 IST 2015 mZxid = 0x80 mtime = Tue Sep 29 16:25:47 IST 2015 pZxid = 0x80 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 0
监视
监视显示通知当指定znode或znode的子数据变化。只能在 get 命令中设置监视。
语法
get /path [watch] 1
示例
get /FirstZnode 1
输出
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode 1 “Myfirstzookeeper-app” cZxid = 0x7f ctime = Tue Sep 29 16:15:47 IST 2015 mZxid = 0x7f mtime = Tue Sep 29 16:15:47 IST 2015 pZxid = 0x7f cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 22 numChildren = 0
输出相似于正常get命令,但它会在后台等待节点改变。
设置数据
设置指定znode的数据。当你完成设置操做,就可使用get CLI命令检查数据。
语法
set /path /data
示例
set /SecondZnode Data-updated
输出
[zk: localhost:2181(CONNECTED) 1] get /SecondZnode “Data-updated” cZxid = 0x82 ctime = Tue Sep 29 16:29:50 IST 2015 mZxid = 0x83 mtime = Tue Sep 29 16:29:50 IST 2015 pZxid = 0x82 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x15018b47db00000 dataLength = 14 numChildren = 0
若是分配监视选项在get命令(以前的命令),则输出将相似以下 -
输出
[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Mysecondzookeeper-app” WATCHER: : WatchedEvent state:SyncConnected type:NodeDataChanged path:/FirstZnode cZxid = 0x7f ctime = Tue Sep 29 16:15:47 IST 2015 mZxid = 0x84 mtime = Tue Sep 29 17:14:47 IST 2015 pZxid = 0x7f cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 23 numChildren = 0
建立子znode
建立子znode相似于建立新的znodes。惟一的区别在于,子 znode 的路径将包含有父路径。
语法
create /parent/path/subnode/path /data
示例
create /FirstZnode/Child1 firstchildren
输出
[zk: localhost:2181(CONNECTED) 16] create /FirstZnode/Child1 “firstchildren” created /FirstZnode/Child1 [zk: localhost:2181(CONNECTED) 17] create /FirstZnode/Child2 “secondchildren” created /FirstZnode/Child2
列出子znode
该命令用于列出和显示子 znode 。
语法
ls /path
示例
ls /MyFirstZnode
输出
[zk: localhost:2181(CONNECTED) 2] ls /MyFirstZnode [mysecondsubnode, myfirstsubnode]
检查状态
状态描述了指定znode的元数据。它包含详细信息,如时间戳,版本号,访问控制列表,数据长度和子znode。
语法
stat /path
示例
stat /FirstZnode
输出
[zk: localhost:2181(CONNECTED) 1] stat /FirstZnode cZxid = 0x7f ctime = Tue Sep 29 16:15:47 IST 2015 mZxid = 0x7f mtime = Tue Sep 29 17:14:24 IST 2015 pZxid = 0x7f cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 23 numChildren = 0
删除Znode
删除指定znode和递归删除全部的子znode。这只有在znode可用时发生。
语法
rmr /path
示例
rmr /FirstZnode
输出
[zk: localhost:2181(CONNECTED) 10] rmr /FirstZnode [zk: localhost:2181(CONNECTED) 11] get /FirstZnode Node does not exist: /FirstZnode
删除(删除/路径)命令相似remove命令,但它仅适用于无子znode的znode。