删除topic
kafka
未设置delete.topic.enable=true
时, 尝试删除topic
会显示test - marked for deletion
于是登录zookeeper
客户端(zkCli.sh
), 尝试删除topic
- 查看
topic
所在的目录:ls /brokers/topics
; - 查看
marked for deletion
标记的topic
:ls /admin/delete_topics
删除此处的topic
, 可以恢复 ls /config/topics
, 也有所有topic
的信息, 但用途不明
删除zookeeper
上对应的节点之后,kafka
上对应的topic
从列表中消失- 最后删除磁盘上的对应文件.
server.properties
中, 设置了log.dirs
. 在该目录下可以找到所有的topic
文件, 在每个kafka
节点删除的指定topic
, 就手动删除了topic
误删除zookeeper文件
删除指定topic
时, 把zookeeper
上的所有topic
都删除掉了
于是考虑数据恢复
1. 查看快照和日志
在$ZOOKEEPER_HOME/data
和$ZOOKEEPER_HOME/datalog
文件夹中, 有zookeeper
的快照和增量日志, 根据快照和增量日志, 可以将zookeeper
恢复到指定的状态
快照和日志文件都是可读的, 参考使用下述指令
# 查看Log
java -cp dist-maven/zookeeper-3.4.9.jar;lib/log4j-1.2.16.jar;lib/slf4j-log4j12-1.6.1.jar;lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.4115cad8c1
# 查看快照
java -cp dist-maven/zookeeper-3.4.9.jar;lib/log4j-1.2.16.jar;lib/slf4j-log4j12-1.6.1.jar;lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.4115cad8bf
实际操作中, 无法使用-cp
+;
指定多个jar
包, 于是将所需jar
包放到同一个文件夹下, 指定整个文件夹为环境变量, 假设jar包都放在lib文件夹里, 可以使用参数java -Djava.ext.dirs=lib test
2. 恢复zookeeper
状态
ls -lt
根据更改时间排序, $ZOOKEEPER_HOME/data
和$ZOOKEEPER_HOME/datalog
文件夹中, 只保留最接近异常之前的 快照和增量日志, 然后重启zk
集群即可
rename
时遇到的问题
- 计划将文件夹下的数据全部加
.bak
后缀, 只保留正确的快照 - 考虑到
mv
无法批量改名, 因此尝试使用rename
- 谷歌了
rename
批量改名的语法, 给出的解决方案是使用正则. - 尝试使用正则语法, 发现在环境中该语法是无效的
rename
有两个版本, 输入rename --help
提示call: rename from to files...
说明不支持正则语法, 提示rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
说明支持- 最终选择使用
shell
脚本实现该功能, 如下
for f in `ls ./`
do
mv $f ${f}.bak
done