在ZooKeeper的运维过程中,我们经常会碰到这样的问题,就是快照数据文件越来越大,但是ZooKeeper上的数据节点数量并没有相应的增加。
这说明什么问题:一定是有客户端在将ZooKeeper当数据库使用了。长此以往,必然会引起ZooKeeper内存数据过大而影响性能及集群间的数据同步。
那么有没有办法能够排查此类问题呢?解决方法是有的,我们首先需要使用SnapshotFormatter可视化快照数据。
数据快照机制是ZooKeeper用来定时进行内存全量数据dump,每次数据快照都会生成磁盘上的一个snapshot文件,例如:snapshot.300000007。
但是令人沮丧的是,这个文件是二进制格式的,无法看出任何有意义的数据信息。
幸好,ZooKeeper提供给我们一个可视化快照数据的工具:SnapshotFormatter
使用方法如下:
java SnapshotFormatter 快照数据文件
例如我们对上面提到的事务日志对应的快照数据文件进行可视化转换:
java SnapshotFormatter snapshot.300000007
输出内容如下:
从上面的输出中,我们就可以看到ZooKeeper上的所有节点信息了,其中会看到有个dataLength属性,这个就是该数据节点的数据大小了。排序就可以排查出异常节点了。