OMS会出现DDL洪水吗?

【 使用环境 】测试环境
【 OB or 其他组件 】OMS 4.2.12
【 使用版本 】OMS 4.2.12
【问题描述】
老师,您好,

我们发现OMS有个任务,经常延时很大,初期,我们是通过扩容内存的方式(增加liboblog.memory_limit & ob2store.serialize_pool_size)处理,但是发现仍然同步非常缓慢,我们将libobcdc.log拿来分析,

日志附件
text (31).log (633.8 KB)

这份新日志信息量很大,揭示了之前内存扩容没有解决问题的真正原因 。让我对比分析:

:red_circle: 重大发现:同步链路被海量 TRUNCATE DDL 淹没

1. 日志主体内容:铺天盖地的 TRUNCATE TABLE

整个日志几乎全是同一种操作:

OP_TYPE=OB_DDL_TRUNCATE_TABLE(59)
DDL_STMT=[truncate table bap_etl.etl_xxx]

涉及 degp_pre.bap_etl 库下几十张 ETL 中间表(etl_dm_bi_satp_csfk_*etl_bi_satp_*etl_plus_dwd_zt_kmye* 等),每隔约 60~130ms 就有一条 TRUNCATE DDL 事务 ,且不断循环重复(同一张表被反复 truncate)。

这是典型的 ETL 调度任务模式 :每批数据加载前先 TRUNCATE 中间表再灌数。源端业务把 OMS 同步链路当成了"DDL 洪水"的来源。

单线程 DDL 处理成为串行瓶颈

注意所有 handle_tenant_ddl_task_ / handle_ddl_stmt_ 都发生在同一个线程 [54483][CDC-SEQ-TX-HAND] 上,且每个 DDL 事务都要走完整流程:

1parse_ddl_info → handle_trans → get_old_schema_version_(WDIAG 版本回退告警) 
2→ handle_stmt → DIRECT_OUTPUT → schema replay → replace_dict_table_meta → commit

每条 TRUNCATE 都要串行地做 schema 增量回放 + 数据字典刷新 。Formatter 线程(Formatter_0~9)也在为这些表反复 init table_schema_infocheck_column_

DDL 在 liboblog 中是全局串行的 ,TRUNCATE 洪水直接把单线程打满,DML 被排在后面,整体吞吐崩塌。这才是"同步很慢"的根因——不是内存,不是 Writer,而是源端 DDL 风暴

持续的告警:DDL schema version is reversed

WDAG: DDL schema version is reversed
(ddl_schema_version=1787056023xxxx, tenant_ddl_cur_schema_version=1787060709xxxx)

每条 DDL 事务都报"schema 版本回退"。这是因为积压了 18.5 小时 :Sequencer 正在处理的是"过去"的 DDL,而租户当前 schema 版本早已远超它。在追平之前,这个告警会一直刷。

根因结论(修正之前的判断)

源端 ETL 作业循环 TRUNCATE 几十张中间表(DDL 风暴)
        ↓
liboblog 单线程串行处理 DDL + schema 回放
        ↓
DDL 队列积压 18.5 小时,DML 被饿死
        ↓
Sequencer 反压(PAUSE_DISPATCH_TO_SEQUENCER)→ Fetcher 暂停
        ↓
内存堆积(扩容只能缓解,不能根治)→ 同步延迟持续增长

其实,我们不需要同步产生DDL的数据库,但是,我们发现黑名单和白名单都不太生效的样子。

尝试如下配置,好像效果也不明显。

ob2store.collect_ddl=false

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

看一下监控组件截图看看 oms是社区版的么

是的呢。

可以试试这样配置,看逻辑不是抓取truncate慢,是回放解析truncate慢? 如果truncate不需要同步,可以这样试试:

  1. 查看链路组件监控—更新 Incr-sync 组件。
  2. coordinator 模块下,点击新增 “+” 按钮,新增 skipDdl 参数。
  3. 修改新增的参数,填入值: [“TRUNCATE TABLE”] ,(注意大括号也需填入),点击确定
1 个赞

目前看着确实TRUNCATE 表导致的大量 TRUNCATE TABLE DDL 卡在 Sequencer 串行处理上,把cdc的全局序列堵死了

好的,老师,我们已经尝试进行相应配置:

另外,我看是 store 组件延时,incr-sync也会影响到store组件吗?

可以先按照上面的操作 看看是否能缓解 这个跳过 也不是能解决根因的办法 还是需要解决源头问题 tb_black_list也是有限的

是呢,感觉白名单和黑名单都不能解决问题。

老师说的从源头解决问题,只能在源头上少进行ddl 操作吗?其实,我是觉得这个应该感觉好像可以在OMS层面上处理。

尽量不要用truncate删除 改 DELETE 、分区交换,或拉开 truncate 间隔。否则会堵的很厉害

  1. 查看链路组件监控—更新 Incr-sync 组件。
  2. coordinator 模块下,点击新增 “+” 按钮,新增 skipDdl 参数。
  3. 修改新增的参数,填入值: [“TRUNCATE TABLE”] ,(注意大括号也需填入),点击确定

看起来不行。调整配置后,重新分析日志。

看来只能让业务端调整了,只不过比较麻烦~~~

嗯嗯,这里场景和我遇到的增量回放场景不一样,你是增量store解析处理慢,不是回放慢

老师,还有方法解决吗?

源端业务比较难改,truncate操作,本身来说,其实也挺合理的。

具体我也没啥思路,可以看看迁移链路的库表对象是用的【db.*】还是明确指定的【库名.表名】 这样,看明确指定 【库名.表名】 可以试试这种方式能否过滤掉不迁移的表的DDL处理

目前处理的话 看着只有黑名单和白名单的方式 主要你这个ETL 作业太频繁了 是否可以先停一下或者降频 TRUNCATE

好像没啥好办法,OMS的store必须要解析DDL,维持schema版本推进。 想法和官方老师回复的一样,

  • 要么用黑名单或白名单控制排除这些表
  • 要么指定库表迁移同步(也是等价于排除这些表)
  • 假设排除操作有效,可以分链路迁移,一个链路迁移常规表,一个链路迁移truncate频繁的表

其实,我在store层面配置了白名单。

老师,不过这个是测试环境,我跳过好了。

嗯嗯,逻辑应该是黑白名单只对DML有效,DDL不会过滤(schema version版本演进依赖DDL解析保持版本一致性)。 OMS配置上看上去没啥好办法了,truncate的业务逻辑看有没优化空间了,高频的DDL操作本身在OB侧正常使用时也是有一定影响。

1 个赞

了解~感谢老师了。

truncate,对schema只影响数据,而不影响表结构,然后,黑名单过滤整个库的话,是不是后面可以考虑过滤DDL呢?因为可能有的库属于中间的加工库,可能会有很多无效操作。

应该不行,总体逻辑应该是:liboblog对日志解析是租户级,报错是在序列号解析阶段的话,应该没法规避。如果是增量回放阶段,我理解可以用之前提到的skipDdl参数控制。

一句话总结:可以不执行DDL,但不能不解析DDL

PS:发现OMS虽然是有社区版,但好像并没有开源,github上没有代码逻辑,上面的描述逻辑不一定正确,具体实现逻辑可能需要官方老师确认 :grinning: