问题描述
OceanBase 数据库弱读从/只读副本遇到长事务场景导致 CPU 使用率 100% 的情况。
对大表 t1 开启一个长事务, 比如 update 更新全表,耗时足够长, 此时使用弱读在从副本/只读副本查询大表 t1 出现查询超时,日志报错-6004, 当弱读查询并发量较高时, 会造成 SQL 堆积, CPU 使用率 100%。
适用版本
OceanBase 数据库 V3.x 版本。
问题原因
OceanBase 数据库 V3.x 版本存在即时写日志机制:事务在内存中剩余需要同步的数据量超过某一定值时,会将内存中需要同步的数据量立即同步到备机,能够保证在主动切主时,需要搬迁的数据量小于定值,从而保证切主时需要同步的数据量可控, 能达到平滑切主不杀事务的目的。所以在长事务执行过程中,日志会不断同步到从/只读副本。大事务触发及时写日志;长事务、大事务切主触发写日志;上面两个场景下是问题触发的诱因,都是会存在的。导致当前弱读无法判断是否需要读取该事务的数据,会一直等在这里报错-6004(读请求等待事务结束),直到 SQL 超时。
注意
主副本不会存在上述情况,因为执行中的事务会在主副本上加锁,因此读请求看到锁后会跳过读取这个事务的数据。
解决方法
升级至问题已修复版本。目前已修复的版本为 OceanBase 数据库企业版 V3.2.4 BP5(oceanbase-3.2.4.5-105000012023081513)及之后版本。
在存在弱读场景下,需要将长事务拆成多个粒度更小的短事务。