ZooKeeper命令行客户端 启动命令行
ZooKeeper的命令行客户端在bin目录下的zkCli.sh
使用下面的命令启动zkCli
一般来说,这样可以成功连接到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 888888sequence. 严格的说, 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