微服务系列(二)(3) ZooKeeper源码分析-part-2

微服务系列(二)(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值