zookeeper的znode节点过多无法通过zkCli.sh移除节点
背景描述:zookeeper的一个目录下的znode节点过多,导致在执行ls 和rmr命令的时候,直接终止会话退出,无法递归删除下面的子节点,具体情况如下(生产环境的zookeeper是clickhouse的元数据管理集群,有一个故障是clickhouse副本同步堆积问题),接下来的操作需要知道这个子节点中的znode有序节点是怎么命名的,一般都是‘节点名称-000000xxxxxx’,由于无法获取子节点的列表,所以需要通过循环删除节点找到,大概的区间,然后再逐条尝试删除node
这边写了一个jave的操作代码如下
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
public class DeleChildNode {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
if (0 == args.length) {
System.out.println("没有zkurl和zkpath参数,自动退出,参数样例:127.0.0.1:2181 /clickhouse/2/table/host/replices/queue/ 10000 9999999999 10001");
System.exit(0);
}
System.out.println("zkurl:" + args[0] + "\tzkpath:" + args[1] + "\t起始位置:" + args[2] + "\t结束位置:" + args[3] + "\t步长:" + args[4] );
ZooKeeper zk = new ZooKeeper(args[0], 500000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
// dosomething
System.out.println("成功建立监听连接。。。");
}
});
String t;
int start = Integer.parseInt(args[2]);
int end = Integer.parseInt(args[3]);
int length = Integer.parseInt(args[4]);
String queue;
String[] zore = {"0", "00", "000", "0000", "00000"};
for (int i = start; i < end; i = i + length) {
try {
t = i + "";
queue = "queue-" + zore[10 - t.length() - 1] + t;
// System.out.println(args[1] + queue);
zk.delete(args[1] + queue, -1);
System.out.println("success:"+args[1] + queue);
} catch (Exception e) {
System.out.println("fail:"+e.getMessage());
}
}
zk.close();
}
}
通过上面的这个运行的日志找到删除成功的序列号,定位start 和 end结束点,然后逐个删除
ps备注:目前压测了一下这个zookeeper,一个目录下有25w~35W的节点目录,获取这个目录下的这个子目录就会有问题,这个有大佬知道是什么问题吗?