ssdb的backup_dump机制浅析

ssdb-dump的目的是进行本地leveldb数据的备份,操作是通过client或者客户端发起ssdb-dump ip port outputdir进行备份的,服务端会执行proc_dump指令然后启动信息线程在当前的link上进行key的拷贝,先看看一般情况下的拷贝是怎样操作的吧。

我们以tools举例:

执行ssdb/tools/ssdb-dump 127.0.0.1 8344 dump/

此处你可以修改ip,port,和outputdir

这块的代码就不贴了,范围比较小,相对容易找到代码位置

好,现在dump-client已经就绪了,接下来我们看看ssdb-server在干啥:


首先dump这块会从这个方法中进入,link参数是要执行的TCP连接对象,代码不展示了,需要的自己撸代码看看。这块只关注一点_rum_thread这个地址,以及args,好继续往下走:


这里只需用关注这几个要点:

1.start:要seek的起始key

2.end:要dump的末尾key

3.limit:拷贝的上限:恐怕很难达到这么大,这个默认是一个uint64表示的最大数


其实从这块开始基本上是正式开始dump了,我们逐点分析:


这个是针对本次dump请求所new的一个新的iterator,好,具体看下怎么new的:


说明一点,this->ssdb这个实例是在ssdb-server.cpp中产生的,这个在ssdb服务启动的时候进行了初始化,这个不是这块的重点,所以一笔带过(也是因为我太菜了,还没有理解到大神设计的精髓),这些参数就是上一步介绍的含义,在这里分享下我的实践,我本意是想将ssdb-dump这块进行一个由单一线程dump改为多线程,我的思路是每个线程负责指定范围的k-v拷贝,这个范围依据start和end决定,但是各位大神有没有发现这个想法是不可行的,好先给结论,经过一波分析看看为啥不能(我相信还有其它好的思路,但还没实践,欢迎各路大神能指点下),好先继续,我们看下这个图的一些重点:


圈出来的这个是从leveldb的迭代器,其实是db_iter实例,因为ssdbImpl实例的ldb是DBImpl实例,而DBImpl实例的NewIteratyor方法返回的是db_iter实例,好直接debug看下它调的哪块的代码:


看堆栈栈顶的信息我们跟进去瞧瞧:


这块其实是申请一个iterator,不过有些复杂,有mem的迭代器,用来处理可读写的内存模块,imm的迭代器可用来处理只读内存模块的数据,关于leveldb的迭代器可参考leveldb的迭代器,最终会返回一个操作table的迭代器。


这块调用的是db_iterator的Seek,我们看下堆栈信息:


使用了DBIterator的实例,


具体的操作是将target就是我们传输的start参数通过内部key编码后才进行Seek的,关于leveldb的内部存储格式,和leveldb的内部key格式

好了,回到ssdb层面看下如何获取key和value:


这个实际调用的是:


会从迭代器中找到当前可访问的下一个key,value相同的道理,其实核心还是这块的迭代器操作,我菜鸟一枚,还没有理解其中的迭代器的详细流程,后续会补充

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值