主集群创建租户后,备集群会逻辑同步主集群系统租户下创建租户的 DDL,然后执行自动创建租户流程。备集群在自动创建租户的过程中可能会卡住,本节主要介绍备集群在自动创建租户过程中卡住的排查方法、可能原因及解决方法。
排查方法
您可以通过以下几种方法来判断备集群在创建租户时是否卡住:
查询
__ALL_TENANT
表,对比主备集群的租户列表。如果备集群中缺少部分租户,则表示备集群可能正在创建租户,或者创建租户失败出现了卡住的现象。
在主集群上,查询
V$OB_STANDBY_STATUS
视图的SYNCHRONIZATION_STATUS
列。如果该列的值为
SYS SCHEMA NOT SYNC
,则表示系统租户的 Schema 不同步,可能出现了备集群创建租户时卡住的现象。在主集群和备集群上,分别执行以下命令查询
V$OB_CLUSTER_STATS
视图,比较系统租户的 Schema 版本。obclient> SELECT REFRESHED_SCHEMA_VERSION FROM V$OB_CLUSTER_STATS WHERE TENANT_ID = 1;
如果备集群的系统租户的 Schema 版本比主集群的系统租户的 Schema 版本小,则表示可能出现了备集群创建租户时卡住的现象。
在主集群下,查询一个即将同步到备集群的系统租户的 DDL 变更。
如果是创建租户的 DDL 操作,则此时备集群正在同步创建租户 DDL,但等待很长一段时间后仍然同步不成功,则很可能出现了创建租户时卡住的现象。
查看同步情况的 SQL 语句如下:
obclient> SELECT SCHEMA_VERSION, TENANT_ID, DDL_STMT_STR
FROM __ALL_DDL_OPERATION
WHERE SCHEMA_VERSION > [standby_sys_schema_version]
LIMIT 10;
原因分析
备集群创建租户时卡住的常见原因是租户资源池创建失败。本节以目标租户的 tenant_id
为 1001
为例,确认备集群中是否出现了租户资源池创建失败的方法如下:
查询资源配置,检查是否存在名称为
__unit_config_1001
的资源配置。obclient> SELECT * FROM __ALL_UNIT_CONFIG WHERE NAME LIKE '__unit_config_1001';
如果查询结果中不存在对应的资源配置,则说明还没有开始创建租户,当前问题不是资源池创建失败导致。否则,需要执行下一步。
查询资源池,检查是否存在名称为
__resource_pool_1001
的资源池。obclient> SELECT * FROM __ALL_RESOURCE_POOL WHERE NAME LIKE '__resource_pool_1001';
如果查询结果中存在对应的资源池,则说明资源池创建成功,当前问题不是资源池创建失败导致。否则,说明资源池还未创建成功,需要执行下一步检查。
查询 RootService 事件,检查是否存在
'create_resource_pool'
的事件,并且执行失败。obclient> SELECT * FROM __ALL_ROOTSERVICE_EVENT_HISTORY
WHERE EVENT LIKE "%create_resource_pool%" AND VALUE2 LIKE "%__resource_pool_1001%"
ORDER BY GMT_CREATE DESC
LIMIT 1;
查询结果中如果存在
'create_resource_pool'
的事件,则确认资源池创建失败。
如果确认是租户资源池创建失败,通常的可能原因如下:
备集群上的 Server 宕机
备集群上在线的 Server 的可用资源不足
解决方法
排查备集群上是否有机器故障,机器故障可能导致 Zone 内没有机器分配 Unit,创建资源池时报
-4656
的错误。如果确认是机器故障,则需要尽快恢复机器,保证有足够的 Server 在线。
如果确认有足够的 Server 在线,则需要计算 Server 的剩余资源,包括 CPU、内存等,人工调小备集群的租户资源配置,保证 Zone 内有机器分配 Unit。备集群会自动重试创建租户资源池,直到成功。
调整备集群租户资源配置的命令如下:
obclient> ALTER RESOURCE UNIT __unit_config_1001 MIN_MEMORY='xx', MAX_MEMORY='xx';
其中,
__unit_config_1001
表示tenant_id
为1001
的租户的资源配置。说明
建议在调小备集群的租户资源配置时,同时调整主集群的配置,尽量保证主备集群的资源配置相同,避免因配置异构带来的运维复杂度。
或者,您也可以调小主集群的资源配置,然后删除备集群自动创建的 Unit 配置,例如
__unit_config_1001
。设置后,备集群会自动重试,并采用主集群的租户资源配置重新创建__unit_config_1001
。这样可以保证主备集群的资源配置相同。