zookeeper命令
怎么使用zookeeper
- 连接进入zk服务
# /opt/apache-zookeeper-3.7.2-bin/bin/zkCli.sh -server 127.0.0.1:2181 /opt/apache-zookeeper-3.7.2-bin/bin/zkCli.sh # 默认连接到localhost:2181是一个java脚本,目录在
/opt/apache-zookeeper-3.7.2-bin/bin/zkCli.sh, zk的log写入了/opt/apache-zookeeper-3.7.2-bin/logs/zookeeper-root-server-node1.out - 命令合集
*** 详情参加zookeeperCLI笔记
ZooKeeper -server host:port -client-configuration properties-file cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path [-b batch size]
delquota [-n|-b|-N|-B] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b|-N|-B val path
stat [-w] path
sync path
version
whoami
ZooKeeper 通常存储实时状态数据,如在线 / 离线、心跳),而数据库(如 MariaDB)存储持久化元数据(如总容量、历史分配记录)。两者通过定时同步或事件通知保持一致。
命令尝试
连接/close
因为一使用脚本zkCli.sh就默认连接本地的2181端口,可以尝试端口close,重连。
close
WATCHER::
WatchedEvent state:Closed type:None path:null
2025-10-21 20:02:45,379 [myid:] - INFO [main:ZooKeeper@1232] - Session: 0x100040fcf6e06de closed
[zk: 127.0.0.1:2181(CLOSED) 39] 2025-10-21 20:02:45,379 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@568] - EventThread shut down for session: 0x100040fcf6e06de
[zk: 127.0.0.1:2181(CLOSED) 39] connect 127.0.0.1:2181
2025-10-21 20:03:09,387 [myid:] - INFO [main:ZooKeeper@637] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@6f195bc3
2025-10-21 20:03:09,388 [myid:] - INFO [main:ClientCnxnSocket@239] - jute.maxbuffer value is 1048575 Bytes
2025-10-21 20:03:09,388 [myid:] - INFO [main:ClientCnxn@1741] - zookeeper.request.timeout value is 0. feature enabled=false
[zk: 127.0.0.1:2181(CONNECTING) 40] 2025-10-21 20:03:09,391 [myid:127.0.0.1:2181] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1177] - Opening socket connection to server localhost/127.0.0.1:2181.
2025-10-21 20:03:09,391 [myid:127.0.0.1:2181] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1179] - SASL config status: Will not attempt to authenticate using SASL (unknown error)
2025-10-21 20:03:09,392 [myid:127.0.0.1:2181] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1011] - Socket connection established, initiating session, client: /127.0.0.1:45320, server: localhost/127.0.0.1:2181
2025-10-21 20:03:09,399 [myid:127.0.0.1:2181] - INFO [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1452] - Session establishment complete on server localhost/127.0.0.1:2181, session id = 0x100040fcf6e06e2, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
根据PureFlash/thirdParty/zookeeper/zookeeper-contrib/zookeeper-contrib-huebrowser/zkui/src/zkui/stats.py里ZooKeeperStats的定义,这里默认init以localhost:2181连接

查看当前所用的zkcli版本
[zk: 127.0.0.1:2181(CONNECTED) 40] version
ZooKeeper CLI version: 3.7.2-c06c7c8a3e95779d4becb1938b378596e3b420d0, built on 2023-10-06 09:51 UTC
查看zk里的conductor

监听addWatch/removewatches
addWatch
增加监听者,用于注册持久化监听的命令,用于解决原生 ZooKeeper 监听 “一次性触发” 的问题。
PERSISTENT:持久化监听。对目标节点的数据变化(NodeDataChanged)和节点删除(NodeDeleted)事件持续监听,触发后不会失效(无需重新注册)。但不监听子节点变化。-
PERSISTENT_RECURSIVE:持久化递归监听(默认模式)。不仅监听目标节点本身的变化,还会递归监听所有子节点的创建、删除、数据更新事件,且所有监听都是持久化的(触发后不失效)。 path:需要监听的节点路径(必须是已存在的节点,否则会报错)。
zkHelper.watchNode(zkBaseDir + "/stores/"+store_id+"/trays/"+t+"/online", new ZkHelper.NodeChangeCallback() {
@Override
void onNodeCreate(String childPath) {
logger.info("ssd online, {}", childPath);
S5Database.getInstance().sql("update t_tray set status=? where uuid=?", Status.OK, t).execute();
}
@Override
void onNodeDelete(String childPath) {
logger.info("ssd offline, {}", childPath);
S5Database.getInstance().sql("update t_tray set status=? where uuid=?", Status.OFFLINE, t).execute();
}
});
这里的逻辑是检测当zk增加或删除node同步更新数据库,但是会留着记录。
String trayOnZk = zkBaseDir + "/stores/"+store_id+"/trays";
logger.info("watchNewChild on: {} ", trayOnZk);
zkHelper.watchNewChild(trayOnZk, new ZkHelper.NewChildCallback() {
@Override
void onNewChild(String childPath) {
logger.info("New disk found in zk:{}", childPath);
updateStoreTrays(store_id);
}
});
这里是检测当前节点下有多的tray,就增加用updateStoreTrays方法
removewatches
这个应该与addWatch对应的,删除操作。
zookeeper代码结构
PureFlash/thirdParty/zookeeper/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperMain.java: 看起来是zoocli的主函数,就是用/opt/apache-zookeeper-3.7.2-bin/bin/zkCli.sh启动的client climain:PureFlash/thirdParty/zookeeper/zookeeper-server/src/main/java/org/apache/zookeeper/cli/CliCommand.java