【问题描述】如何监控和调整OceanBase的合并流程?
OceanBase 的合并(Major Compaction / Major Freeze)是存储引擎中非常关键的运维操作,直接影响查询性能和磁盘空间。以下从监控和调整两个维度进行详细说明。
监控合并流程
查看集群级合并状态
通过 CDB_OB_MAJOR_COMPACTION 视图可以查看当前所有租户的合并状态,重点关注 STATUS 字段是否为 COMPACTING(正在合并)。
SELECT * FROM CDB_OB_MAJOR_COMPACTION;
查看各 Zone 的合并进度
CDB_OB_ZONE_MAJOR_COMPACTION 视图展示本租户各个 Zone 的合并状态信息,包括合并开始时间、结束时间、当前版本等。
SELECT * FROM CDB_OB_ZONE_MAJOR_COMPACTION;
查看 Server 级别的合并进度
GV$OB_COMPACTION_PROGRESS 可以查看 OBServer 级别的合并进度,关注以下字段:
-
STATUS:任务状态,NODE_RUNNING表示正在运行 -
UNFINISHED_TABLET_COUNT:未完成的 Tablet 数量 -
DATA_SIZE/UNFINISHED_DATA_SIZE:总数据量和未完成数据量
SELECT * FROM GV$OB_COMPACTION_PROGRESS WHERE STATUS = 'NODE_RUNNING';
查看 Tablet 级别的合并进度
GV$OB_TABLET_COMPACTION_PROGRESS 提供更细粒度的信息,包括未完成的数据量和预计完成时间(ESTIMATED_FINISH_TIME)。
SELECT * FROM GV$OB_TABLET_COMPACTION_PROGRESS;
诊断合并异常
当合并出现卡住或异常时,首先查询 GV$OB_COMPACTION_DIAGNOSE_INFO 视图进行诊断。该视图的 STATUS 字段按严重程度从低到高分为:
-
SPECIAL:输出相同问题的 Tablet 数量汇总 -
RS_UNCOMPACTED:存在 Tablet 版本尚未推高,不一定异常 -
NOT_SCHEDULE:Compaction 长时间未被调度 -
FAILED:出现明显异常
SELECT * FROM GV$OB_COMPACTION_DIAGNOSE_INFO;
查看合并历史记录
-- 查看合并历史(按时间倒序)
SELECT * FROM GV$OB_TABLET_COMPACTION_HISTORY
WHERE TYPE = 'MAJOR_MERGE' ORDER BY START_TIME DESC LIMIT 10;
-- 查看耗时超过 5 秒的合并任务
SELECT * FROM GV$OB_MERGE_INFO
WHERE tenant_id = 1002 AND (END_TIME - START_TIME) > 5 LIMIT 10;
查看 MemStore 内存与转储次数
合并触发与 MemStore 使用率和转储次数密切相关,可通过以下视图监控:
SELECT * FROM GV$OB_MEMSTORE;
调整合并流程
合并触发方式
OceanBase 提供三种合并触发方式:
| 方式 | 说明 | 配置/命令 |
|---|---|---|
| 定时合并 | 每天在指定时间自动触发 |
major_freeze_duty_time(默认凌晨 2 点) |
| 自动合并 | MemStore 使用率 + 转储次数达到阈值 |
freeze_trigger_percentage + major_compact_trigger
|
| 手动合并 | 运维人员主动发起 | ALTER SYSTEM MAJOR FREEZE; |
修改定时合并时间示例:
ALTER SYSTEM SET major_freeze_duty_time = '03:00';
合并控制参数
以下是合并相关的核心配置项:
| 参数 | 作用 | 默认值 |
|---|---|---|
merge_thread_count |
合并线程数,控制并发合并的分区个数 | 0(自适应,取 min(10, cpu_cnt * 0.3)) |
zone_merge_timeout |
单 Zone 合并超时阈值 | 3h |
max_kept_major_version_number |
保留的历史 SSTable 版本数 | 2 |
enable_manual_merge |
是否开启手动合并模式 | off |
enable_merge_by_turn |
是否开启轮转合并 | - |
zone_merge_order |
轮转合并时 Zone 的合并顺序 | - |
zone_merge_concurrency |
轮转合并时并发合并的 Zone 数量 | - |
![]()
merge_thread_count最大取值建议不超过 48,值过大会占用过多 CPU 和 IO 资源,影响在线业务。
轮转合并配置
轮转合并利用多副本架构,轮流为每个 Zone 做合并,合并期间将 Leader 切换到其他 Zone,避免合并对在线业务的影响:
-- 关闭手动合并模式(开启自动合并)
ALTER SYSTEM SET enable_manual_merge = false;
-- 开启轮转合并
ALTER SYSTEM SET enable_merge_by_turn = true;
-- 设置合并顺序和并发度
ALTER SYSTEM SET zone_merge_order = 'z1,z2,z3,z4,z5,z6', zone_merge_concurrency = 3;
轮转合并的注意事项:
- 以 Zone 为单位轮转,整体合并时间会变长
- 某个 Zone 合并开始前会进行 Leader 切换,对长事务有影响
- 正在合并的 Zone 上没有 Leader,避免了合并对在线服务的性能影响
Compaction 线程数调优
OceanBase 通过以下参数管理各类 Compaction 的并发线程数:
| 参数 | 对应操作 | 说明 |
|---|---|---|
compaction_low_thread_score |
Major Compaction(合并) | 低优先级线程数 |
compaction_mid_thread_score |
Minor Compaction(小合并) | 中优先级线程数 |
compaction_high_thread_score |
Mini Compaction(转储) | 高优先级线程数 |
如果 MemStore 内存紧张,可以调大 compaction_high_thread_score 加速转储;如果希望加快合并速度,可以调大 compaction_low_thread_score。
手动控制合并流程
在合并过程中遇到问题时,可以进行干预:
-- 手动触发合并
ALTER SYSTEM MAJOR FREEZE;
-- 暂停合并(如遇到 Checksum 校验错误)
ALTER SYSTEM SUSPEND MERGE;
-- 清理合并错误标记
ALTER SYSTEM CLEAR MERGE ERROR;
-- 恢复合并
ALTER SYSTEM RESUME MERGE;
磁盘空间相关参数
合并需要额外的磁盘空间,以下参数需要关注:
-
data_disk_usage_limit_percentage:数据盘最大写入百分比(默认 90%),超过后合并任务会失败 -
datafile_disk_percentage:数据文件占磁盘总空间的百分比(默认 90%) -
datafile_size:数据文件大小,与上者同时配置时以此为准
总结
监控和调整合并流程的核心思路是:
-
日常监控:定期查询
CDB_OB_MAJOR_COMPACTION、GV$OB_COMPACTION_PROGRESS等视图,关注合并状态和进度 -
异常排查:合并卡住时首先查
GV$OB_COMPACTION_DIAGNOSE_INFO,根据STATUS和DIAGNOSE_INFO定位原因 - 性能调优:根据业务特点合理配置合并时间(低峰期)、线程数、轮转策略等参数
- 资源保障:确保磁盘空间充足,避免因空间不足导致合并失败
解释的够详细,学习一下。
从系统表中可以看到合并进度
厉害了。当操作手册了。
解释得真详细。