Zookeeper 常用命令与注意事项

JAVA乐园

共 6322字,需浏览 13分钟

 ·

2021-10-30 19:08

Zookeeper在互联网行业和分布式环境下是最常用的集群协调工具,今天就对Zookeeper的常用命令和使用注意事项进一步说明,在这之前先看一下Zookeeper是什么,它能做什么?

Zookeeper是什么?

ZooKeeper是一个开源的分布式应用程序协调服务,是GoogleChubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

它的这些特性可以让我们在很多场景下使用它,可以用它做注册中心、分布式锁、选举、队列等。

Zookeeper的原理

ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解

ZooKeeper的基本运转流程:

  1. 选举Leader

  2. 同步数据。

  3. 选举Leader过程中算法有很多,但要达到的选举标准是一致的。

  4. Leader要具有最高的执行ID,类似root权限。

  5. 集群中大多数的机器得到响应并接受选出的Leader

Zookeeper数据结构

与普通的文件系统极其类似,如下:

其中每个节点称为一个znode. 每个znode由3部分组成:

  • stat:此为状态信息, 描述该znode的版本, 权限等信息

  • data与该znode关联的数据

  • children该znode下的子节点

Zookeeper节点类型

  • persistent: persistent节点不和特定的session绑定, 不会随着创建该节点的session的结束而消失, 而是一直存在, 除非该节点被显式删除

  • ephemeral: ephemeral节点是临时性的, 如果创建该节点的session结束了, 该节点就会被自动删除. ephemeral节点不能拥有子节点虽然ephemeral节点与创建它的session绑定, 但只要该该节点没有被删除, 其他session就可以读写该节点中关联的数据. 使用-e参数指定创建ephemeral节点

  • sequence:严格的说, sequence并非节点类型中的一种. sequence节点既可以是ephemeral的, 也可以是persistent的. 创建sequence节点时, ZooKeeper server会在指定的节点名称后加上一个数字序列, 该数字序列是递增的. 因此可以多次创建相同的sequence节点, 而得到不同的节点. 使用-s参数指定创建sequence节点。

Zookeeper常用命令

启动服务

1[app@iZbp1dijzcfg8m0bcqfv9yZ zookeeper]$ ./bin/zkServer.sh start
2ZooKeeper JMX enabled by default
3Using config: /usr/local/servers/zookeeper/zookeeper/bin/../conf/zoo.cfg
4Starting zookeeper ... STARTED

查看当前zk节点状态

1[zk@iZbp1dijzcfg8m0bcqfv9yZ bin]$ ./zkServer.sh status
2JMX enabled by default
3Using config: /usr/local/servers/zookeeper/zookeeper/bin/../conf/zoo.cfg
4Mode: standalone

ps. standalone代表单机模式

1[zk@iZ23np2fk60Z bin]$ ./zkServer.sh status
2JMX enabled by default
3Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
4Mode: leader

ps. 集群模式下会显示的状态,leader节点,集群中其他机器会从leader节点同步数据

1[zk@iZ237ydkhyiZ bin]$ ./zkServer.sh status
2JMX enabled by default
3Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
4Mode: follower

ps. 集群模式下会显示的状态,follower节点在启动过程中会从leader节点同步所有数据

连接服务

1[app@iZbp1dijzcfg8m0bcqfv9yZ zookeeper]$ ./bin/zkCli.sh -server ip:port

ps. 不写ip端口默认连接本机服务

查看节点信息

1[zk: localhost:2181(CONNECTED) 0] ls /
2[seq, dubbo, disconf, otter, pinpoint-cluster, zookeeper]

查看指定node的子node

1[zk: localhost:2181(CONNECTED) 3] ls /zookeeper
2[quota]

创建一个普通节点

1[zk: localhost:2181(CONNECTED) 6] create /hello world
2Created /hello

获取hello节点的数据与状态

 1[zk: localhost:2181(CONNECTED) 8] get /hello
2world
3cZxid = 0x262ea76
4ctime = Wed Mar 21 14:39:12 CST 2018
5mZxid = 0x262ea76
6mtime = Wed Mar 21 14:39:12 CST 2018
7pZxid = 0x262ea76
8cversion = 0
9dataVersion = 0
10aclVersion = 0
11ephemeralOwner = 0x0
12dataLength = 5
13numChildren = 0


删除hello节点

