暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

TRUNCATE耗时千秒?OceanBase深度调优

365

背景

客户实时采集任务在5月6日采集失败,而且最近业务并没有做任何变更,情况发生比较突然,需要介入排查原因。

环境调研

  • 操作系统: ARM( 2核 48线程 96 cpus , 756G ) 麒麟V10 sp3

  • Oceanbase: 4.2.1 bp3 hotfix4

  • OceAnbase架构:5副本架构,租户均是 1-1-1 3副本,共计 10 个租户(sys租户为5副本)

  • 业务系统:XXX系统(内部系统) 租户ID 1016

  • 业务特性:典型跑批场景truncate + dml(原Oracle中使用的是临时表,OB上换成了实体表 +truncate)

问题排查

业务场景分析

在与客户沟通后,了解业务处理逻辑,正常情况下,任务在工作日早上9点至下午3点30分,从A系统(Oracle)将实时数据增量抽取至B系统(Oceanbase),B系统在接收到数据后,首先清理B库中间件表(TRUNCATE方式),数据处理后,最终入B系统。

开发已经排查A系统侧的采集任务,耗时正常,问题出在B系统数据处理逻辑上。

B系统数据处理逻辑拆分

B系统数据处理逻辑简化后,基本都是TRUNCATE+INSERT,没有其他比较复杂的逻辑,存在有并发处理,不过针对不同表。

利用obproxy的slow日志进行分析,正常阶段TRUNCATE和异常阶段TRUNCATE

正常阶段Truncate 耗时

注:正常truncate耗时在30s左右,虽说较长,但此时不影响程序调度
clip.png

异常阶段Truncate 耗时

可以看到truncate达到了惊人的1000s。

clip_1.png

TRUNCATE异常耗时分析

那么truncate为什么耗时这么久,而且最大耗时又那么精确在1000s,这里需要梳理下Oceanbase的DDL逻辑,为保证表结构元信息的正
确性,在执⾏DDL时,内部会对表结构元信息即 schema 信息进⾏full schema查询,插入等操作。

为了确认内部SQL的执行效率,排查observer.log和rootservice.log,是否有SQL超时记录。

clip_2.png

在observer.log中发现有OB_TIMEOUT的记录,耗时30s,根据tenant_id=1016,确认为异常系统B的租户ID,超时日志为刷新schema version符合DDL特征。

猜测,内部刷新schema version的SQL在30s超时后,可能会反复调用,直到校验通过。

内部SQL超时分析

正常的内部SQL,又为何会出现超时的情况?

SQL执行超时无非2个原因,表数据量大或者执行计划波动。

在Oceanbase数据库中,进行DDL时,为了维护多个节点执行的一致性,会记录DDL的操作信息,为此排查Oceanbase的众多__xxx_history表。发现表__all_virtual_table_history数据量达到220万,租户1016的记录就达到150万。

clip_3.png

租户1016的DDL明细,其中有4个都在20万以上,与业务进行确认,这4个都是在采集任务中需要频繁TRUNCATE的表。

clip_4.png

查询租户1016其中一张DDL表,发现从2024年7月至今的DDL记录一直都在,没有清理,所以__all_virtual_table_history积累这么大。

综合分析

经过以上的排查分析,基本已经确定TRUNCATE慢的原因:

1、租户1016采集任务频繁进行DDL,导致__all_virtual_table_history数据较大

2、__all_virtual_table_history数据积累到一定程度,内部SQL 30s超时,校验失败,可能存在反复调用校验

3、Truncate在1000s后结束,可能也触发内部超时参数。

针对 2、3的原因,排查相关参数,找到2个参数

internal_sql_execute_timeout OB内部SQL执行超时时间,默认30s

_ob_ddl_timeout OB DDL超时参数 默认1000s

clip_5.png

clip_6.png

以上2个参数也再次验证了,日志记录的30s超时,和DDL1000s的现象

解决方案

临时解决–调整internal_sql_execute_timeout参数

在了解了内部SQL执行超时是30s后,调整超时时间为10分钟,这也是对业务影响比较小的调整。最终与客户沟通,采用此种方法进行临时解决。

调整参数后,业务调度任务可以进行,采集时间较之前有所增加,但可以接受。

临时解决–清理__all_virtual_table_history表

__all_virtual_table_history表的清理逻辑为,当 table_id 发生变化后,系统表中的相关记录才会进行自动清理,否则不进行清理。4.x版本truncate不再采用3.x的drop+create重建逻辑。需要对表进行重建,或者将truncate的并行关闭,也会内部退化为 drop + create 逻辑。与3.x的区别是,3.x的drop + create 逻辑是异步执行,不会锁表,4.x会进行表锁。

所以需要将租户1016内,频繁truncate的表进行drop+create重建,__all_virtual_table_history表才会进行自动清理,对于一个稳定的系统来说,调整较大,业务暂不采用。

自动清理相关参数:

schema_history_recycle_interval 10m 自动清理任务调度时间间隔

schema_history_expire_time 7d 自动清理元数据失效时间(DROP后的天数)

永久解决–升级版本

在与OB厂商交流后,可升级至4.2.1bp10及以上,彻底解决此问题。

升级注意事项:

1、当前__all_virtual_table_history表数据量仍比较大,升级前建议对schema版本号过多的表进行重建,降低__all_virtual_table_history表数据量,以防止升级时升级任务超时异常。

2、先进行测试环境升级测试,待稳定运行且应用测试无问题后择机再进行生产环境升级

3、在建议在无业务或业务低峰期进行升级操作,建议可优先采用“停服升级”

4、升级期间禁止执行DDL 、合并,可在升级前进行合并操作

5、版本升级操作目前不支持回退操作,升级流程可采用先对主备租户解耦后升级主集群,待主集群升级成功且业务验证通过后,再进行备租户重建

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论