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

猜你喜欢

转载自www.linuxidc.com/Linux/2017-01/140051.htm
今日推荐