zookeeper 清理snapshot及事务日志.md

1.楔子

zookeeper在运行过程中,不断地生成snapshot文件和事务日志,但是不会自动清理它们,需要管理员来处理。

2.zk日志介绍

dataDir=/datab //快照日志
dataLogDir=/datalog //事务日志

dataLogDir如果没提供的话使用的则是dataDir。默认情况下,ZK的数据文件和事务日志是保存在同一个目录中,建议是将事务日志存储到单独的磁盘上。

zookeeper的持久化都存储在这两个目录里。

  • snapshot文件
    dataDir里放的是内存数据结构的snapshot,便于快速恢复。文件后缀是zxid,也就是事务id。(这个zxid代表了zk触发快照那个瞬间,提交的最后一个事务id)
    为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。
    注意,一个快照文件中的数据内容和提交第zxid个事务时内存中数据近似相同。仅管如此,由于更新操作的幂等性,ZK还是能够从快照文件中恢复数据。数据恢复过程中,将事务日志和快照文件中的数据对应起来,就能够恢复最后一次更新后的数据了。
  • 事务日志
    dataLogDir目录是ZK的事务日志目录,包含了所有ZK的事务日志。正常运行过程中,针对所有更新操作,在返回客户端“更新成功”的响应前,ZK会确保已经将本次更新操作的事务日志写到磁盘上,只有这样,整个更新操作才会生效。每触发一次数据快照,就会生成一个新的事务日志。事务日志的文件名是log.,zxid是写入这个文件的第一个事务id。

3.日志清理

ZK在完成若干次事务日志之后(在ZK中,凡是对数据有更新的操作,比如创建节点,删除节点或是对节点数据内容进行更新等,都会记录事务日志),ZK会触发一次快照(snapshot),将当前server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件。这里的若干次事务日志是可以配置的,默认是100000,具体参看关于配置参数snapCount的介绍。

  • 使用自带工具zkCleanup.sh
    使用zk自带的工具bin/zkCleanup.sh,是可以执行清理工作的。
  • 自动清理
    从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCountautopurge.purgeInterval这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:

autopurge.purgeInterval 这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

4. 参考文献
  • ZooKeepr日志清理
  • Zookeeper深入理解(三)(Zookeeper管理之运维)
5. 附录

preAllocSize
preAllocSize事务日志文件的预分配大小(kb)(zookeeper.preAllocSize)。
当Server写入事务日志时, 会一次性申请preAllocSize大小的文件块,这会减少磁盘空间分配和元数据更新的开销,更重要的是减少了寻址的次数。
preAllocSize默认为64M。事务日志文件会随每一次快照后,新建另一个日志文件,如每次快照之间产生的事务不是很多, 那64M大小确实偏大,比如每1000个事务就进行一次快照,每个事务大概100字节,那preAllocSize设置为100KB要合理得多。
而默认的preAllocSize对于默认的snapCount,及事务日志平均512字节的情况是合理的。

snapCount
snapCount即快照间的事务数量(zookeeper.snapCount),默认值为100000。
因为快照是比较影响性能的,但只要集群中的Server不是同时进行快照,就不会出现性能问题,出于这个原因, 实际快照的事务日志数将是一个接近snapCount的随机数。 如果上一次快照还没有结束,本次快照将等待上一次快照结束再开始。

你可能感兴趣的:(中间件,zookeeper,清理snapshot,清理事务日志,snapRetainCount,purgeInterval)