参考地址为:https://www.cnblogs.com/sherrykid/p/5813148.html
1.连接@H_502_5@@H_502_5@在 bin 目录下的 zkCli.sh 就是ZooKeeper客户端@H_502_5@@H_502_5@./zkCli.sh -timeout 5000 -server 127.0.0.1:2181 客户端与ZooKeeper建立链接@H_502_5@@H_502_5@timeout:超时时间,单位毫秒@H_502_5@@H_502_5@r:只读模式,当节点坏掉的时候,还可以提供读服务@H_502_5@@H_502_5@示例:@H_502_5@@H_502_5@./zkCli.sh -timeout 5000 -server 127.0.0.1:2181 @H_502_5@@H_502_5@Connecting to 127.0.0.1:2181@H_502_5@2018-09-19 16:48:35,332 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965,built on 02/20/2014 09:09 GMT@H_502_5@2018-09-19 16:48:35,336 [myid:] - INFO [main:Environment@100] - Client environment:host.name=iZ2ze4wl2jm5gr50lqkcu2Z@H_502_5@2018-09-19 16:48:35,337 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_181@H_502_5@2018-09-19 16:48:35,339 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation@H_502_5@2018-09-19 16:48:35,339 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-8-oracle/jre@H_502_5@2018-09-19 16:48:35,339 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:@H_502_5@2018-09-19 16:48:35,339 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:os.version=4.4.0-117-generic@H_502_5@2018-09-19 16:48:35,340 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root@H_502_5@2018-09-19 16:48:35,341 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root@H_502_5@2018-09-19 16:48:35,341 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/usr/local/zookeeper-3.4.6/bin@H_502_5@2018-09-19 16:48:35,344 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection,connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@506c589e@H_502_5@Welcome to ZooKeeper!@H_502_5@2018-09-19 16:48:35,410 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@975] - opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)@H_502_5@JLine support is enabled@H_502_5@2018-09-19 16:48:35,580 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@852] - Socket connection established to 127.0.0.1/127.0.0.1:2181,initiating session@H_502_5@2018-09-19 16:48:35,591 [myid:] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181,sessionid = 0x165f0e74c000003,negotiated timeout = 5000@H_502_5@@H_502_5@WATCHER::@H_502_5@@H_502_5@WatchedEvent state:SyncConnected type:None path:null@H_502_5@如上,表示我们和ZooKeeper建立了连接,可以通过命令与ZooKeeper进行交互了@H_502_5@@H_502_5@@H_502_5@2.查看命令帮助@H_502_5@h@H_502_5@ZooKeeper -server host:port cmd args@H_502_5@ stat path [watch]@H_502_5@ set path data [version]@H_502_5@ ls path [watch]@H_502_5@ delquota [-n|-b] path@H_502_5@ ls2 path [watch]@H_502_5@ setAcl path acl@H_502_5@ setquota -n|-b val path@H_502_5@ history @H_502_5@ redo cmdno@H_502_5@ printwatches on|off@H_502_5@ delete path [version]@H_502_5@ sync path@H_502_5@ listquota path@H_502_5@ rmr path@H_502_5@ get path [watch]@H_502_5@ create [-s] [-e] path data acl@H_502_5@ addauth scheme auth@H_502_5@ quit @H_502_5@ getAcl path@H_502_5@ close @H_502_5@ connect host:port@H_502_5@ @H_502_5@ 显示能够执行的命令@H_502_5@@H_502_5@命令分类和数据库相似,大概可以分为增删改查四类@H_502_5@@H_502_5@ZooKeeper数据结构:@H_502_5@@H_502_5@zookeeper.png放到桌面@H_502_5@@H_502_5@大多数时候,我们对ZooKeeper的操作都是在对节点进行增删改查@H_502_5@@H_502_5@常用命令:@H_502_5@@H_502_5@ @H_502_5@@H_502_5@查询相关指令@H_502_5@@H_502_5@ls path:列出path下的文件@H_502_5@@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 4] ls /@H_502_5@[zookeeper]@H_502_5@@H_502_5@@H_502_5@如上:列出根目录节点下的所有文件,目前就只有一个系统自带的zookeeper节点@H_502_5@@H_502_5@stat path:查看节点状态@H_502_5@@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 6] stat /zookeeper@H_502_5@cZxid = 0x0@H_502_5@ctime = Thu Jan 01 08:00:00 CST 1970@H_502_5@mZxid = 0x0@H_502_5@mtime = Thu Jan 01 08:00:00 CST 1970@H_502_5@pZxid = 0x0@H_502_5@cversion = -1@H_502_5@dataVersion = 0@H_502_5@aclVersion = 0@H_502_5@ephemeralOwner = 0x0@H_502_5@dataLength = 0@H_502_5@numChildren = 1@H_502_5@@H_502_5@cZxid:创建节点时的事务id@H_502_5@pZxid:子节点列表最后一次被修改的事务id@H_502_5@cversion:节点版本号@H_502_5@dataCersion:数据版本号@H_502_5@aclVerson:acl权限版本号@H_502_5@@H_502_5@@H_502_5@get path:获取指定节点的内容@H_502_5@@H_502_5@ls2 path:列出path节点的子节点及状态信息@H_502_5@@H_502_5@3.创建指令@H_502_5@create [-s] [-e] path data acl@H_502_5@@H_502_5@1 [zk: 127.0.0.1:2181(CONNECTED) 10] create /node_1 123@H_502_5@2 Created /node_1@H_502_5@@H_502_5@如上:在根目录创建了node_1节点,携带数据 123@H_502_5@@H_502_5@使用 get /node_1 验证是否添加节点及其数据成功@H_502_5@@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 15] create -e /node_1/node_1_1 234@H_502_5@Created /node_1/node_1_1@H_502_5@创建了一个临时节点(-e),并且携带数据234,使用stat命令查看这个新建的临时节点@H_502_5@@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 16] stat /node_1/node_1_1@H_502_5@cZxid = 0x200000003@H_502_5@ctime = Sat Aug 27 15:27:30 CST 2016@H_502_5@mZxid = 0x200000003@H_502_5@mtime = Sat Aug 27 15:27:30 CST 2016@H_502_5@pZxid = 0x200000003@H_502_5@cversion = 0@H_502_5@dataVersion = 0@H_502_5@aclVersion = 0@H_502_5@ephemeralOwner = 0x156cacb918b0000@H_502_5@dataLength = 3@H_502_5@numChildren = 0@H_502_5@@H_502_5@ephemeralOwner值不再是0,表示这个临时节点的版本号,如果是永久节点则其值为 0x0@H_502_5@1 [zk: 127.0.0.1:2181(CONNECTED) 1] create -s /node_1/node_1_1 234@H_502_5@2 Created /node_1/node_1_10000000001@H_502_5@通过使用-s参数,创建一个顺序节点,我们虽然指定的节点名是node_1_1,但是实际上,名称却是 node_1_10000000001,如果我们重复执行:@H_502_5@@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 2] create -s /node_1/node_1_1 234@H_502_5@Created /node_1/node_1_10000000002@H_502_5@效果如上@H_502_5@@H_502_5@ @H_502_5@@H_502_5@这个特性,我们可以利用一下,生成在分布式环境下的主键生成器@H_502_5@@H_502_5@ @H_502_5@@H_502_5@-s 和 -e 可以同时使用@H_502_5@@H_502_5@ @H_502_5@@H_502_5@@H_502_5@@H_502_5@4.退出:@H_502_5@quit@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 19] quit@H_502_5@Quitting...@H_502_5@2016-08-27 15:29:44,760 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x156cacb918b0000 closed@H_502_5@2016-08-27 15:29:44,763 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x156cacb918b0000@H_502_5@这个时候如果重新登录,执行 ls /node_1,发现其子节点是空的,创建的node_1_1子节点不见了,那是因为之前创建的时候就已经指定了,我们创建的是一个临时节点。当客户端会话结束后,临时节点是会被删除了。@H_502_5@@H_502_5@ @H_502_5@@H_502_5@5.修改相关指定:@H_502_5@@H_502_5@set path data [version]@H_502_5@@H_502_5@ @H_502_5@@H_502_5@复制代码@H_502_5@[zk: 127.0.0.1:2181(CONNECTED) 14] set /node_1 998@H_502_5@cZxid = 0x200000002@H_502_5@ctime = Sat Aug 27 15:24:39 CST 2016@H_502_5@mZxid = 0x20000000a@H_502_5@mtime = Sat Aug 27 15:38:40 CST 2016@H_502_5@pZxid = 0x200000008@H_502_5@cversion = 5@H_502_5@dataVersion = 2@H_502_5@aclVersion = 0@H_502_5@ephemeralOwner = 0x0@H_502_5@dataLength = 3@H_502_5@numChildren = 3@H_502_5@复制代码@H_502_5@如果我们多次修改,会发现 dataVersion ,也就是数据版本,在不停得发生变化(自增)@H_502_5@@H_502_5@ @H_502_5@@H_502_5@如果我们在set的时候手动去指定了版本号,就必须和上一次查询出来的结果一致,否则 就会报错。@H_502_5@@H_502_5@这个可以用于我们在修改节点数据的时候,保证我们修改前数据没被别人修改过。因为如果别人修改过了,我们这次修改是不会成功的@H_502_5@@H_502_5@ @H_502_5@@H_502_5@ @H_502_5@@H_502_5@6.删除指令:@H_502_5@@H_502_5@delete path [version]@H_502_5@@H_502_5@删除指定节点数据,其version参数的作用于set指定一致@H_502_5@@H_502_5@ @H_502_5@@H_502_5@delete /node_1/node_1_10000000001@H_502_5@整个节点全删除@H_502_5@@H_502_5@注意:delete只能删除不包含子节点的节点,如果要删除的节点包含子节点,使用rmr命令@H_502_5@@H_502_5@rmr /node_1