2 minutes
Essay_Dostoevsky
从 https://www.jianshu.com/p/8fb8f2458253
看到了 Dostoevsky, 研究了下论文
tired & level
基本原理
- stcs:
每一层文件大小按比例增加, 每一层的文件数量固定. 比如 4层文件, 每层大小4倍增长, 则分别是: 100 MB, 400 MB, 1.6 GB and 6.4 GB.
层间compaction, 比如 level(i) -> level(i+1), 当i层四个文件都写满了, 则会触发. 会将 level(i) 的四个文件进行 compaction 放到 level(i+1) 【空间放大的原因】
经典的图, 参考论文
- level:
每一层的文件大小固定, 文件数量按照层级按比例增长, 比如 4(level 0)、10、100、1000, 每个文件都是 16MB
层间compaction 是当 level(i) 文件数满的时候触发的. 会从 level(i) 中选取一个文件 和 level(i+1) 的10个文件进行compaction, 并写入11个文件 【写放大的原因】
经典的图, 参考论文
写放大
写放大: 一次byte写入, 在磁盘上读写了多少次 (注意: lsm 因为有一次日志写commit-log, 因此至少有一次写放大)
stcs:
O(L), 因为写放大只会放生在层间compaction, 对于图例 4层的 写入, 也就是 5倍写放大
level:
O(T * L), 很严重, 也放在层间, 但是level的模型是, 从 level(i) 选取一个文件, 和 level(i+1) 的10个文件进行compaction, 最终导致11倍的写放大(这里的场景是 层间10倍关系, 10个文件是因为 token range 关系是10, 比如上一层10个文件, 下一层就是100个文件, 一般假设是从100个文件中选取10个有重叠的文件进行compaction)
试验中并没有达到这么多的写放大, 仅仅是11倍, 因为 写入的时间局部性原理(大部分数据是最近修改的, 很少添加新数据或者修改很老的数据), 很多写放大的 overlap 都在 L0/L1 处理了 (L0/L1 的 input sstfile 不止一个)
需要注意的是, 及时是 读多写少的场景, 当读需要走文件, 写放大由于磁盘竞争也会严重影响读, 除此之外, 当 写放大占用太多磁盘带宽导致 compaction 跟不上, 那么大量数据就会停留在 L0, 导致很严重的读放大
空间放大
空间放大: 同一份数据, 被存储了多少遍
STCS 空间放大严重, 试验中最严重可以观测到 8倍, 主要是由于两个原因:
- input->ouput 的 level compaction 导致的文件临时放大两倍
- 因为相同一层数据存在 overlap, 那么可能相邻文件存在被删除的数据 (最差情况下, 不同层也存在overlap), 试验得到了8倍 (1.2GB的数据写15次)
level空间放大相对比较轻, 如下:
- 分层压缩的时候, 假设分层比例是10, 160M文件大小, 因为总是从 level(i) -> level(i+1) 的比例是 1/10, 因此最多重复 11 个文件, 固定大小就是 160 * 11 < 2GB
- 同一层因为没有overlap, 所以只存在 分层之间的数据重复, 如果 level(larget) 填满了, 3层10倍最多也就 1.11倍, 最差情况下, level(larget) 没有填满, 比如 l2 和 l3 都一样大的时候, 那么存在略大于 2倍的 空间放大
在相同的试验中, 试验2(1.2GB的数据写15次) 略微大于预期的 [1.1, 2] 的放大, 因为 l0 存在overlap 导致的. 试验1符合预期
论文
引入了三个新的设计: lazy leve & Fluid LSM-Tree & Dostoevsky
基本原理
- Lazy Leveling
只有最后一层进行 level compaction(merge), 其他层不进行merge
- Fluid LSM-Tree
控制了 largest level 和 其他level 的merge的频率
- Dostoevsky
Dostoevsky: Space-Time Optimized Evol- vable Scalable Key-Value Store.
论文一开始详细分析了不同情况下 level/tiering 的复杂度.
贴图:
update:
level: O(L * T/B), 每一层都是 T个文件更新, 最差更新L层的次数, 分摊到 B上的entries tiering: O(L/B), 每一层都是直接merge, 最差合并L层的次数, 分摊到 B 上的entries
point lookup:
level: 每一层的误判率, 优化后和level无关 tiering: T * 误判率, 优化后和level无关
short range:
level: O(L), 因为每一层层内不重叠, 每层最多查一次, 最多L层 tiering: O(T * L), 因为每一层重叠, 所以 一层最差T次, 最多L层
long range:
level: tiering:
需要看下