环境信息
项目 | 版本 | 备注 |
---|---|---|
操作系统 | windows10 | 当前Docker运行在Windows操作系统上 |
Docker Desktop | 3.3.1 | 使用该软件来管理Docker |
Docker Engine | 20.10.5 | Docker核心引擎 |
zookeeper镜像 | 3.5.9 | 用docker pull zookeeper:3.5.9 拉取的 |
1.寻找文件的位置
首先,我们用 docker exec -it zk容器ID或者名字 bash
登入容器内:
如上图所示,我们成功登入了正在运行 zk容器。
1.1 寻找配置文件 zoo.cfg
find / -name zoo.cfg
如下图所示,我们找到了配置文件zoo.cfg
的保存路径:
1.2 寻找快照和事务日志路径
然后,我们来cat /conf/zoo.cfg
查看一下配置信息:
如图所示:
- dataDir: 如果只有这个配置,那么对应的 事务日志文件 和 快照文件 都在该配置所在的目录下。
- dataLogDir: 如果有该配置,那么会把事务日志 存放在该配置所在的目录中。
于是,我们顺藤摸瓜,找到了快照和事务日志的存储路径:
- 快照文件 保存在
/data
目录下 - 事务日志文件 保存在
/datalog
目录下
既然已经找到对应的 事务日志文件 和 快照文件 ,那么接下来就需要进行解析了。
2. 解析文件
2.1 验证java已安装
zookeeper是使用java语言进行开发的,里面有提供 事务日志文件 和 快照文件的解析的工具。在zk容器内,java是默认安装好的,可用通过java --version
来验证:
2.2 寻找jar包路径
网上很多文章都提到了:
- 解析事务日志需要用到类 org.apache.zookeeper.server.LogFormatter
- 解析快照需要用到类 org.apache.zookeeper.server.SnapshotFormatter
而这两个类都在 zookeeper-3.5.9.jar
中,使用命令 find / -name "zookeeper-3.5.9.jar
寻找jar包所在路径:
如上图所示,我们找到了 jar 包保存在 /apache-zookeeper-3.5.9-bin/lib/
目录下。
于是,我们进入该目录 cd /apache-zookeeper-3.5.9-bin/lib/
2.3 尝试查看事务日志文件
★ 使用 ls -al /datalog/version-2
查看事务日志文件目录:
如上图所示,事务日志文件名称是 log.最大的事务id 的格式。
★ 运行解析事务日志的命令(注意:执行当前命令的工作目录是jar包所在的目录):
java -classpath zookeeper-3.5.9.jar:zookeeper-jute-3.5.9.jar:slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter /datalog/version-2/log.1
打印的事务日志文件的内容如下:
root@bbeb695a7013:/apache-zookeeper-3.5.9-bin/lib# java -classpath zookeeper-3.5.9.jar:zookeeper-jute-3.5.9.jar:slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogForma
tter /datalog/version-2/log.1
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
7/1/21, 11:53:24 AM UTC session 0x10001a2a3910000 cxid 0x0 zxid 0x1 createSession 30000
7/1/21, 11:55:46 AM UTC session 0x10001a2a3910000 cxid 0x2 zxid 0x2 closeSession null
EOF reached after 2 txns.
- session 0x10001a2a3910000:sessionId
- cxid 0x0:客户端id,会递增的
- zxid 0x1:事务id,会递增
- createSession 30000:建立客户端连接,超时时间30s
2.4 尝试查看快照文件
★ 使用 ls -al /data/version-2
查看快照文件目录:
如上图所示,快照文件名称是 snapshot.最大的事务id 的格式。
★ 运行解析快照文件的命令(注意:执行当前命令的工作目录是jar包所在的目录):
java -classpath zookeeper-3.5.9.jar:zookeeper-jute-3.5.9.jar:slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter /data/version-2/snapshot.1
解析快照文件成功,打印的内容如下:
root@bbeb695a7013:/apache-zookeeper-3.5.9-bin/lib# java -classpath zookeeper-3.5.9.jar:zookeeper-jute-3.5.9.jar:slf4j-api-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter /data/version-2/snapshot.0
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZNode Details (count=5):
----
/
cZxid = 0x00000000000000
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/zookeeper
cZxid = 0x00000000000000
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/zookeeper/config
cZxid = 0x00000000000000
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = -1
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/zookeeper/quota
cZxid = 0x00000000000000
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
Session Details (sid, timeout, ephemeralCount):
快照文件,包含某一时刻,每个节点的快照信息。
参考文档
- zookeeper 解析和读取快照和事务日志 阅读
花絮
1、当classpath中只引用 zookeeper-3.5.9.jar
时:
root@bbeb695a7013:/apache-zookeeper-3.5.9-bin/lib# java -classpath zookeeper-3.5.9.jar org.apache.zookeeper.server.LogFormatter /datalog/version-2/log.1
Error: Unable to initialize main class org.apache.zookeeper.server.LogFormatter
Caused by: java.lang.NoClassDefFoundError: org/apache/jute/InputArchive
找不到
org.apache.jute
中的类。
2、当classpath中引用 zookeeper-3.5.9.jar
和 zookeeper-jute-3.5.9.jar
时 (使用:
分隔多个jar)
root@bbeb695a7013:/apache-zookeeper-3.5.9-bin/lib# java -classpath zookeeper-3.5.9.jar:zookeeper-jute-3.5.9.jar org.apache.zookeeper.server.LogFormatter /datalog/version
-2/log.1
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.apache.zookeeper.server.LogFormatter.<clinit>(LogFormatter.java:41)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
找不到类
org.slf4j.LoggerFactory
。