Oceanbase的存储引擎基于什么数据结构?它如何优化写性能。
oceanbase的存储引擎是LSM的架构,分为SSTABLE 基线数据和MEMTABLE内存中的数据,所有的变更的数据都会先写在内存中,不会直接操作SSTABLE,由于写入数据都在内存中,这样大大提高了写入数据的性能
OceanBase 数据库存储引擎基于 LSM-Tree(Log-Structured Merge-Tree) 架构,并对写入性能进行了多种优化措施。以下是对相关信息的综合分析:
核心结构:
LSM-Tree 架构:
OceanBase 使用 LSM-Tree 的变体架构,将数据分为两部分:
MemTable(内存中的增量数据):支持读写操作。
SSTable(磁盘上的基线数据):只读,一旦生成不再修改。
数据更新流程:
所有的 DML 操作(插入、更新、删除)首先写入 MemTable。
当 MemTable 达到一定大小后,会转储为 SSTable(称为 Compaction 或合并)。
查询时,系统需同时查询 MemTable 和 SSTable,并进行归并处理。
写入性能优化机制:
减少随机 I/O:
LSM-Tree 将所有写操作集中于内存的 MemTable 中,当达到阈值后才顺序写入磁盘的 SSTable。
这种设计将随机写转化为顺序写,从而显著提升写入吞吐能力。
高效的 Compaction 策略:
OceanBase 在合并过程中采用宏块粒度管理,每个宏块大小为 2MB,内部再拆分成微块。
合并期间仅重用有变化的数据块,避免重复读取未修改的宏块,从而减少写放大。
相比传统 LSM-Tree 数据库,这种策略大幅降低了合并带来的性能开销。
MemTable 控制机制:
当 MemTable 内存使用达到上限时,OceanBase 提供了多种写入控制方式:
开启写入限速,在接近上限时主动限制客户端导入速度。
租户内存扩容(如果环境资源允许)。
调整租户内存中 MemTable 的比例,让转储更快发生,释放可用内存空间。
高性能事务支持:
支持大事务和长事务的落盘机制,保证事务的正常提交或回滚。
采用多级合并与转储机制,帮助用户在性能与空间之间找到平衡点。
压缩与存储优化:
基线数据(SSTable)采用行列混合编码结合通用压缩算法。
数据压缩率相较传统数据库提升 10+ 倍,同时不影响写入和查询性能。
行缓存与布隆过滤器:
对于高频 OLTP 场景,OceanBase 实现了行缓存(Row Cache),加速单行点查性能。
针对“空查”场景,构建了布隆过滤器(Bloom Filter),并对其进行缓存,避免不必要的数据访问。
总结
OceanBase 存储引擎基于 LSM-Tree 架构,结合传统关系型数据库的优点,形成了高效且稳定的存储解决方案。它通过将数据划分为 内存中的 MemTable 和 磁盘上的 SSTable,利用顺序写入、宏块优化、多级缓存等技术,有效提升了写入性能并降低了存储成本。
其关键优势包括:
LSM-Tree 结构实现高效写入
宏块管理机制减少写放大
MemTable 控制防止内存过载
行缓存与布隆过滤器优化小查询
高压缩比降低存储成本
OceanBase 的存储引擎基于 LSM-Tree (Log-Structured Merge Tree) 数据结构。LSM-Tree 是一种将数据分成内存中的 MemTable 和磁盘中的 SSTable 的数据结构。所有数据更新操作都在内存中的 MemTable 中完成,当 MemTable 达到一定阈值后,会触发 Compaction 过程,将数据转储到磁盘中的 SSTable 中。这种架构有以下优点:
-
写性能优化:
- 内存操作:所有的写操作都在内存中进行,这大大提高了写入性能。
- 顺序 I/O:当 MemTable 达到一定阈值后,数据会被批量转储到磁盘中,这样可以将随机 I/O 转化为顺序 I/O,提高写入吞吐能力。
- Compaction:定期进行 Compaction 操作,将多个小的 SSTable 合并成一个大的 SSTable,进一步减少磁盘 I/O 操作,提高性能。
-
数据压缩:
- 基线数据(SSTable)在磁盘中以更紧凑的方式存储,并且使用通用压缩算法进行压缩,从而获得更好的压缩比,减少存储成本。
-
读写分离:
- 增量数据放在内存中,基线数据放在 SSD 盘中,读操作时需要合并内存中的增量数据和磁盘中的基线数据,但通过 Block Cache 和 Row Cache 优化了读性能。
详情请参考: