zookeeper的shell客户端

本文介绍ZooKeeper的数据存储特点,包括znode的目录结构、数据存储方式及节点类型,如永久、短暂和带序号的节点。同时,详细讲解了ZooKeeper客户端的基本操作命令,如创建、获取、删除节点等。

0 数据存储特点
znode类似于Linux的目录结构(TREE) , 维护了节点的层级关系 ,

真正的数据存储是以key:value的形式存储的! 

在所有的ZK节点上存储的数据是同步一致的!

zookeeper中对数据的存储采用key-value的形式

然后,它的key有特别的格式——路径的形式!(  /service/dn1 doit01    /service/dn2    doit02 )

之所以采取这种形式,是因为zookeeper中的数据节点(znode)之间可以存在父子关系;

zookeeper的数据节点分为以下类型:

永久的znode:客户一旦创建这个znode,它就会被zookeeper一直保存,除非人为删除;

短暂的znode:客户创建完这个znode后,如果客户断开与zookeeper的连接,则该数据马上会被zookeeper删除;

带序号的znode:客户创建一个key,zookeeper会为客户的key自动拼接一个递增的序号!

(客户创建的是/aaa/x  ,那么zookeeper真实生成的key为:  /aaa/x0000000000001

如果客户继续创建 /aaa/y,那么zookeeper真实生成的key为:/aaa/y000000000002)

另外: 永久的和短暂的,都可以跟“带序号的”特性进行组合!组合下来之后共有4种:

永久不带序号
永久且带序号的
短暂不带序号
短暂且带序号的

1 登录客户端

  1. bin/zkCli.sh    
  2. bin/zkCli.sh    -server  linux01:2181
  3. bin/zkCli.sh    -server  linux01:2181,linux02:2181,linux03:2181

 

help

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]  更新数据
        ls path [watch]    查看指定目录下的节点  ls /   ls /servers
        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
 

 

2 基础命令

2.1 ls和ls2 

2.2 创建节点 create
注意在zk中节点分成两种 临时和永久节点 默认的节点是永久节点

临时节点(生命周期是客户端的连接)  -e(临时)  -s(有序)

 无序临时节点   create  -e    /node value
有序临时节点  create   -s  -e    /node value
永久节点(默认的)

永久无序节点   create  /node  value 
永久有序节点  create  -s   /node  value
2.3 获取节点的值  get
[zk: localhost:2181(CONNECTED) 13] get /aa0000000004
AA
cZxid = 0x200000019
ctime = Wed Jul 15 15:15:41 CST 2020
mZxid = 0x200000019
mtime = Wed Jul 15 15:15:41 CST 2020
pZxid = 0x200000019
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
 

