dataDir
中,事务日志在未设置dataLogDir
参数时默认与snapshot存放路径相同,运行日志zookeeper.out默认存放在启动脚本的当前路径下
snapshot是zookeeper节点存储的数据的永久备份,而事务日志transaction log则是用于存储Znode的变化信息。当事务日志文件变得较大时,Zookeeper会将当前所有znode节点的最新状态生成快照snapshot存储到dataDir中,同时生成新的事务日志,用于接收最新的znodes变化。在生成新快照期间,也许会有新的事务被追加到旧的事务日志中,因此有些比快照更新的事务也许会存放在上一个版本的事务日志中
在Zookeeper的默认设置中,默认将snapshot和事务日志放置在同一个文件夹中,且默认会永久保存这两种文件。在Zookeeper 3.4.0之后可以通过设置conf/zoo.cfg
中的autopurge.snapRetainCount
和autopurge.purgeInterval
参数来开启定时清理,每次保留固定数量的快照与其对应的事务日志
官方文档中建议将快照snapshot和事务日志transaction log存放于不同存储设备中,即单独设置dataLogDir
存放事务日志,并且不与dataDir
在同一设备下,因为是否设置独立存储设备用于存储日志,将会对Zookeeper吞吐量有较大影响
zookeeper.out文件在官方文档中并没有被称为运行日志,在此只是一种通俗的便于理解的称呼,zookeeper的默认存放路径在启动zkServer.sh脚本的当前路径下,这就导致每次启动zkServer.sh时都很难记住生成的zookeeper文件存放位置,因此建议修改其生成路径,便于每次出错后能快速定位错误
Zookeeper使用SLF4J(Simple Logging Facade for Java)
作为其日志的基本框架(接口),为了向后兼容,Zookeeper绑定使用的是LOG4J(Log for Java)
作为其具体的日志解决方案,log4j是Apache的开源项目之一。当然也可以在SLF4J
的基础上使用其他的日志框架,这取决于你的具体应用
独立存储事务日志
conf/zoo.cfg
的默认参数设置中没有dataLogDir
参数,也没有相关介绍,但是在官方文档的Advanced Configuration部分有具体描述。具体设置可参考:
15 # 自定义Zookeeper集群数据本地存储路径
16 dataDir=/opt/module/zookeeper-3.4.14/zkData
17 # 设置事务日志transaction log的存储路径,默认是dateDir,但是理应存储在不同设备下,避免对吞吐量造成负面影响
18 dataLogDir=/opt/module/zookeeper-3.4.14/logs/transaction
快照和事务日志定期清理
在Zookeeper 3.4.0之后可以通过设置conf/zoo.cfg
中的autopurge.snapRetainCount
和autopurge.purgeInterval
参数来开启定时清理,每次保留固定数量的快照与其对应的事务日志。具体设置可参考:
34 # The number of snapshots to retain in dataDir
35 autopurge.snapRetainCount=3
36 # Purge task interval in hours
37 # Set to "0" to disable auto purge feature
38 autopurge.purgeInterval=1
事务日志可视化
事务日志transaction log默认都是二进制文件,关于日志格式化输出,官方文档中也有相应介绍,基本都是基于zookeeper和slf4j提供的API实现二进制日志文件格式转换,命令使用格式为java -cp zookeeper-3.4.14.jar:lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter
,注意:其中所使用的包的版本需要根据自己的zookeeper调整,使用的LogFormatter类应该都是固定的。具体使用可参考:
[tomandersen@hadoop101 zookeeper-3.4.14]$
[tomandersen@hadoop101 zookeeper-3.4.14]$
[tomandersen@hadoop101 zookeeper-3.4.14]$ java -cp zookeeper-3.4.14.jar:lib/slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter logs/transaction/version-2/log.300000001
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
20-2-19 上午10时02分46秒 session 0x1000034fab40000 cxid 0x0 zxid 0x300000001 createSession 30000
20-2-19 上午10时03分38秒 session 0x1000034fab40000 cxid 0x2 zxid 0x300000002 create '/TomAndersen,#5468697320697320546f6d416e64657273656e277320706572736f6e616c20736974652e,v{s{31,s{'world,'anyone}}},F,1
20-2-19 上午10时03分44秒 session 0x1000034fab40000 cxid 0x4 zxid 0x300000003 closeSession null
EOF reached after 3 txns.
[tomandersen@hadoop101 zookeeper-3.4.14]$
[tomandersen@hadoop101 zookeeper-3.4.14]$
[tomandersen@hadoop101 zookeeper-3.4.14]$
修改运行日志输出路径
具体修改zookeeper.out的输出路径,可以参考:Zookeeper修改运行日志zookeeper.out输出路径
以上是个人结合各种资料的理解,如果存在错误恳请各位留言指正,感谢!
End~