ZooKeeper数据组织及命令行的基本命令

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1a9d1f5d9e4e93200f512202282bbb30.html