作者:金长龙
爱可生测试工程师,负责DMP产品的测试工作
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
先前在做OB存储引擎这块学习的时候,对 OceanBase 的分层转储和 SSTable 这块有些细节就懵懵的,比如L0层的 mini SSTable 的每次生成是否就计入转储次数,L0层到L1层转储的时机以及和 minor_compact_trigger 之间的关系等。 今天就这部分内容做个更细致的探究,试图更深入的理解 OceanBase 的分层转储。
一、LSM-Tree
首先来看一下 LSM-Tree(全称是Log-Structured Merge Tree),当下许多较新的数据库都会选择LSM-Tree作为存储结构,比如TiDB、Cassandra、OceanBase等。LSM-Tree的优势是顺序写,提升了整体写入性能。

LSM-Tree 大致可以分为两部分:
- Memtable: 常驻内存的 KV 查找树 + 无序的 WAL 文件
- SSTable (Sorted String Table): 一组存储在磁盘的不可变文件,存储有序的键值对
写入流程
1、同步写 Memtable
先将数据写入 WAL 文件,然后修改内存中的 AVL,因此最优情况下,每次写操作只有一次磁盘 I/O。
删除操作并不会直接删除磁盘中的内容,而是将删除标记(tombstone)写入 Memtable。当 Memtable 增大到一定程度后,则会转换为 Immutable Memtable 并产生一个新的 Memtable 接受写操作。
2、异步写 SSTable
后台会启动一个合并线程,当 Immutable Memtable 达到一定数量,合并线程会将其写入磁盘(Flush),生成 Level 0 的 SSTable 文件。
当 Level N 的 SSTable 文件数量到达阈值之后,会进行合并压缩(Compaction)操作,在 Level N+1 生成新的 SSTable 文件。
SSTable 分为多层,单个文件的大小通常是上一层的 10 倍,每层可以同时包含多个 sst file,每个文件由多个 block 组成,其大小约为 32K,是磁盘 IO 的基本单位。
第 Level i (i > 0) 层的 SSTable 满足:
-
第 i 层所有文件均由 i - 1 层的 SSTable 合并排序而来,可以通过设定阈值(文件个数…)来控制合并的行为
-
文件之间是有序的,且每个文件的 key 集合不会与其他文件有交集(Level 0 的 SSTable 除外)
Compaction 策略
常用的 Compaction 策略有 Classic Leveled、Tiered、Tiered & Leveled 、FIFO 等,简单介绍下前3种。
1、Classic Leveled
Classic Leveled 模式下每一层都是独立的"Sorted Run" ,代表是按Key排序且同层sst file之间的Key值没有重合,数量大小是逐层增大。相邻的两层sst file比称之为fanout(扇出),每次做Compaction的条件是Ln层大小达到了

文章详细探讨了OceanBase数据库基于LSM-Tree的存储结构,包括Memtable和SSTable的写入流程,以及不同层次的SSTable管理。重点讨论了MiniCompaction和MinorCompaction的触发机制和作用,同时通过实验分析了OceanBase中分层转储的实际情况,特别是`minor_compact_trigger`和`_minor_compaction_amplification_factor`参数的影响。
最低0.47元/天 解锁文章
1070

被折叠的 条评论
为什么被折叠?



