首批通过分布式安全可靠测评,为关键业务系统打造
transfer 导致查询性能下降
更新时间:2026-05-14 09:21
问题现象
背景介绍
Transfer
transfer 是 V4.2 版本特有的负载均衡能力,其作用是将日志流中的 tablet 转移到另外一个日志流中。
本问题背景
在开启负载均衡以后,一个 tablet 可能会从一个日志流转移(transfer)到另外一个日志流;tablet 在 transfer 过程中可能会生成一个空的 SSTable,这个空的 SSTable 会造成后续转储产生的 SSTable 不能合并成为一个,只有当 SSTable 的个数达到上限(32 个)以后才能合并;当转储 SSTable 个数比较多的情况下会影响查询的性能。
问题场景
一个 tablet 从日志流 1001 transfer 到 1002。
在 transfer 到 1002 日志流以后,tablet 中可能的有如下分布的两个 SSTable:
| Major SSTable | Values | Minor SSTable(transfer fill empty sstable) | Values |
|---|---|---|---|
| start_log_scn | 0 | start_log_scn | 1 |
| end_log_scn | 1000 | end_log_scn | 2000 |
| upper_trans_version | 1500 | upper_trans_version | 9223372036854775807 |
如果 transfer 以后出现了对应的空 SSTable ,那么 2000 以后的 SSTable 合并成为一个 SSTable 的时机需要等待 SSTable 的个数超过 32 个以后。
可能出现该问题的场景
tablet 出现 transfer。
对应的 tablet 当时不存在活跃的 MemTable。
关键诊断信息
事前巡检
查询内部表。
obclient> select * from oceanbase.__all_virtual_table_mgr where upper_trans_version = 9223372036854775807 and size = 0 and table_type != 0;
事后诊断
检查查询慢的 tablet 是否发生过 transfer。
obclient> select * from oceanbase.__all_virtual_transfer_task where tenant_id = xxx and tablet_list like '%xxx%'; obclient> select * from oceanbase.__all_virtual_transfer_task_history where tenant_id = xxx and tablet_list like '%xxx%';如果上述的查询中有数据说明对应的 tablet 出现过 transfer。
检查对应的 tablet 是否包含一个 upper_trans_version 为 9223372036854775807 并且 size 为 0 的空 SSTable。
obclient> select * from oceanbase.__all_virtual_table_mgr where upper_trans_version = 9223372036854775807 and size = 0 and tablet_id = xxx;
问题原因
内核 BUG。
问题的风险及影响
查询性能下降。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本。
解决方法
升级到问题已修复版本。目前已经修复该问题的版本包括 OceanBase 数据库 V4.2.1 BP4(oceanbase-4.2.1.4-104000062024022914)。
规避方式
无。