wiscKey论文--------对LSM-tree的优化

首先要明白机械硬盘和固态硬盘的区别

机械硬盘:

  1. HDD 顺序读写性能远远优于随机读写性能,足以抵消写放大带来的开销。
  2. HDD 的写入量基本不影响其使用寿命。

固态硬盘:

     1. 价格贵

     2.SSD 顺序读写性能比随机读写性能好一些,但是差距并没有 HDD 那么大。所以,顺序写相比随机写带来的好处,能不能抵消写放大带来的开销,这是个问题

     3.SSD 的使用寿命和其写入量有关,写放大太严重会大大缩短 SSD 的使用寿命。因为 SSD 不支持覆盖写,必须先擦除(erase)再写入。而每个 SSD block(block 是 SSD 擦除操作的基本单位) 的平均擦除次数是有限的。如何理解SSD的写放大? - 知乎前面两个答案值得看看

Leveldb可能是为了解决在机械硬盘上顺序读写性能远远优于随机读写性能,所以通过append-only来写入数据。但在固态硬盘上,读写放大的成本与顺序写带来的提升之前的性价比就很小了

读写放大比例定义为写入(从)底层存储设备的数据量与用户请求的数据量之间的比率

wiscKey论文--------对LSM-tree的优化_第1张图片

 

所以就有了wiscKey这篇论文

读写放大很大一部分是leveldb实现把key_value揉成一块来存储。在value小的时候,这样有利于空间局部性。而value>4kB时候,带来的读写放大(主要是compaction过程中的数据移动需要移动value)就使得这个设计得不偿失。于是我们就可以通过key/value分离存储来优化这个问题。

实现细节

wiscKey论文--------对LSM-tree的优化_第2张图片

 LSM-tree只存储key,和对应vlog中value的地址。这样使得内存可以承载更多的key,命中内存的概率也大大增加了。同时在compaction时归并生成文件移动的数据量也大大减少了,对SSD是友好的。

同时wiscKey做了几个优化

1.值日志写缓冲区。对于多个数据量小的value写进vlog里面批处理。

2.优化LSM-tree的valueLog日志恢复

WiscKey定期在LSM树中记录vLog的头,作为键值对 < " 头 " , 头-vLog-偏移>。当打开数据库时,WiscKey从存储在LSM树中的最新头位置开始vLog扫描,并继续扫描直到vLog结束。

3.范围查询

固态硬盘具有很大程度的内部并行性;构建在固态硬盘上的LSM必须精心设计以利用上述并行性。同时也因为范围查询需要多次随机IO

所以对于范围查询,WiscKey维护一个包含32个线程的后台线程池。这些线程在线程安全队列中休眠,等待新的值地址到达。当触发预取时,WiscKey将固定数量的值地址插入工作队列,然后唤醒所有休眠线程。这些线程将开始并行读取值,自动将它们缓存在缓冲区缓存中。

参考资料:
Docs里面还有子资料

   

 

你可能感兴趣的:(leveldb源码解读,lsm-tree,数据库架构,系统架构)