带着问题撸源码系列-zookeeper-内存的数据如何持久化到硬盘

问题

带着问题撸源码系列-zookeeper-内存的数据如何持久化到硬盘

猜测

这种一般都是有个定时任务往硬盘写吧

源码

吸取经验,直接从底层打断点最舒服,直接搂出调用栈美美哒。
于是我们开始猜哪个是写硬盘的类。
搂了一遍,大胆猜测是这个:
org.apache.zookeeper.common.AtomicFileOutputStream

断点打起来
在这里插入图片描述

debug

客户端发起写请求,create /w1
没有停在断点。。
看来找错地方了。

再猜:org.apache.zookeeper.server.ByteBufferOutputStream
在这里插入图片描述
也不对。。

org.apache.zookeeper.server.persistence.FileSnap#serialize(org.apache.zookeeper.server.DataTree, java.util.Map<java.lang.Long,java.lang.Integer>, java.io.File, boolean)
这个很有信心!
在这里插入图片描述
还是不对。。

好像又没招了。。看来自底向上是不行了。

那再来自顶向下?

从启动过程开始看:找到了定时purge清除的地方:
在这里插入图片描述

好吧我投降了,上网搜到是这样的:http://www.guobingwei.tech/articles/2019/04/01/1554076444476.html

在zkDatabase.append里整的
在这里插入图片描述
终究还是网上的大哥牛皮:
在这里插入图片描述
在这里插入图片描述
看调用栈,是SyncRequestProcessor调用的。
在这里插入图片描述

在这里插入图片描述
将请求写到硬盘。将请求batch了,提升io效率。只有写完硬盘才会将请求pass到下一个requestProcessor

3个不同的case会用到:
1、Leader: 同步请求到硬盘,转发到AckRequestProcessor, 然后AckRequestProcessor 又发ack发回来
2、Follower:同步请求到硬盘,转发到SendAckRequestProcessor, AckRequestProcessor发包给leader。AckRequestProcessor 是flushable的,允许我们强行推送packet给leader
3、Observer先不管了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值