zookeeper靠snapshot日志和log日志进行数据的持久化和恢复工作
SNAPSHOT
snapshot机制定期将内存数据序列化到snapshot.xx(zxid)文件,数量受基本配置autopurge.snapRetainCount控制,默认是3
频率受高级配置snapCount控制:默认是10w,不过不是所有节点都是达到10w就开始写snapshot,
因为写snapshot的过程中写请求是会被卡住的,所以又有了另外一个内部算法,即取随机数
[snapCount/2+1, snapCount],在这个范围内就有可能触发重写snapshot.
LOG
另外生成的log.xxx(zxid) 则是实时的日志记录,也叫做WAL(write ahead log)预写日志.
默认64M,如果在生成新的snapshot前,文件被写满,就会扩一倍大小;
默认预分配大小受高级配置preAllocSize控制,如果snapCount很小,这个值也可以减小;
snapshot.xx和log.xx的xx 都是16进制,
300M snapshot.27c343ef9a
300M snapshot.27c342718c
300M snapshot.27c34114f6
300M snapshot.27c3403a76
300M snapshot.27c33f2cbe
300M snapshot.27c33dc303
300M snapshot.27c33c83a1
300M snapshot.27c33b3960
13M log.27c342718e
13M log.27c33dc305
12M log.27c34114f8
12M log.27c33b39d4
11M log.27c33c83a3
11M log.27c33a0eef
9.2M log.27c33f2cc0
7.4M log.27c3403a78
4.0K currentEpoch
4.0K acceptedEpoch
2.5M log.27c343ef9d
log.zxid的zxid是log文件中第一条事务的ZXID,ZXID规则为前32位(4字节)为leader周期,后32字节为事务请求序列,所以通过事务日志名称就可以轻松的知道当前的leader周期与每个文件所属的leader周期.(根据日志的最新修改时间)
这2类文件可以分不同的目录部署, 受高级配置dataLogDir控制,官方介绍:
Having a dedicated log device has a large impact on throughput and stable latencies. It is highly recommended to dedicate a log device and set dataLogDir to point to a directory on
that device, and then make sure to point dataDir to a directory not residing on that device.
————建议是logDir存放log.xx文件,因为写入频率比较高,可以挂性能比较好的盘
事务日志文件和快照文件都是二进制数据, 这2个文件的查看方式可以看另外一篇博文
Zookeeper日志文件查看,具体结构分析
网友评论