OceanBase 存储引擎高级技术学习笔记
一、内存管理
1. 内存分配层次
不可动态伸缩的内存:MemStore
大小由参数memstore_limit_percentage决定,表示租户的MemStore 部分占租户总内存的百分比;MemStore用来保存DML产生的增量数据,空间不可被占用。
可动态伸缩的内存:KVCache
保存来自SSTable的热数据,提高查询速度;KVCache空间会被其它众多内存模块复用
2. 关键参数
参数 | 说明 | 默认值 | 动态生效 |
---|---|---|---|
memory_limit |
直接设置OB进程内存上限(单位MB) | - | 是 |
memory_limit_percentage |
按物理内存百分比设置OB内存上限 | - | 是 |
system_memory |
系统内部内存大小(不属于任何租户) | 30G | 否 |
memstore_limit_percentage |
租户MemStore内存占比(不可动态伸缩) | 50 | 是 |
freeze_trigger_percentage |
触发冻结的内存使用阈值 | 70 | 是 |
注意: memory_limit=0时,memory_limit_percentage决定observer内存大小;否则由memory_limit决定observer内存大小
3. 配置示例
-- 设置OB进程内存上限为40GB
ALTER SYSTEM SET memory_limit='40G';
-- 查看内存参数
SHOW PARAMETERS LIKE '%memory%';
二、LSM Tree 架构
存储架构概述
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013392
核心设计
转储后的结构称之为 Mini SSTable 或者是 Minor SSTable
合并时,表分区所有的 Minor SSTable 会根据合并快照点一起参与做 Major Compaction,最后会生成 Major SSTable
数据合并流程
- 冻结(Freeze):MemStore 达到阈值时冻结
- 转储(Minor Freeze):冻结数据写入 Mini SSTable(L0)
- 合并(Major Freeze):增量数据与基线 SSTable 合并
三、转储(Minor Freeze)
1. 触发场景
- MemStore 使用率 ≥
freeze_trigger_percentage
- 批量数据导入需快速释放内存
- 避免业务高峰触发 Major Freeze
2. 关键参数
参数 | 作用 |
---|---|
minor_freeze_times |
转储次数达到后触发合并(0=关闭转储) |
minor_merge_concurrency |
并发转储分区数(影响性能) |
3. 手动触发命令
-- 对所有租户/Observer转储
ALTER SYSTEM MINOR FREEZE;
-- 指定租户转储
ALTER SYSTEM MINOR FREEZE TENANT='tenant1';
-- 指定分区转储
ALTER SYSTEM MINOR FREEZE PARTITION_ID='partidx%partcount@tableid';
4.查看转储记录
MemStore使用率达到freeze_trigger_percentage而触发的租户级转储,在__all_server_event_history表中查询
手动转储,在__all_rootservice_event_history表中可以查到具体的选项
5.转储对数据库的影响
转储的优势
每个租户的转储不影响observer上其它的租户,也不会触发集群级转储,避免关联影响
资源消耗小,对在线业务性能影响较低
耗时相对较短,MemStore更快释放,降低发生MemStore写满的概率
转储的副作用
数据层级增多,查询链路变长,查询性能下降
冗余数据增多,占用更多磁盘空间
四、合并(Major Freeze)
1. 触发方式
方式 | 命令/参数 |
---|---|
定时合并 | major_freeze_duty_time='02:00' |
MemStore 超阈值 | freeze_trigger_percentage + minor_freeze_times |
手动触发 | ALTER SYSTEM MAJOR FREEZE; |
查看合并状态
https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357884
select * from __all_zone;
select * from __all_zone where name = 'merge_status';
2. 轮转合并配置
-- 启用轮转合并
ALTER SYSTEM SET enable_manual_merge = false; --设置为true时,不支持任何形式的自动合并
ALTER SYSTEM SET enable_merge_by_turn = true; --- 开启轮转合并
ALTER SYSTEM SET zone_merge_order = 'z1,z2,z3'; --设置合并顺序
-- 查看合并状态
SELECT * FROM __all_zone WHERE name = 'merge_status';
3. 合并控制参数
参数 | 作用 |
---|---|
merge_thread_count |
合并线程数(默认0=自适应) |
zone_merge_timeout |
单Zone合并超时阈值(默认3h) |
max_kept_major_version_number |
保留历史版本数(默认2) |
zone_merge_concurrency |
在合并时,支持多少个 Zone 并发 |
4.合并注意事项
合并超时时间
由参数zone_merge_timeout定义超时阈值;默认值为'3h'(3个小时)
如果某个ZONE的合并执行超过阈值,合并状态被设置为TIMEOUT
空间警告水位
参数data_disk_usage_limit_percentage定义数据文件最大可以写入的百分比(超出阈值后禁止数据迁入),默认值90。
当数据盘空间使用量超过阈值后,合并任务打印ERROR警告日志,合并任务失败;需要尽快扩大数据盘物理空间,并调大data_disk_usage_limit_percentage参数的值
当数据盘空间使用量超过阈值后,禁止数据迁入
参数datafile_disk_percentage定义数据盘空间使用阈值(占用data_dir所在磁盘总空间百分比),默认值90
参数datafile_size 用于设置数据文件的大小,该配置项与 datafile_disk_percentage 同时配置时,以该配置项设置的值为准,默认值为0
5. 合并历史版本查询
-- 查询历史版本号
SELECT zone, svr_ip, major_version
FROM __all_virtual_partition_sstable_image_info;
-- 指定版本查询(利用Hint)
SELECT /*+ frozen_version(22) */ * FROM table_name;
查看合并记录和状态
五、转储 vs 合并对比
特性 | 转储(Minor Freeze) | 合并(Major Freeze) |
---|---|---|
触发层级 | 集群、server、租户、Replica 级别 | 集群级 |
数据层级 | 产生Minor SSTable(增量) | 生成Major SSTable(全量) |
资源消耗 | 低(仅涉及增量数据) | 高(涉及全量数据合并) |
内存释放 | 快 | 慢 |
磁盘空间 | 冗余数据多(需多层查询) | 空间优化(单层数据) |
业务影响 | 较小 | 较大(可配合轮转合并降低影响) |
六、最佳实践
避免写满MemStore
- 调低
freeze_trigger_percentage
(如40%) - 增加
minor_freeze_times
延迟合并
- 调低
业务高峰管理
- 手动转储释放内存:
ALTER SYSTEM MINOR FREEZE
- 合并安排在低谷期:
major_freeze_duty_time='02:00'
- 手动转储释放内存:
轮转合并优化
- 启用
enable_merge_by_turn
- 设置合理的
zone_merge_order
- 启用
完整配置示例:
-- 调整冻结阈值和转储次数 ALTER SYSTEM SET freeze_trigger_percentage=40; ALTER SYSTEM SET minor_freeze_times=5; -- 设置每日合并时间 ALTER SYSTEM SET major_freeze_duty_time='02:00';
附:关键系统表
表名 | 用途 |
---|---|
__all_server_event_history |
自动转储记录 |
__all_rootservice_event_history |
手动转储/合并记录 |
__all_zone |
合并状态查询 |
gv$memstore |
租户MemStore使用情况 |