oceanbase的存储引擎是一个面向分布式场景优化的LSM-Tree(Log-Structured Merge-Tree)实现。是oceanbase高性能、高压缩、高扩展的基石。
LSM-Tree的核心思想是将离散的随机写请求都转换成批量的顺序写请求。它利用内存缓冲(MemTable)吸收高速写入,通过WAL保持持久性,再通过异步转储(Dump)将内存数据快速刷盘形成增量文件(Minor SSTable),最后通过后台合并(Merge)操作将增量文件与基线文件整合成全局有序的基线文件(Major SSTable),实现数据整理、空间回收和读优化。分区是存储和管理的核心单元,提供了扩展性、并行性和隔离性。高效的SSTable格式、压缩/编码技术以及精心设计的缓存和索引共同保障了优异的读写性能和极低的存储成本。其强一致性和高可用性则由底层的Muti-Paxos日志复制机制强力支撑。
·写入路径:先内存,后落地。
所有写操作(增删改)先进入内存中的MemTable,写入极快,几乎是内存的速度。其中memstore_limit_percentage/memstore_limit参数控制MemTable总内存占比。可通过视图oceanbase.__all_virtual_sysstat中的active_memstore_used和total_memstore_used监控内存占比,避免触达内存上限。MemTable写达到freeze_trigger_percentage后冻结,变为只读,并立即创建一个新的活跃的MemTable接收写入。
在数据写入MemTable前,必须先持久化对应的Redo Log到磁盘。这是崩溃恢复的基础。oceanbase使用Multi-Paxos协议在多个副本间同步Redo Log以实现高可用和强一致。Redo Log的写入性能决定了数据库的写入吞吐上限和事务延迟,强烈建议使用高性能的SSD(NVMe)存放Redo Log和SSTable数据。生产环境必须将Redo Log和数据文件(SSTable)放在不同的高性能SSD分区上,避免I/O竞争导致性能骤降。关注oceanbase._all_virtual_clog_stat,监控日志同步延迟,延迟过大可能影响可用性甚至数据的一致性。
·转储(Dump)快速释放内存
冻结的MemTable会被后台线程异步刷写到磁盘(SSD),形成Minor SSTable(L0)。这个过程可快速释放内存空间,Minor SSTable内部有序,但多个Minor SSTable之间数据范围可能重叠,且包含未清理的删除标记。转储发生频率很高,通常为秒/分钟级,对业务影响相对较小,但会有频繁的I/O写入。
需要监控转储队列oceanbase.__all_virtual_sstable_compaction_history,__all_virtual_compaction_diagnose)是否有堆积,有堆积意味着转储的速度跟不上冻结的速度,会持续占用内存,风险高。参数minor_freeze_times控制多少次Minor冻结后触发一次Major合并。
·合并(Merge) - 读优化与空间回收
合并是LSM-Tree最核心也是最具重量级的后台操作,oceanbase将多个Minor SSTable(增量数据)与一个基线Major SSTable(Base SSTable)进行多路归并排序,生成一个全新的、全局有序的Major SSTable。这个过程会删除标记数据、真正删除过期数据、被覆盖的旧版本数据被清理、数据全局有序化,极大提升了范围查询效率,数据压缩率大幅提高。Major合并消耗大量的CPU、I/O(读取旧数据、写新数据)、内存(排序),是生产环境性能抖动最常见的根源之一。
oceanbase提供多种合并策略,dba在业务低峰期手动触发(alter system major freeze;)可控性强,避免高峰影响;定时合并,配置定时任务自动触发;自动合并策略(Minor次数、增量数据大小)触发,风险高,可能导致业务高峰期意外触发,引发雪崩效应。
合并时应错峰执行,在业务绝对低峰期进行手动合并;合并期间,确保足够的cpu、i/o、内存余量;避免超大分区,单个分区过大会显著延长合并时间,增大风险;选用高性能的SSD是Major合并速度和稳定性的基石。
可以通过show merges;查看正在进行的合并进度。也可通过oceanbase.__all_virtual_sstable_compaction_history查看历史合并信息。可通过ocp或obdiag工具包提供合并诊断能力,分析慢合并原因。
·数据存储单元:分区
OceanBase 是分布式数据库,数据按分区(表分区或分片)进行物理划分和独立管理,每个分区有自己的 MemTable、WAL 日志流、SSTable 集合。分区是数据迁移(负载均衡)、副本复制(高可用)、故障恢复的基本单位。水平扩容的本质就是增加机器容纳更多分区副本。转储和合并操作在不同分区上可以并行执行,充分利用多核和 I/O 资源。分区数设计合理能极大提升后台任务效率。一个分区的问题(如某个 SSTable 损坏)通常不会影响其他分区上的业务。‘ALTER SYSTEM STOP MERGE TENANT=xxx PARTITION_ID=xxx;’ 可以临时停掉问题分区的合并。
分区键选择能均匀分散数据的列(如用户ID、订单ID哈希),避免数据倾斜(热点分区);避免超大分区(建议单个分区在 GB 级别,如 1-10GB,最大不超过 100GB)。
·SSTable 结构 - 高效存储的秘密
Macro Block (宏块)是基本存储单元(默认 2MB)。包含数据、索引、布隆过滤器等。Micro Block (微块)是宏块内的更小单元(通常几KB到几十KB),是压缩、编码、I/O 的基本单位。
布隆过滤器 (Bloom Filter)能快速判断 Key 是否肯定不存在于该 SSTable,避免不必要的磁盘读取。
多层索引类似 B+树索引,快速定位 Macro/Micro Block。
高效编码压缩是 OceanBase 存储成本显著低于传统数据库的核心!利用全局有序性,应用强大的列式压缩算法(如 ZSTD, LZ4)和编码技术(字典编码、前缀编码、差值编码)。对于适合的数据(如日志、监控、历史订单),5:1 甚至 10:1 的压缩率很常见,压缩率惊人,能大幅降低 SSD 采购和运维成本。
定期查看租户和表的磁盘使用量 (oceanbase.__all_virtual_tenant_disk_stat, __all_virtual_table)。关注 data_size(逻辑大小) 和data_size_on_disk(物理大小)的比值,这就是压缩率。
OceanBase 会自动选择编码方式。‘CREATE TABLE’ 时指定 ‘ROW_FORMAT=COMPRESSED’ 和 ‘COMPRESSION=‘zstd’’(或 ‘lz4_1.0’) 启用压缩。
LSM-Tree 是一把双刃剑,一方面其写入快、压缩高、扩展好;另一方面,硬件的选择、合并的挑战,分区设计、合并策略、监控、压缩、 Redo Log (Clog)的持久性和高可用,都是我们需要关注并解决的难点。用好 OceanBase 存储引擎,就是在深刻理解 LSM-Tree 原理(尤其是合并)的基础上,做好三件事:分区设计、合并管理、硬件保障。