适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题描述
Migrate unit 任务在 __all__rootservice_event_history 信息表中一直报错 -4013,查看日志发现如下告警:single alloc size large than 4G is not allowed。
[2023-04-12 03:43:53.286988] WARN alloc (ob_tenant_ctx_allocator.h:125) [23913][0][YB42C0A82562-0005F64AEFA9985E-0-0] [lt=10] [dc=2815] [OOPS] alloc failed reason: single alloc size large than 4G is not allowed(alloc_size: 6706692096)
问题原因
因为 Migrate unit 在 OceanBase 小租户(unit num 等于 1,primary_zone 单节点)场景下存在批量优化(可以观察到 __all_virtual_rebalance_task_stat 记录的 is_scheduled 字段值都是 YES),会一次性调度所有副本的任务。当副本数量过多时,migrate task 申请的 500 租户内存超 4G 就会报错。
注意
__all_virtual_rebalance_task_stat:记录当前正在进行的负载均衡任务。
解决方法
可以通过设置 primary_zone 打散(主要参考 __all_tenant 表的 primary_zone 字段的值)来将租户变为非小租户,之后会按照 PG 维度进行调度,打散命令如下。
obclient> alter tenant <tenant_name> primary_zone='zone_a,zone_b,zone_c';
如果打散 primary_zone 造成严重的性能问题,可以将 enable_auto_leader_switch 关闭后,再打散primary_zone。这样既将租户变为非小租户,又不会实际变动 leader 的分布。关于enable_auto_leader_switch 关闭的语句如下。
obclient> alter system set enable_auto_leader_switch='False';