OBCP第二章 OceanBase 存储引擎高级技术学习笔记

发布于:2025-06-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

OceanBase 存储引擎高级技术学习笔记

一、内存管理

1. 内存分配层次

OS总内存
observer总内存--由memory_limit/memory_limit_percentage设定
为 OS 预留内存
系统内部内存--通过system_memory设定
租户可用内存
SYS租户: MemStore + KVCache
租户1: MemStore + KVCache
租户N: MemStore + KVCache

不可动态伸缩的内存: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

核心设计

MemTable
内存增量数据
Mini SSTable
L0层
Minor SSTable
L1层
Major SSTable
L2层

转储后的结构称之为 Mini SSTable 或者是 Minor SSTable
合并时,表分区所有的 Minor SSTable 会根据合并快照点一起参与做 Major Compaction,最后会生成 Major SSTable

数据合并流程

  1. 冻结(Freeze):MemStore 达到阈值时冻结
  2. 转储(Minor Freeze):冻结数据写入 Mini SSTable(L0)
  3. 合并(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(全量)
资源消耗 低(仅涉及增量数据) 高(涉及全量数据合并)
内存释放
磁盘空间 冗余数据多(需多层查询) 空间优化(单层数据)
业务影响 较小 较大(可配合轮转合并降低影响)

六、最佳实践

  1. 避免写满MemStore

    • 调低 freeze_trigger_percentage(如40%)
    • 增加 minor_freeze_times 延迟合并
  2. 业务高峰管理

    • 手动转储释放内存:ALTER SYSTEM MINOR FREEZE
    • 合并安排在低谷期:major_freeze_duty_time='02:00'
  3. 轮转合并优化

    • 启用 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使用情况

网站公告

今日签到

点亮在社区的每一天
去签到