<think>嗯,用户现在想用ZooKeeperShell脚本批量删除节点或数据。首先,我得回忆一下ZooKeeper的常用命令。根据之前的引用,用户提到了delete命令,但只能删除空节点,也就是没有子节点的节点。所以如果节点有子节点,直接delete会失败,必须递归删除。 那用户的问题是如何批量删除,可能需要删除一个父节点及其所有子节点。但ZooKeeper的原生命令好像不支持递归删除,比如delete或者rmr,但有些资料提到过rmr命令,不过不确定是否所有版本都有。比如引用3里说delete只能删除空节点,而引用2里的例子用了ls -R来递归查看,但没有删除的例子。 可能需要用Shell脚本结合zkCli.sh来执行。比如,先获取某个节点下的所有子节点,然后逆序删除,从最深的子节点开始删,最后删父节点。或者用递归的方式遍历每个节点,逐个删除。不过手动写脚本的话,可能需要用到循环或者递归函数。 另外,用户提到批量删除,可能需要处理多个节点,所以示例脚本应该展示如何遍历并删除。比如,先通过ls -R获取所有节点路径,然后倒序排列,逐个执行delete。或者使用find命令,不过ZooKeeperShell可能不支持find,需要自己实现。 还要注意权限问题,引用4提到ACL控制,可能需要超级管理员权限才能删除某些节点,所以在脚本里可能需要添加认证信息,比如addauth digest username:password。 然后,考虑到版本兼容性,比如在ZooKeeper 3.5及以上是否有新的命令,比如deleteall,但需要确认。引用5里提到了set命令,但和删除无关。可能需要查阅最新文档,但根据现有引用,用户提供的资料中没有提到deleteall,所以可能还是需要用脚本实现递归删除。 总结步骤应该是:连接到zkCli.sh,验证权限,递归获取所有子节点路径,逆序删除每个子节点,最后删除父节点。示例脚本可能包括一个循环,或者使用echo组合多个delete命令然后通过管道传递给zkCli.sh。 还要注意处理错误,比如节点不存在的情况,或者权限不足的情况,可能需要-f参数强制忽略错误。但ZooKeeper的delete命令是否有-f选项呢?根据引用3,delete只能带版本号-v,可能没有-f,所以脚本需要处理错误。 最后,给出几种方法,比如手动逐层删除,编写Shell脚本自动递归删除,或者使用ZooKeeper API的工具,比如zkDeleteRecursive,或者第三方工具如Apache Curator的removeDeletes方法。这样用户可以根据自己的环境选择最适合的方法。</think>根据ZooKeeper Shell特性及实际运维经验,以下是批量删除节点的解决方案(结合引用内容优化): ### 一、递归删除核心原理 ZooKeeper原生Shell命令$delete$仅支持删除空节点,需结合递归操作实现批量删除。根据引用[3]的规则: $$删除条件 = (节点存在) \land (无子节点) \land (数据版本匹配)$$ 需通过脚本实现自底向上的逐层删除。 ### 二、批量删除实现方法 #### 方法1:手动递归操作(适用于少量节点) ```shell # 连接到ZooKeeper客户端 ./zkCli.sh -server localhost:2181 # 递归查看目标节点结构(引用[2]的-R参数) ls -R /target_node # 输出示例:/parent/child1 /parent/child2 /parent # 倒序删除子节点 delete /parent/child1 delete /parent/child2 delete /parent ``` #### 方法2:Shell脚本自动化(推荐) ```bash #!/bin/bash ZK_PATH="/path/to/zkCli.sh" ZNODE="/target_node" # 获取所有子节点路径(引用[2]的-R参数) $ZK_PATH -server localhost:2181 <<EOF | grep -Po "(?<=^\[zk:).*$ZNODE.*" > nodes.list ls -R $ZNODE quit EOF # 按节点深度倒序排列 tac nodes.list | while read node; do $ZK_PATH -server localhost:2181 <<EOC delete $node quit EOC done ``` #### 方法3:使用ZooKeeper内置工具(3.5+版本) ```shell # 使用deleteall命令(需开启ACL认证时引用[4]的配置) echo "deleteall /target_node" | ./zkCli.sh -server localhost:2181 ``` ### 三、增强型批量删除脚本 ```bash #!/bin/bash ZK_SERVER="localhost:2181" BASE_NODE="/test" AUTH="user:password" # 引用[4]的认证配置 # 认证并获取节点列表 echo "addauth digest $AUTH ls -R $BASE_NODE quit" | ./zkCli.sh -server $ZK_SERVER | awk '/^\//{print $1}' > zk_nodes.txt # 按节点层级逆序删除 tac zk_nodes.txt | while read node; do echo "删除节点: $node" echo "delete $node quit" | ./zkCli.sh -server $ZK_SERVER done ``` ### 四、注意事项 1. **权限控制**:批量删除前需确保已配置ACL权限(引用[4]的超级管理员模式) 2. **版本验证**:生产环境建议添加版本校验参数(引用[5]的set命令版本控制逻辑) 3. **审计追踪**:删除操作建议记录$mZxid$和$mtime$(引用[2]的节点状态信息)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值