关于文档中compaction的一点疑问

文档地址: 3.3 OceanBase 的 Compaction 设计-开发者进阶教程-OceanBase文档中心-分布式数据库使用文档

这两部分的描述,感觉像是L0层的Mini SSTable 直接Compaction到 L2层的Major SSTable中去了,按理不是L0层的 Compaction到L1,L1 compaction到L2层吗?
不知道是不是我理解有误?

OceanBase 数据库的转储分为以下三层:

  • L0 层L0 层内部称为 Mini SSTable。根据不同参数设置的不同转储策略,L0 层的 SSTable 可能存在也可能为空。对于 L0 层,系统提供了 Server 级的配置项来设置 L0 层内部分层数和每层最大的 SSTable 的个数。L0 层内部分为 level-0level-n 层,每层最大容纳的 SSTable 个数相同。当 L0 层 level-n 的 SSTable 到达一定数目上限或阈值后开始整体合并,合并成一个 SSTable 写入 level-n +1 层。当 L0 层的最大 Level 内的 SSTable 个数达到上限后,开始做 L0 层到 L1 层的整体合并来释放空间。在存在 L0 层的转储策略下,冻结 MEMTable 直接转储在 L0-level-0 写入一个新的 Mini SSTable,L0 层每个 Level 内的多个 SSTable 根据 base_version 有序,后续本层或跨层合并时需要保持一个原则,参与合并的所有 SSTable 的 Version 必须邻接,这样新合并后的 SSTable 之间仍然能维持 Version 有序,简化后续读取合并逻辑。L0 层的内部分层会延缓到 L1 的合并,更好地降低写放大,但同时会带来读放大,假设共 n 层,每层最多 m 个 SSTable,则最差情况 L0 层会需要持有 (n * m + 2) 个 SSTable,因此实际应用中层数和每层 SSTable 上限都需要控制在合理范围。
  • L1 层L1 层内部称为 Minor SSTable,L1 层的 Minor SSTable 仍然维持 Rowkey 有序,每当 L0 层的 Mini SSTable 达到合并阈值后,L1 层的 Minor SSTable 开始参与和 L0 层的合并; 为了尽可能提升 L1 合并的效率,降低整体写放大,OceanBase 数据库内部提供了写放大系数设置,当 L0 层的 Mini SSTable 总大小和 L1 层的 Minor SSTable 的大小比率达到指定阈值后,才开始调度 L1 合并,否则仍在 L0 层内部合并。
  • L2 层L2 层是基线 Major SSTable,为了保证多副本间基线数据完全一致,日常转储过程中 Major SSTable 仍保持只读,不发生实际的合并动作。

https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000886122

2 个赞

“是L0层的Mini SSTable 直接Compaction到 L2层的Major SSTable中去了”,这个理解是对的。
L0层和L1层本质上是同种sstable,只是大小不同,合并会将L0/L1/L2的sstable在一个时间位点上合成一个major sstable。增量和全量的区别主要在于对于未修改的宏块是否打开

那我是不是可以这么理解:
frozen memtable 到L0只是转储
L0层到L1层并没有发生压缩,只是有合并
L1或者L0 到L2才会发生压缩

如果不对,您能方便告知下L1层(minor sstable)和L0(mini sstable)层有什么区别吗?或者L0(mini sstable)做了什么操作变成了L1 minor sstable(详细点的)

压缩都是会发生的。
frozen memtable->L0是转储。

L0->L0是mini minor merge,多个mini合成一个更大的mini,L0->L1是minor merge,多个mini和一个minor合成一个minor。
合并是多个mini,minor和major合成一个major。

区别就是L1层是一个minor sstable(很大的mini sstable),L0层是多个mini sstable。

具体操作都是类似的,就是将多个sstable的数据读出来,然后排序写回新的sstable,和LSM-Tree的基础概念是一样的。但我们是微块/宏块的数据块大小,如果微块/宏块内数据没有做修改是可以直接重用的。

1 个赞

可以看这个帖子的讨论 关于转储的几个问题

好的 多谢 有什么不懂的再来麻烦您
另外,关于文档中的描述错误的部分,什么时候会修复?不然我们都么有参考了,不知道以什么为准了

我会推进一下文档的修改

1 个赞

:+1::+1::+1::+1::+1:

你有看过源码吗??

不好意思,我看官方文档。
不一定必须看源码才知道

文档和代码有误

那就有劳你进行源码和文档反馈,进行更正了。
还有我看的是3.x版本文档,并不是4.x

  1. 转储的时候(没有手动发起合并、没有到每天定时合并的时间、没有到minor_freeze_times设置的阈值),是按照L0 ->L0,L0->L1.
  2. 合并的时候(手动发起,定时自动发起,转储次数到达minor_freeze_times),冻结的内存、mini_sstable、minor_sstable与merge_sstable,一起合并,不需要memstore → L0 ->L1 ->L2。
    这是我的个人理解