适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题描述
主备集群关系搭建后,发现新建的备集群中存在一个租户一直没有进行数据同步。
问题诊断
执行如下命令在备集群中查询系统表
__all_virtual_cluster_stats或视图v$ob_cluster_stats来查看各个租户的同步状态。发现租户 1008 的用户表(user_table)存在较大的同步延迟,而租户的系统表(sys_table)上同步正常。
obclient> select *, usec_to_time(min_user_table_scn), use_to_time(min_sys_table_scn) from __all_virtual_cluster_stats;执行如下命令在备集群中查看租户 1008 中的分区是否处于
restore状态,并没有任何发现。obclient> select * from __all_virtual_meta_table where is_restore != 0; Empty set (0.11 sec)对比主备集群中租户 1008 的
unit的分配情况,发现备集群中该租户处于缺少副本的状态。主集群:
obclient> select * from gv$unit where tenant_id=1008; +---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+----------+----------+---------------+-----------------+ | unit_id | unit_config_id | unit_config_name | resource_pool_id | resource_pool_name | zone | tenant_id | tenant_name | svr_ip | svr_port | migrate_from_svr_ip | migrate_from_svr_port | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num | +---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+----------+----------+---------------+-----------------+ | 1022 | 1026 | config_obmysqlgbk_zone3_S1_fjh | 1025 | pool_obmysqlgbk_zone3_fjh | zone3 | 1008 | obmysqlgbk | 11.xxx.xx.168 | 2882 | | 0 | 1.5 | 1.5 | 6442450944 | 6442450944 | 1250 | 1250 | 536870912000 | 375 | | 1023 | 1027 | config_obmysqlgbk_zone1_S1_qgs | 1026 | pool_obmysqlgbk_zone1_qgs | zone1 | 1008 | obmysqlgbk | 11.xxx.xx.111 | 2882 | | 0 | 1.5 | 1.5 | 6442450944 | 6442450944 | 1250 | 1250 | 536870912000 | 375 | | 1024 | 1025 | config_obmysqlgbk_zone2_S1_add | 1027 | pool_obmysqlgbk_zone2_add | zone2 | 1008 | obmysqlgbk | 11.xxx.xx.115 | 2882 | | 0 | 1.5 | 1.5 | 6442450944 | 6442450944 | 1250 | 1250 | 536870912000 | 375 | +---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+----------+----------+---------------+-----------------+备集群:
+---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+----------+----------+---------------+-----------------+ | unit_id | unit_config_id | unit_config_name | resource_pool_id | resource_pool_name | zone | tenant_id | tenant_name | svr_ip | svr_port | migrate_from_svr_ip | migrate_from_svr_port | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num | +---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+----------+----------+---------------+-----------------+ | 1022 | 1026 | config_obmysqlgbk_zone3_S1_fjh | 1025 | pool_obmysqlgbk_zone3_fjh | zone3 | 1008 | obmysqlgbk | 11.xxx.xx.101 | 2882 | | 0 | 1.5 | 1.5 | 6442450944 | 6442450944 | 1250 | 1250 | 536870912000 | 375 | +---------+----------------+--------------------------------+------------------+---------------------------+-------+-----------+-------------+---------------+----------+---------------------+-----------------------+---------+---------+------------+------------+---------- +----------+---------------+-----------------+怀疑在备集群的创建过程中,租户 1008 的副本创建出现问题,需要到备集群的 RS 主节点排查 RS 日志。
查找 RS 的 Leader 节点位置。
__all_virtual_core_meta_table中保存了__all_core_table的位置信息,可以通过该表获得 RS 的 Leader 节点位置。命令如下:
obclient> select * from __all_virtual_core_meta_table where role = 1;在 RS 主节点排查 RS 日志,查看副本创建相关的日志信息,发现大量的 -4624 报错。
grep "ob_standby_cluster_partition_" rootservice.log WARN [RS] try_create_partition (ob_standby_cluster_partition_process.cpp:818) [268390][648] [Y8420AC2D408-000600C1E92B6E58] [lc=7] [dc=0] failed to get partition array(ret=-4624,ret="OB_MACHINE_RESOURCE_NOT_ENOUGH",min_schema_version=0);根据
trace_id来搜索 RS 日志,发现备集群在CREATE PARTITION时报错:tenant doesn't own any pool。grep "Y8420AC2D408-000600C1E92B6E58" rootservice.log WARN [RS] get_pool_ids_of_tenant (ob_unit_manager.cpp:2325) [268391][650] [Y8420AC2D408-000600C1E92B6E58] [lc=17] [dc=0] tenant doesn't own any pool(tenant_id=1008, ret=0);
至此,可以判断是在备集群创建租户的过程中,租户的 unit 分配出现了问题,导致租户一直处于缺副本的状态。
该案例中,备集群分配 unit 失败与主备库的一个 bug 有关,在建备库迁移租户的时候如果产生切主或者内存等存在问题会触发 unit 分配失败。
应急处理方法
如果系统中有充足的资源来为租户分配 unit,可以尝试使用以下命令进行 unit 的重新加载。
obclient> alter system reload unit;
租户创建完成后,可以使用 __all_virtual_cluster_stats 或视图 v$ob_cluster_stats 来查看各个租户的同步状态。也可以使用 __all_core_table 来查看各个租户的 schema 同步情况。