ZooKeeper作为一个分布式协调服务,其核心功能依赖于客户端与服务器之间的命令交互,掌握常用命令是高效使用ZooKeeper的基础,这些命令涵盖了节点管理、数据操作、监控等多个方面,能够帮助开发者实现对分布式系统的有效控制和状态查询,ZooKeeper的命令行工具通过zkCli.sh(Linux)或zkCli.cmd(Windows)启动,连接服务器后即可执行相关操作。

连接服务器是使用命令的第一步,通过connect命令可以指定主机和端口,默认连接localhost:2181,例如connect 192.168.1.100:2181,节点操作是ZooKeeper命令的核心,其中create命令用于创建节点,支持多种模式:-e创建临时节点(会话结束后自动删除),-s创建顺序节点(节点名后会附加递增序号),两者可组合使用,如create -e -s /tmp/node1 "data"创建临时顺序节点。ls命令用于列出指定路径下的子节点,如ls /查看根节点下的直接子节点,ls -R /可递归查看所有节点。get命令用于获取节点的数据和属性,例如get /zookeeper可查看/zookeeper节点的数据内容和版本信息、创建时间、子节点数量等元数据。set命令用于更新节点数据,需配合版本号实现乐观锁机制,如set /node1 "newdata" 3表示将版本号为3的节点数据更新为"newdata",若版本号不匹配则操作失败。delete命令用于删除节点,只能删除无子节点的普通节点,删除时同样需指定正确版本号;若需删除包含子节点的目录,则使用deleteall命令,如deleteall /parent。
权限管理命令确保节点数据的安全性,addauth命令用于添加认证信息,如addauth digest username:password添加摘要认证。getAcl和setAcl分别用于获取和设置节点的访问控制列表(ACL),ACL支持多种模式:ip(IP地址限制)、digest(用户名:密码摘要认证)、world(所有人可访问)、auth(已认证用户可访问),例如setAcl /node1 ip:192.168.1.100:crdw表示仅允许该IP地址的客户端创建、读取、数据写入、删除节点。
监控命令用于实时关注节点变化,stat命令可查看节点的详细状态,包括数据版本、子节点版本、创建时间、最后修改时间、临时节点数量等,例如stat /node1。get命令配合-w参数可设置数据监视器,当节点数据变化时客户端会收到通知,如get -w /node1,监视器为一次性触发,需重新设置才能持续监控;ls命令同样支持-w参数监控子节点变化,如ls -w /parent,当子节点列表发生变化时触发通知。
除了基础命令,ZooKeeper还提供了一些实用辅助命令。history命令可查看执行过的命令历史,redo命令可重复执行历史命令,如redo 3执行历史列表中的第3条命令。close命令用于关闭当前客户端连接,quit或exit命令则退出客户端 shell,在调试或排查问题时,printwatches命令可查看当前设置的监视器状态,printwatches on/off可控制是否在输出中显示监视器信息。

| 命令类型 | 命令格式及示例 | 功能说明 |
|---|---|---|
| 节点创建 | create [-e] [-s] path data [acl],如create -e /node1 "hello" |
创建指定路径、数据和模式的节点,支持临时、顺序节点 |
| 节点列表 | ls [-w] [-R] path,如ls -R / |
列出子节点,支持递归查看和设置子节点变化监视器 |
| 节点数据获取 | get [-w] path [watcher],如get /node1 |
获取节点数据和元数据,支持设置数据变化监视器 |
| 节点数据更新 | set path data [version],如set /node1 "world" 2 |
更新节点数据,需匹配版本号实现乐观锁 |
| 节点删除 | delete path [version]或deleteall path,如deleteall /parent |
删除节点或递归删除目录,删除时需匹配版本号 |
| 权限管理 | getAcl path、setAcl path acl,如setAcl /node1 digest:user:123456:rwadc |
获取或设置节点ACL,支持IP、摘要等多种认证模式 |
| 状态查看 | stat path,如stat /node1 |
查看节点的详细状态信息,包括版本、时间戳、临时节点数量等 |
| 连接管理 | connect host:port、close、quit |
连接/断开ZooKeeper服务器,关闭连接或退出客户端 |
相关问答FAQs
Q1: ZooKeeper中的临时节点和持久节点有什么区别?临时节点在什么情况下会被删除?
A1: 持久节点(默认创建类型)一旦创建,除非手动删除,否则会一直存在于ZooKeeper服务器中;而临时节点与会话(Session)绑定,当创建该节点的客户端会话结束(如客户端宕机、网络断开超时或主动关闭连接)时,临时节点会被ZooKeeper服务器自动删除,临时节点不能创建子节点,且其名称不能包含顺序后缀(除非与顺序节点模式组合,但本质仍是临时节点),临时节点常用于实现分布式锁、服务注册发现等场景,通过节点的存在与否判断服务状态。
Q2: 使用set命令更新节点数据时,版本号(version)的作用是什么?如果版本号不匹配会怎样?
A2: 版本号是ZooKeeper实现乐观锁机制的关键,每个节点的数据、子节点列表、ACL均有独立版本号,初始值为0,每次set更新数据时,客户端需提供当前已知的数据版本号,若服务器端该节点的实际版本号与客户端提供的版本号一致,则更新成功,版本号自动加1;若不一致,说明该数据已被其他客户端修改,服务器会拒绝更新并返回BadVersion错误,这种机制确保了分布式环境下数据更新的原子性和一致性,避免了并发修改导致的数据覆盖问题。