1[zk: localhost:2181(CONNECTED) 9] delete /hello
2[zk: localhost:2181(CONNECTED) 10get /hello
3Node does not exist: /hello

ps. 使用delete命令可以删除指定znode. 当该znode拥有子znode时, 必须先删除其所有子znode, 否则操作将失败. rmr命令可用于代替delete命令, rmr是一个递归删除命令, 如果发生指定节点拥有子节点时, rmr命令会首先删除子节点.

znode节点的状态信息

使用get命令获取指定节点的数据时, 同时也将返回该节点的状态信息, 称为Stat. 其包含如下字段:

  • czxid. 节点创建时的zxid.

  • mzxid. 节点最新一次更新发生时的zxid.

  • ctime. 节点创建时的时间戳.

  • 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结束.

创建不同类型的节点

节点的类型前面已经讲过。

创建一个临时节点

 1[zk: localhost:2181(CONNECTED) 12] create -e /hello world   
2Created /hello
3[zk: localhost:2181(CONNECTED) 13] get /hello
4world
5cZxid = 0x262ea78
6ctime = Wed Mar 21 14:45:23 CST 2018
7mZxid = 0x262ea78
8mtime = Wed Mar 21 14:45:23 CST 2018
9pZxid = 0x262ea78
10cversion = 0
11dataVersion = 0
12aclVersion = 0
13ephemeralOwner = 0x15c150a650f066c
14dataLength = 5
15numChildren = 0

创建一个序列节点

 1[zk: localhost:2181(CONNECTED) 14] create -s /hello1 world
2Created /hello10000000007
3[zk: localhost:2181(CONNECTED) 15] create -s /hello1 world
4Created /hello10000000008
5[zk: localhost:2181(CONNECTED) 16] ls /
6[hello, dubbo, otter, zookeeper, seq, disconf, hello10000000007, hello10000000008, pinpoint-cluster]
7[zk: localhost:2181(CONNECTED) 17] get /hello10000000007
8world
9cZxid = 0x262ea7e
10ctime = Wed Mar 21 14:47:51 CST 2018
11mZxid = 0x262ea7e
12mtime = Wed Mar 21 14:47:51 CST 2018
13pZxid = 0x262ea7e
14cversion = 0
15dataVersion = 0
16aclVersion = 0
17ephemeralOwner = 0x0
18dataLength = 5
19numChildren = 0

watch

watch的意思是监听感兴趣的事件. 在命令行中, 以下几个命令可以指定是否监听相应的事件.

ls命令

ls命令. ls命令的第一个参数指定znode, 第二个参数如果为true, 则说明监听该znode的子节点的增减, 以及该znode本身的删除事件

 1[zk: localhost:2181(CONNECTED) 27] create /hello world
2Created /hello
3[zk: localhost:2181(CONNECTED) 28] ls /hello true
4[]
5[zk: localhost:2181(CONNECTED) 29create /hello/test item001
6
7WATCHER::
8
9WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hello
10Created /hello/test

get命令

get命令. get命令的第一个参数指定znode, 第二个参数如果为true, 则说明监听该znode的更新和删除事件

 1[zk: localhost:2181(CONNECTED) 30] get /hello true
2world
3cZxid = 0x262ef5d
4ctime = Wed Mar 21 14:52:16 CST 2018
5mZxid = 0x262ef5d
6mtime = Wed Mar 21 14:52:16 CST 2018
7pZxid = 0x262ef5e
8cversion = 1
9dataVersion = 0
10aclVersion = 0
11ephemeralOwner = 0x0
12dataLength = 5
13numChildren = 1
14[zk: localhost:2181(CONNECTED) 31] create /hello/test1 item001
15Created /hello/test1
16[zk: localhost:2181(CONNECTED) 32] rmr /hello
17
18WATCHER::
19
20WatchedEvent state:SyncConnected type:NodeDeleted path:/hello

stat命令

stat命令. stat命令用于获取znode的状态信息. 第一个参数指定znode, 如果第二个参数为true

 1[zk: localhost:2181(CONNECTED) 35] create /hello world
2
3WATCHER::
4
5WatchedEvent state:SyncConnected type:NodeCreated path:/hello
6Created /hello
7[zk: localhost:2181(CONNECTED) 36] stat /hello true
8cZxid = 0x262f0f0
9ctime = Wed Mar 21 14:56:31 CST 2018
10mZxid = 0x262f0f0
11mtime = Wed Mar 21 14:56:31 CST 2018
12pZxid = 0x262f0f0
13cversion = 0
14dataVersion = 0
15aclVersion = 0
16ephemeralOwner = 0x0
17dataLength = 5
18numChildren = 0

source: //ningyu1.github.io/20180321/71-zookeeper-considerations.html

喜欢,在看

浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报