论文阅读(3):pebblesdb

pebblesdb:pandian raju(德克萨斯大学)等

 

 

摘要:针对LSM写放大问题,依据skiplist的概念灵感,提出了flsm结构。引入guard的概念来管理log,避免同一level内重写数据。本文是在hyperleveldb的基础上加上flsm的结构设计。与rocksdb以及在mogodb,hyperdex中使用pebblesdb,在写放大以及写带宽上,均有明显优化。

 

kvstore应用场景:图数据库中存储状态,任务队列,流处理引擎,应用数据缓存,事件追踪系统,nosql存储和分布式系统。

内存有效性的工作:9,17,34,42,58

减少写放大相关工作:38,55要求特定硬件,57牺牲查询性能。牺牲写读带宽34。19,22,compact不做merge,单纯加sstable在每个level。

设计概述:用guard将数据分成小的chunk。为了写带宽会牺牲读性能。

其他优化设计:并行seek,基于seek的主动compact,sstable级别的布隆过滤器。

FLSM的设计:

将sstable分为小的segment,在compact中,比起重写,直接把一个fragment append到新sstable后面。

每层多个sstable可以有range的交叠,可以有重复的键。采用跳表中guard的概念来快速在每个level查找key。随着level的升高,guard的粒度越来越细,guard是从key中选出来的。每个guard都有一些列相关的sstable。每个sstable都是有序的。

感觉每层guard的设计,就是一种混合设计,结合了原始lsm的全部有序与,单纯append sstable的纯粹无序。这样,每个到下层的sstable不需要compact,只需要fit进guard的range中。

 

关键:guard的选择,尽量保证每个guard包括的sstable数尽量平均,不然跟单纯append基本一样。

guard probability:类似跳表的升级概率。随着level升高,概率升高。如果一个key在leveli被选为guard,那么在i+1之后,都作为guard,即使这些level可能没有这个key。

guard的添加,先是添加到内存中uncommitedguard的表中,因为添加guard本身有很多附带操作,包括split一个sstable,移动sstable。所以等到下次compact的操作,再将所有uncommitedguard一起添加。

guard的删除,主要是因为guard不包括sstable,或者sstable在guards间分布不均匀。此时也是,先缓存在内存中,等到下次compact在一起删除。

 

并且因为,i-level的guard都会出现在i+1中,所以在compact,可以并行操作每个guard range。而不会影响其他guard的合并。

 

关于读性能的优化措施:

leveldb,rocksdb都有block级别的bf,pebblesdb采用sstable级别的bf而放弃了block级别的bf,提升get效率。

范围查询优化:

seekbased-compaction :leveldb也有这个特性但删除了。

并行seek:对每个sstable的查询都单开一个线程,再将结果合并,给seek正确的位置。table有在os中有缓存的时候不能用,开销大于提升?没明白为什么。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值