LSM Tree技术简介
LSM Tree(The Log-Structured Merge-Tree)核心特点是利用顺序写来提高写性能
将某个对象(Partition)中的数据按照“key-value” 形式在磁盘上有序存储(SSTable)
数据更新先记录在MemStore中的MemTable里,然后 再合并(Merge)到底层的SSTable里
SSTable和MemTable之间可以有多级中间数据,同样以 key-value形式保存在磁盘上,逐级向下合并

memtable内存结构
OceanBase MemTable采用双索引结构(B+树索引以及哈希索引)
特点:
B+树索引能够更好地支持范围查找
哈希索引是针对单行查找的一种优化
每次事务执行时,MemTable会自动维护 B+树索引与哈希索引之间的一致性
Undo流程:
如果要读取更老的历史快照,只需要顺着内存中的反向指针往前回溯即可,相当于在内存中执行数据库Undo操作

OceanBase中最简单的LSM Tree只有C0层(MemTable)和C1层(SSTable)。两层数据的合并过程如下:
- 将所有observer上的MemTable数据做大版本冻结(Major Freeze),其余内存作为新的MemTable继续使用
- 将冻结后的MemTable数据合并(Merge)到SSTable中,形成新的SSTable,并覆盖旧的SSTable
- 合并完成后,冻结的MemTable内存才可以被清空并重新使用。

合并的细化
合并按照合并的宏块不同,分为全量合并,增量合并,渐进合并三种:
全量合并:合并时间长,耗费IO和CPU,把所有的静态数据都读取出来,和动态数据归并,再写到磁盘中。
增量合并:只会读取被修改过的宏块数据,和动态数据归并,并写入磁盘,对于未修改过的宏块,则直接重用
渐近合并:每次全量合并一部分,若干轮次后整体数据被重写一遍。
思考:合并存在的问题有集群性,高消耗,时间长
避免这些问题办法就是转储
分层转储:
为了优化转储越来越慢的问题,引入了“分层转储”机制:
多层compaction策略:新增L0层:被冻结MemTable会直接flush为Mini SSTable。
架构变化:3层VS4层
3层架构:memtable + minor sstable(L1) + major sstable (L2)
4层架构:memtable + mini sstable(L0) + minor sstable(L1) + major sstable (L2)
参数 minor_compact_trigger 控制L0层Mini SSTable 总数
参数 major_compact_trigger 控制memtable dump flush次数达到时触发major compaction

转储相关参数
minor_freeze_times
控制两次合并之间的转储次数,达到此次数则自动触发合并(Major Freeze)
设置为 0表示关闭转
OceanBaseLSMTree技术详解:合并与转储策略

本文介绍了OceanBase数据库中的LSMTree数据结构,包括MemTable和SSTable的层次,以及数据更新和合并流程。重点讨论了转储和合并的策略,如全量合并、增量合并、渐进合并和分层转储,以及它们对资源的影响和优化措施。此外,还提到了轮转合并机制和手动、自动触发条件,以及相关参数的调整对数据库性能的影响。
最低0.47元/天 解锁文章
1067

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



