共计 3190 个字符,预计需要花费 8 分钟才能阅读完成。
ZooKeeper 命令行客户端
启动命令行
ZooKeeper 的命令行客户端在 bin 目录下的 zkCli.sh
使用下面的命令启动 zkCli
./zkCli.sh -server amaster:2181
一般来说,这样可以成功连接到 ZooKeeper 集群。但是如果连接的节点 amaster 挂掉了那么就没法连接成功。要想保证连接成功,可以多填上一些服务器的地址。可以使用下面的命令
zkCli.sh -server amaster:2181,anode1:2181,anode2:2181
这样的话只要连接成功一个服务器即可。
ZooKeeper 中的数据组织
ZooKeeper 中的数据被组织成了一棵树。每一个节点称作一个 znode,每一个 znode 包含下面的部分。
- stat. 此为状态信息, 描述该 znode 的版本, 权限等信息
- data 与该 znode 关联的数据.
- children. 该 znode 下的子节点.
znode 之间具有父子关系。父子关系可以通过路径来表达,类似于文件系统。根节点是/
使用路径来创建或标识一个节点。每一个节点都可以保存数据。
zkCli.sh 的基本命令
1. ls 命令
ls 用于列出某个节点下的子节点。
示例代码
ls /
2. create 命令
create 用于创建一个节点。
语法是create [-s] [-e] path data acl
- path 用于指定节点的路径
- data 指定需要存放的数据(状态信息)
示例代码:
create /app1 "this is application1 servers parent"
3. get 命令
get 用于取出指定路径下存放的数据(stat)。语法是get path [watch]
示例代码:
get /app1
执行结果:
this is application1 servers parent
cZxid = 0x100000004
ctime = Sat Jan 28 21:04:59 CST 2017
mZxid = 0x100000004
mtime = Sat Jan 28 21:04:59 CST 2017
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 35
numChildren = 0
可以看出 ZooKeeper 使用了一系列数据结构来管理数据。
- 第一行是我们存放的数据
- cZxid 节点创建时的 zxid
- ctime 节点创建时间戳
- mzxid 节点最新一次更新发生时的 zxid.
- mtime 节点最新一次更新发生时的时间戳.
- dataVersion 节点数据的更新次数.
- cversion 其子节点的更新次数.
- aclVersion 节点 ACL(授权信息)的更新次数.
- ephemeralOwner 如果该节点为 ephemeral 节点, ephemeralOwner 值表示与该节点绑定的 session id. 如果该节点不是 ephemeral 节点, ephemeralOwner 值为 0. 至于什么是 ephemeral 节点, 请看后面的讲述.
- dataLength 节点数据的字节数.
- numChildren 子节点个数.
zxid
znode 节点的状态信息中包含 czxid 和 mzxid, 那么什么是 zxid 呢?
ZooKeeper 状态的每一次改变, 都对应着一个递增的 Transaction id, 该 id 称为 zxid. 由于 zxid 的递增性质, 如果 zxid1 小于 zxid2, 那么 zxid1 肯定先于 zxid2 发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致 Zookeeper 状态发生改变, 从而导致 zxid 的值增加.
session
在 client 和 server 通信之前, 首先需要建立连接, 该连接称为 session. 连接建立后, 如果发生连接超时, 授权失败, 或者显式关闭连接, 连接便处于 CLOSED 状态, 此时 session 结束.
4. get 的监听
get 命令可以注册一个监听,当 get 的 znode 的数据发生变化时可以收到通知。需要注意的是这个通知 只生效一次
示例代码:
get /app1 watch
在其他客户端修改 app1 的数据
set /app1 通知
则会自动收到通知:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/app1
接收到事件后客户端可以自行获取节点的内容。
与此类似的还有ls 的监听,它们非常类似,这里不再赘述。
5. set 命令
set 命令用于更新一个节点的数据。语法为set path data [version]
示例代码:
set /app1 啊哈哈哈 222
ZooKeeper 节点类型
persistent
persistent 节点不和特定的 session 绑定, 不会随着创建该节点的 session 的结束而消失, 而是一直存在, 除非该节点被显式删除.
ephemeral.
ephemeral 节点是临时性的, 如果创建该节点的 session 结束了, 该节点就会被自动删除. ephemeral 节点不能拥有子节点. 虽然 ephemeral 节点与创建它的 session 绑定, 但只要该该节点没有被删除, 其他 session 就可以读写该节点中关联的数据. 使用 - e 参数指定创建 ephemeral 节点.
示例代码:
create -e /appe 888888
sequence.
严格的说, sequence 并非节点类型中的一种. sequence 节点既可以是 ephemeral 的, 也可以是 persistent 的. 创建 sequence 节点时, ZooKeeper server 会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 因此可以多次创建相同的 sequence 节点, 而得到不同的节点. 使用 - s 参数指定创建 sequence 节点.
示例代码:
[zk: amaster:2181(CONNECTED) 12] create -s /app1/aa 666666
Created /app1/aa0000000000
[zk: amaster:2181(CONNECTED) 13] create -s /app1/aa 666666
Created /app1/aa0000000001
[zk: amaster:2181(CONNECTED) 14] create -s /app1/aa 666666
Created /app1/aa0000000002
在 CentOS7 上安装 Zookeeper-3.4.9 服务 http://www.linuxidc.com/Linux/2016-09/135052.htm
ZooKeeper 官方文档翻译——ZooKeeper Overview 3.4.6 http://www.linuxidc.com/Linux/2016-12/138025.htm
CentOS 下 ZooKeeper 3.4.8 集群环境搭建 http://www.linuxidc.com/Linux/2016-12/137958.htm
CentOS 7 下 Zookeeper 集群安装 http://www.linuxidc.com/Linux/2017-01/139733.htm
ZooKeeper 学习总结 http://www.linuxidc.com/Linux/2016-07/133179.htm
Linux 下安装 Zookeeper 集群 http://www.linuxidc.com/Linux/2017-01/139545.htm
Zookeeper3.4.6 的安装 http://www.linuxidc.com/Linux/2015-05/117697.htm
CentOS 7 下安装 Zookeeper 单机版 http://www.linuxidc.com/Linux/2015-05/117697.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/140051.htm