(一)研究目标
结合B+Tree利用PM对LSM-Tree进行优化。
(二)研究背景
LevelDB 存在的问题:较低的读性能和严重的读写放大。
Slow read operations:
一个读操作至少需要两次块读取,一次读索引块,另一次读数据块。
先搜索内存中的MemTable和Imutable Table,找不到则在磁盘上的每一个 Level 上根据SSTable的开始key进行二分查找,定位数据所在的SSTable,然后对 SSTable File 中存储的数据索引再次进行二分查找,找到对应的数据块。为了避免不必要的块读取和减少搜索成本,LevelDB对每个块使用Bloom过滤器。
High write and read amplification
写放大:
- 维护垂直的多级有序数据结构 SSTables 来保证顺序写
- 需要在不同的层级之间进行归并排序操作,同时需要常常进行数据压缩(Compaction)
读放大: - 由于 LSM 树的原因,读数据时往往需要在多个层级进行检索
- 不仅需要读取该 Key 所对应的数据所在的数据块,还要读取对应的索引块和 Bloom Filter 块,索引块和 Bloom Filter块的数据和可能比 KV 本身大得多
(三)研究概述
使用 PM 进行缓冲写入,省略了 WAL 的写开销,采用单层的 LSM 结构来减小写放大问题带来的影响。利用 PM 的特性维护 B+ Tree 作为索引,加速数据的检索。