如何监控和调整OceanBase的合并流程?

【问题描述】如何监控和调整OceanBase的合并流程?

7 个赞

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 数量 -

:warning: 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:数据文件大小,与上者同时配置时以此为准

:pushpin: 总结

监控和调整合并流程的核心思路是:

  1. 日常监控:定期查询 CDB_OB_MAJOR_COMPACTIONGV$OB_COMPACTION_PROGRESS 等视图,关注合并状态和进度
  2. 异常排查:合并卡住时首先查 GV$OB_COMPACTION_DIAGNOSE_INFO,根据 STATUSDIAGNOSE_INFO 定位原因
  3. 性能调优:根据业务特点合理配置合并时间(低峰期)、线程数、轮转策略等参数
  4. 资源保障:确保磁盘空间充足,避免因空间不足导致合并失败
5 个赞

解释的够详细,学习一下。

3 个赞

从系统表中可以看到合并进度

2 个赞

厉害了。当操作手册了。

1 个赞

解释得真详细。