Docker容器zookeeper解析和读取快照和事务日志

环境信息

项目 版本 备注
操作系统 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: 如果有该配置,那么会把事务日志 存放在该配置所在的目录中。

于是,我们顺藤摸瓜,找到了快照和事务日志的存储路径:

  1. 快照文件 保存在 /data 目录下
  2. 事务日志文件 保存在 /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.jarzookeeper-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

原文地址:https://www.cnblogs.com/kendoziyu/p/14980200.html