主集群创建租户后,备集群会逻辑同步主集群系统租户下创建租户的 DDL,然后执行自动创建租户流程。备集群在自动创建租户的过程中可能会卡住,本节主要介绍备集群在自动创建租户过程中卡住的排查方法、可能原因及解决方法。

排查方法

您可以通过以下几种方法来判断备集群在创建租户时是否卡住:

  • 查询 __ALL_TENANT 表,对比主备集群的租户列表。

    如果备集群中缺少部分租户,则表示备集群可能正在创建租户,或者创建租户失败出现了卡住的现象。

  • 在主集群上,查询 V$OB_STANDBY_STATUS 视图的 SYNCHRONIZATION_STATUS 列。

    如果该列的值为 SYS SCHEMA NOT SYNC,则表示系统租户的 Schema 不同步,可能出现了备集群创建租户时卡住的现象。

  • 在主集群和备集群上,分别执行以下命令查询 V$OB_CLUSTER_STATS 视图,比较系统租户的 Schema 版本。

    1. obclient> SELECT REFRESHED_SCHEMA_VERSION FROM V$OB_CLUSTER_STATS WHERE TENANT_ID = 1;

    如果备集群的系统租户的 Schema 版本比主集群的系统租户的 Schema 版本小,则表示可能出现了备集群创建租户时卡住的现象。

  • 在主集群下,查询一个即将同步到备集群的系统租户的 DDL 变更。

    如果是创建租户的 DDL 操作,则此时备集群正在同步创建租户 DDL,但等待很长一段时间后仍然同步不成功,则很可能出现了创建租户时卡住的现象。

    查看同步情况的 SQL 语句如下:

    1. obclient> SELECT SCHEMA_VERSION, TENANT_ID, DDL_STMT_STR
    2. FROM __ALL_DDL_OPERATION
    3. WHERE SCHEMA_VERSION > [standby_sys_schema_version]
    4. LIMIT 10;

原因分析

备集群创建租户时卡住的常见原因是租户资源池创建失败。本节以目标租户的 tenant_id1001 为例,确认备集群中是否出现了租户资源池创建失败的方法如下:

  1. 查询资源配置,检查是否存在名称为 __unit_config_1001 的资源配置。

    1. obclient> SELECT * FROM __ALL_UNIT_CONFIG WHERE NAME LIKE '__unit_config_1001';

    如果查询结果中不存在对应的资源配置,则说明还没有开始创建租户,当前问题不是资源池创建失败导致。否则,需要执行下一步。

  2. 查询资源池,检查是否存在名称为 __resource_pool_1001 的资源池。

    1. obclient> SELECT * FROM __ALL_RESOURCE_POOL WHERE NAME LIKE '__resource_pool_1001';

    如果查询结果中存在对应的资源池,则说明资源池创建成功,当前问题不是资源池创建失败导致。否则,说明资源池还未创建成功,需要执行下一步检查。

  3. 查询 RootService 事件,检查是否存在 'create_resource_pool' 的事件,并且执行失败。

    1. obclient> SELECT * FROM __ALL_ROOTSERVICE_EVENT_HISTORY
    2. WHERE EVENT LIKE "%create_resource_pool%" AND VALUE2 LIKE "%__resource_pool_1001%"
    3. ORDER BY GMT_CREATE DESC
    4. LIMIT 1;

    查询结果中如果存在 'create_resource_pool' 的事件,则确认资源池创建失败。

如果确认是租户资源池创建失败,通常的可能原因如下:

  • 备集群上的 Server 宕机

  • 备集群上在线的 Server 的可用资源不足

解决方法

  1. 排查备集群上是否有机器故障,机器故障可能导致 Zone 内没有机器分配 Unit,创建资源池时报 -4656 的错误。

    如果确认是机器故障,则需要尽快恢复机器,保证有足够的 Server 在线。

  2. 如果确认有足够的 Server 在线,则需要计算 Server 的剩余资源,包括 CPU、内存等,人工调小备集群的租户资源配置,保证 Zone 内有机器分配 Unit。备集群会自动重试创建租户资源池,直到成功。

    调整备集群租户资源配置的命令如下:

    1. obclient> ALTER RESOURCE UNIT __unit_config_1001 MIN_MEMORY='xx', MAX_MEMORY='xx';

    其中,__unit_config_1001 表示 tenant_id1001 的租户的资源配置。

    说明

    • 建议在调小备集群的租户资源配置时,同时调整主集群的配置,尽量保证主备集群的资源配置相同,避免因配置异构带来的运维复杂度。

    • 或者,您也可以调小主集群的资源配置,然后删除备集群自动创建的 Unit 配置,例如 __unit_config_1001。设置后,备集群会自动重试,并采用主集群的租户资源配置重新创建 __unit_config_1001。这样可以保证主备集群的资源配置相同。