微服务系列(二)(3) ZooKeeper源码分析-part-2
前文跟踪源码分析了ZooKeeper Server的初始化过程,通讯原理及选举机制,本文将继续进入源码,探究ZooKeeper的存储机制。
通过前文的链路追踪,可以知道ZooKeeper的存储核心类是org.apache.zookeeper.server.ZKDatabase
下面就开始分析解读它的实现,它在内存中保存了怎样的数据结构,又是以哪种策略来写入文件?
首先回忆一下它是在哪里进行初始化的
...
quorumPeer.setTxnFactory(new FileTxnSnapLog(
config.getDataLogDir(),
config.getDataDir()));
...
quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory()));
...
可以看到通过调用org.apache.zookeeper.server.ZKDatabase#ZKDatabase
构造器来初始化,并且传递了一个FileTxnSnapLog
对象
public ZKDatabase(FileTxnSnapLog snapLog) {
dataTree = createDataTree();
sessionsWithTimeouts = new ConcurrentHashMap<Long, Integer>();
this.snapLog = snapLog;
try {
snapshotSizeFactor = Double.parseDouble(
System.getProperty(SNAPSHOT_SIZE_FACTOR,
Double.toString(DEFAULT_SNAPSHOT_SIZE_FACTOR)));
if (snapshotSizeFactor > 1) {
snapshotSizeFactor = DEFAULT_SNAPSHOT_SIZE_FACTOR;
LOG.warn("The configured {} is invalid, going to use " +
"the default {}", SNAPSHOT_SIZE_FACTOR,
DEFAULT_SNAPSHOT_SIZE_FACTOR);
}
} catch (NumberFormatException e) {
LOG.error("Error parsing {}, using default value {}",
SNAPSHOT_SIZE_FACTOR, DEFAULT_SNAPSHOT_SIZE_FACTOR);
snapshotSizeFactor = DEFAULT_SNAPSHOT_SIZE_FACTOR;
}
LOG.info("{} = {}", SNAPSHOT_SIZE_FACTOR, snapshotSizeFactor);
}
这里发现了一个系统参数zookeeper.snapshotSizeFactor,默认为0.33