zookeeper基础命令

来源:互联网 发布:淘宝 投诉未生产扣分吗 编辑:程序博客网 时间:2024/05/29 17:24

zookeeper基础命令

1. 配置

复制conf下的zoo_sample.cfg

cp conf/zoo_sample.cfg conf/zoo.cfg

2. 启动

bin/zkServer.sh start

➜  zookeeper bin/zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /Users/lilongjiu/03application/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED➜  zookeeper 

配置:默认zoo.cfg (在zkEnv.sh中默认读取zoo.cfg)

日志:默认zookeeper.out (zkServer.sh)

3. 连接

bin/zkCli.sh -timeout 5000 -server ip:port

➜  zookeeper bin/zkCli.sh -timeout 5000 -server 127.0.0.1:2181Connecting to 127.0.0.1:21812017-08-04 21:34:33,274 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT2017-08-04 21:34:33,276 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=bogon2017-08-04 21:34:33,276 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_1112017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation2017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre2017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/Users/lilongjiu/03application/zookeeper/bin/../build/classes:/Users/lilongjiu/03application/zookeeper/bin/../build/lib/*.jar:/Users/lilongjiu/03application/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/Users/lilongjiu/03application/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/Users/lilongjiu/03application/zookeeper/bin/../lib/netty-3.10.5.Final.jar:/Users/lilongjiu/03application/zookeeper/bin/../lib/log4j-1.2.16.jar:/Users/lilongjiu/03application/zookeeper/bin/../lib/jline-0.9.94.jar:/Users/lilongjiu/03application/zookeeper/bin/../zookeeper-3.4.10.jar:/Users/lilongjiu/03application/zookeeper/bin/../src/java/lib/*.jar:/Users/lilongjiu/03application/zookeeper/bin/../conf:2017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/Users/lilongjiu/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.2017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/var/folders/6q/t2vsnbxx6vsdt26xtlhb9yhr0000gn/T/2017-08-04 21:34:33,278 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>2017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Mac OS X2017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=x86_642017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=10.12.32017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=lilongjiu2017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/Users/lilongjiu2017-08-04 21:34:33,279 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/Users/lilongjiu/03application/zookeeper2017-08-04 21:34:33,280 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@531d72caWelcome to ZooKeeper!2017-08-04 21:34:33,302 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)JLine support is enabled2017-08-04 21:34:33,363 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@876] - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session[zk: 127.0.0.1:2181(CONNECTING) 0] 2017-08-04 21:34:33,447 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15dad7222110000, negotiated timeout = 5000WATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: 127.0.0.1:2181(CONNECTED) 0] ls /[zookeeper][zk: 127.0.0.1:2181(CONNECTED) 1] 

4. 命令列表

WatchedEvent state:SyncConnected type:None path:null[zk: 127.0.0.1:2181(CONNECTED) 0] helpZooKeeper -server host:port cmd args    stat path [watch]    set path data [version]    ls path [watch]    delquota [-n|-b] path    ls2 path [watch]    setAcl path acl    setquota -n|-b val path    history     redo cmdno    printwatches on|off    delete path [version]    sync path    listquota path    rmr path    get path [watch]    create [-s] [-e] path data acl    addauth scheme auth    quit     getAcl path    close     connect host:port[zk: 127.0.0.1:2181(CONNECTED) 1] 

4.1 查询类命令

4.1.1 查询子节点

ls path [watch]

[zk: 127.0.0.1:2181(CONNECTED) 1] ls /node[node2, node3, node1][zk: 127.0.0.1:2181(CONNECTED) 2] 
4.1.2 查询节点状态

stat path [watch]

zookeeper 每一次对数据节点的写操作,都是一次事务,每一个事务系统都会分配一个唯一的id来标识这个事务。

[zk: 127.0.0.1:2181(CONNECTED) 2] stat /nodecZxid = 0x100000005                     #创建时的事务idctime = Sun Jun 04 11:30:29 CST 2017    #创建的时的时间mZxid = 0x100000005                     #最后一次更新时的事务id  mtime = Sun Jun 04 11:30:29 CST 2017    #最后一次更新时的时间pZxid = 0x10000000a                     #节点的子节点列表最后一次更新时的事务id(添加或删除子节点,更新子节点内容不算)cversion = 3                            #子节点版本号dataVersion = 0                         #数据版本号aclVersion = 0                          #ACL权限版本号ephemeralOwner = 0x0                    #创建临时节点的事务id,如果永久节点,默认时0dataLength = 4                          #当前节点数据的长度numChildren = 3                         #当前节点的子节点个数[zk: 127.0.0.1:2181(CONNECTED) 3]
4.1.3 查询节点数据

get path [watch]

[zk: 127.0.0.1:2181(CONNECTED) 3] get /nodetestcZxid = 0x100000005ctime = Sun Jun 04 11:30:29 CST 2017mZxid = 0x100000005mtime = Sun Jun 04 11:30:29 CST 2017pZxid = 0x10000000acversion = 3dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 3[zk: 127.0.0.1:2181(CONNECTED) 4] 
4.1.4 查询子节点列表

ls2 path [watch]

比 ls 多了节点状态信息

[zk: 127.0.0.1:2181(CONNECTED) 4] ls2 /node[node2, node3, node1]cZxid = 0x100000005ctime = Sun Jun 04 11:30:29 CST 2017mZxid = 0x100000005mtime = Sun Jun 04 11:30:29 CST 2017pZxid = 0x10000000acversion = 3dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 3[zk: 127.0.0.1:2181(CONNECTED) 5]

4.2 创建类指令

create [-s] [-e] path data acl

  • path: 路径, data:数据

  • -s: 顺序节点

  • -e: 临时节点

4.2.1 创建节点
[zk: 127.0.0.1:2181(CONNECTED) 5] create /node/node4 4Created /node/node4[zk: 127.0.0.1:2181(CONNECTED) 6] get /node/node44cZxid = 0x10000000fctime = Sun Jun 04 12:15:28 CST 2017mZxid = 0x10000000fmtime = Sun Jun 04 12:15:28 CST 2017pZxid = 0x10000000fcversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 1numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 7] 
4.2.2 创建临时节点
[zk: 127.0.0.1:2181(CONNECTED) 7] create -e /node/node4/node4_1 41Created /node/node4/node4_1[zk: 127.0.0.1:2181(CONNECTED) 8] ls /node/node4 [node4_1][zk: 127.0.0.1:2181(CONNECTED) 9] [zk: 127.0.0.1:2181(CONNECTED) 10] quitQuitting...2017-06-04 12:19:30,763 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x15c7118be740003 closed2017-06-04 12:19:30,765 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x15c7118be740003lilongjiu@bogonbin$

当退出重新登陆后,node4的子节点node4_1已经不存在了。临时节点在客户端session实效后,会自动被zookeeper从服务端删除。

[zk: 127.0.0.1:2181(CONNECTED) 0] ls /node/node4[][zk: 127.0.0.1:2181(CONNECTED) 1] 
4.2.3 创建顺序节点

创建相同的顺序节点,zookeeper会自动添加序列号

[zk: 127.0.0.1:2181(CONNECTED) 1] create -s /node/node4/node4_1 41Created /node/node4/node4_10000000001[zk: 127.0.0.1:2181(CONNECTED) 2] create -s /node/node4/node4_1 41 Created /node/node4/node4_10000000002[zk: 127.0.0.1:2181(CONNECTED) 3] create -s /node/node4/node4_1 41Created /node/node4/node4_10000000003[zk: 127.0.0.1:2181(CONNECTED) 4] 

4.3 修改类指令

set path data [version]

4.3.1 修改节点数据
[zk: 127.0.0.1:2181(CONNECTED) 0] get /node/node33    #当前值cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x10000000amtime = Sun Jun 04 11:33:17 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 0    #当前数据版本号aclVersion = 0ephemeralOwner = 0x0dataLength = 1numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 1] set /node/node3 333cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x100000018mtime = Sun Jun 04 12:37:22 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 2] get /node/node3    333    #修改后的值cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x100000018mtime = Sun Jun 04 12:37:22 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 1    #修改后数据版本号aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 3] 

再次修改,修改后的值与原来的值一样。可以看到,再次修改前时数据版本号是1,修改后数据版本号时2。 也就是说,不管修改后的值是否与原来的值一样,数据版本号都增加1

[zk: 127.0.0.1:2181(CONNECTED) 3] set /node/node3 333cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x100000019mtime = Sun Jun 04 12:40:51 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 4] get /node/node3    333    #再次修改后的值cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x100000019mtime = Sun Jun 04 12:40:51 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 2    #再次修改后的版本号aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 5]
4.3.2 修改节点数据(带版本号)

当前节点状态如下:

[zk: 127.0.0.1:2181(CONNECTED) 7] get /node/node3333    #数据cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x10000001amtime = Sun Jun 04 12:43:25 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 3    #版本号aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 8] 

修改了两次:

  • 第一次成功,并且可以看到返回的版本号时4
  • 第二次修改失败是因为版本号已经是4,但是修改命令带的版本号是3
  • 我们修改节点数据的时候,如果带版本号,那么这个版本号一定要和服务器的版本号一致,否则会报错。类似CAS操作,附带的版本号是期待的版本号,只有数据库版本号和我们期待的一致,才能修改成功
[zk: 127.0.0.1:2181(CONNECTED) 8] set /node/node3 333 3cZxid = 0x10000000actime = Sun Jun 04 11:33:17 CST 2017mZxid = 0x100000022mtime = Sun Jun 04 12:52:23 CST 2017pZxid = 0x10000000acversion = 0dataVersion = 4aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0[zk: 127.0.0.1:2181(CONNECTED) 9] set /node/node3 333 3version No is not valid : /node/node3[zk: 127.0.0.1:2181(CONNECTED) 10] 

4.4 删除类指令

delete path [version]

rmr path

同样,delete命令也带一个版本号,这个用法和set指令的版本号用法是一致的。

当前节点如下:

[zk: 127.0.0.1:2181(CONNECTED) 21] ls /node[node4, node2, node3, node1][zk: 127.0.0.1:2181(CONNECTED) 22] ls /node/node3[node3_1][zk: 127.0.0.1:2181(CONNECTED) 23] 
4.4.1 删除节点
[zk: 127.0.0.1:2181(CONNECTED) 23] delete /node/node3Node not empty: /node/node3

注意:delete只能删除没有子节点的节点

4.4.2 删除有子节点的节点
[zk: 127.0.0.1:2181(CONNECTED) 24] rmr /node/node3[zk: 127.0.0.1:2181(CONNECTED) 25] ls /node[node4, node2, node1][zk: 127.0.0.1:2181(CONNECTED) 26] 

4.5 配额

限制节点的子节点个数,或者节点的数据长度。

setquota -n|-b val path

  • -n:子节点的个数

  • -b:子节点数据长度

当前状态:节点/node/node3没有子节点

[zk: 127.0.0.1:2181(CONNECTED) 0] ls /node/node3[][zk: 127.0.0.1:2181(CONNECTED) 1] 
4.5.1 设置配额

设置/node/node3 子节点个数为2

[zk: 127.0.0.1:2181(CONNECTED) 1] setquota -n 2 /node/node3Comment: the parts are option -n val 2 path /node/node3

为/node/node3增加2个子节点:node3_1、node3_2

[zk: 127.0.0.1:2181(CONNECTED) 2] create /node/node3/node3_1 31Created /node/node3/node3_1[zk: 127.0.0.1:2181(CONNECTED) 3] create /node/node3/node3_2 32Created /node/node3/node3_2[zk: 127.0.0.1:2181(CONNECTED) 4] 

现在,再为节点/node/node3增加一个子节点:node3_3

[zk: 127.0.0.1:2181(CONNECTED) 4] create /node/node3/node3_3 33Created /node/node3/node3_3[zk: 127.0.0.1:2181(CONNECTED) 5] 

增加第三个节点node3_3居然没有报错,这是因为:当配额超过限制时zookeeper并不会报错,仅仅只是在日志中记录超过配额的信息。

下面是zookeeper的日志,记录超过配额,当前count是4,是因为子节点的个数包括本身,也就是说在增加第2个子节点node3_2的时候就已经超过配额了。

2017-06-04 13:32:34,899 [myid:1] - WARN  [CommitProcessor:1:DataTree@301] - Quota exceeded: /node/node3 count=3 limit=22017-06-04 13:38:19,010 [myid:1] - WARN  [CommitProcessor:1:DataTree@301] - Quota exceeded: /node/node3 count=4 limit=2
4.5.2 查询配额

listquota path

[zk: 127.0.0.1:2181(CONNECTED) 5] listquota /node/node3absolute path is /zookeeper/quota/node/node3/zookeeper_limitsOutput quota for /node/node3 count=2,bytes=-1    #配置:子节点个数2,数据长度-1 表示没有限制Output stat for /node/node3 count=4,bytes=7      #实际:子节点个数4(包含本身),数据长度7(包含本身)[zk: 127.0.0.1:2181(CONNECTED) 6] 
4.5.3 删除配额

delquota [-n|-b] path

[zk: 127.0.0.1:2181(CONNECTED) 6] delquota -n /node/node3[zk: 127.0.0.1:2181(CONNECTED) 7] listquota /node/node3absolute path is /zookeeper/quota/node/node3/zookeeper_limitsOutput quota for /node/node3 count=-1,bytes=-1    #配置:子节点个数-1,表示没有限制;数据长度-1 表示没有限制Output stat for /node/node3 count=4,bytes=7[zk: 127.0.0.1:2181(CONNECTED) 8] 

4.6 其他指令

4.6.1 历史命令

history

[zk: 127.0.0.1:2181(CONNECTED) 8] history0 - ls /node/node31 - setquota -n 2 /node/node32 - create /node/node3/node3_1 313 - create /node/node3/node3_2 324 - create /node/node3/node3_3 335 - listquota /node/node36 - delquota -n /node/node37 - listquota /node/node38 - history[zk: 127.0.0.1:2181(CONNECTED) 9] 
4.6.2 重新执行历史指令

redo cmdno

[zk: 127.0.0.1:2181(CONNECTED) 8] history0 - ls /node/node31 - setquota -n 2 /node/node32 - create /node/node3/node3_1 313 - create /node/node3/node3_2 324 - create /node/node3/node3_3 335 - listquota /node/node36 - delquota -n /node/node37 - listquota /node/node38 - history[zk: 127.0.0.1:2181(CONNECTED) 9] redo 7absolute path is /zookeeper/quota/node/node3/zookeeper_limitsOutput quota for /node/node3 count=-1,bytes=-1Output stat for /node/node3 count=4,bytes=7[zk: 127.0.0.1:2181(CONNECTED) 10] 
原创粉丝点击