本节主要介绍如何执行有损 Failover 流程。
操作步骤
确认主集群处于不可用状态,即主集群上的所有 OBServer 均已宕机。
为了保证安全,要求主备集群中只能存在一个真正的主集群。如果主集群可用,则在备集群上执行Failover 命令会报错。因此,在执行 Failover 命令前,需要确认主集群处于不可用状态,避免后续 Failover 命令执行失败。
在各个备集群上查询集群状态,选择合适的备集群作为目标主集群。
在备集群上,查询
V$OB_CLUSTER
视图,获取集群信息。obclient> SELECT CLUSTER_ROLE, PROTECTION_MODE, PROTECTION_LEVEL, CURRENT_SCN FROM V$OB_CLUSTER;
+------------------+---------------------+---------------------+------------------+
| CLUSTER_ROLE | PROTECTION_MODE | PROTECTION_LEVEL | CURRENT_SCN |
+------------------+---------------------+---------------------+------------------+
| PHYSICAL STANDBY | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | 1613813589631620 |
+------------------+---------------------+---------------------+------------------+
1 row in set
返回结果中:
CLUSTER_ROLE
:表示集群角色,备集群角色应为PHYSICAL STANDBY
。PROTECTION_MODE
:表示保护模式。PROTECTION_LEVEL
:表示保护级别。CURRENT_SCN
:表示备集群的同步进度。
根据查询结果:
当保护模式
PROTECTION_MODE
与保护级别PROTECTION_LEVEL
均为MAXIMUM AVAILABILITY
或者MAXIMUM PROTECTION
时,有损 Failover 的执行结果与无损 Failover 一致,认为当前所有分区数据一致,不会执行回滚操作。当保护模式
PROTECTION_MODE
与保护级别PROTECTION_LEVEL
为其他组合时,有损 Failover 会以租户为单位将所有分区数据回滚到一致状态。其中,
CURRENT_SCN
表示所有租户同步进度的最小值。CURRENT_SCN
越小,执行 Failover 操作后丢失的数据就越多;如果CURRENT_SCN
为0
或1
,则表示备集群的部分租户还处于构建状态,数据不完整,执行 Failover 后数据可能会清空。
在备集群上,查询
V$OB_CLUSTER_STATS
,查看各个租户的同步进度。obclient> SELECT TENANT_ID, MIN_SYS_TABLE_SCN, MIN_USER_TABLE_SCN FROM V$OB_CLUSTER_STATS;
+-----------+-------------------+--------------------+
| TENANT_ID | MIN_SYS_TABLE_SCN | MIN_USER_TABLE_SCN |
+-----------+-------------------+--------------------+
| 1 | 1613813707942627 | 1613813707942627 |
| 1001 | 1613813589631620 | 1613813589631620 |
| 1002 | 1613813589631620 | 1613813589631620 |
+-----------+-------------------+--------------------+
3 rows in set
返回结果中:
TENANT_ID
:表示租户 ID,TENANT_ID
为1
表示系统租户,其他数值表示普通租户。MIN_SYS_TABLE_SCN
:表示系统表的同步进度最小值。MIN_USER_TABLE_SCN
:表示用户表的同步进度最小值。
系统租户在主备集群上相互独立,不会进行物理同步,有损 Failover 过程中不会执行回滚操作。
普通租户在主备集群上物理同步,不同分区的同步进度不同,有损 Failover 以普通租户为单位执行回滚操作:
所有系统表分区的回滚点为:
MIN_SYS_TABLE_SCN
所有用户表分区的回滚点为:
MIN_USER_TABLE_SCN
和MIN_SYS_TABLE_SCN
的最小值
选择备集群后,登录备集群,修改配置项,加快 Failover 的速度。
修改以下 2 个隐藏配置项,可以加快 Failover 的速度:
_mini_merge_concurrency
:用于控制转储的并发度,默认值为3
,可以修改为16
。_ob_minor_merge_schedule_interval
:用于调度转储的间隔时间,默认为20s
,建议修改为3s
。
具体操作如下:
查看配置项的值。
在修改配置项前,建议先记录这些配置项的原始值,便于后续恢复这些配置项的值。
obclient> SELECT NAME, VALUE FROM __ALL_VIRTUAL_SYS_PARAMETER_STAT WHERE NAME = '_mini_merge_concurrency';
+-----------------------------+-------+
| NAME | VALUE |
+-----------------------------+-------+
| _mini_merge_concurrency | 3 |
+-----------------------------+-------+
1 row in set
obclient> SELECT NAME, VALUE FROM __ALL_VIRTUAL_SYS_PARAMETER_STAT WHERE NAME = '_ob_minor_merge_schedule_interval';
+-----------------------------------+-------+
| NAME | VALUE |
+-----------------------------------+-------+
| _ob_minor_merge_schedule_interval | 20s |
+-----------------------------------+-------+
1 row in set
修改配置项的值。
obclient> ALTER SYSTEM SET _mini_merge_concurrency = 16;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET _ob_minor_merge_schedule_interval = '3s';
Query OK, 0 rows affected
在备集群上,执行以下命令,切换为主集群。
通过系统变量
ob_query_timeout
来设置命令的超时时间,单位为微秒,默认值为10000000
表示10 秒。更多系统变量ob_query_timeout
的说明,请参见 ob_query_timeout。说明
设置命令的超时时间为可选操作,您可以根据实际情况进行调整,建议设置为 100 秒(100000000)。
obclient> SET OB_QUERY_TIMEOUT = 100000000;
Query OK, 0 rows affected
执行 Failover 命令。
obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER;
Query OK, 0 rows affected
查询
V$OB_CLUSTER
和V$OB_CLUSTER_FAILOVER_INFO
视图,观察集群状态,确定 Failover 切换位点。V$OB_CLUSTER_FAILOVER_INFO
视图记录了每一轮每个租户的 Failover 数据,SYS_TABLE_SCN
表示系统表的 Failover 位点,USER_TABLE_SCN
表示用户表的 Failover 位点,系统租户的 Failover 位点没有意义。obclient> SELECT CLUSTER_ROLE, STANDBY_BECAME_PRIMARY_SCN FROM V$OB_CLUSTER;
+---------------- +--------------------------------------+
| CLUSTER_ROLE | STANDBY_BECAME_PRIMARY_SCN |
+----------------+---------------------------------------+
| PRIMARY | 1613813589631620 |
+-----------------+--------------------------------------+
1 row in set
obclient> SELECT 'FAILOVER#', TENANT_ID, SYS_TABLE_SCN, USER_TABLE_SCN FROM V$OB_CLUSTER_FAILOVER_INFO;
+----------------------+-------------+---------------------+-----------------------+
| FAILOVER# | TENANT_ID | SYS_TABLE_SCN | USER_TABLE_SCN |
+----------------------+-------------+---------------------+-----------------------+
| 1613813770317824 | 1 | 1613813772434321 | 1613813772434321 |
| 1613813770317824 | 1001 | 1613813589631620 | 1613813589631620 |
| 1613813770317824 | 1002 | 1613813589631620 | 1613813589631620 |
+----------------------+-------------+---------------------+-----------------------+
3 rows in set
执行 Failover 后,集群角色从
PHYSICAL STANDBY
变为PRIMARY
。STANDBY_BECAME_PRIMARY_SCN
记录了所有租户中最小的 Failover 的位点。Failover 位点的含义是小于或等于该位点的数据与原主集群的数据一致。恢复配置项的值。
注意
如果执行 Failover 前修改了配置项,Failover 执行完成后请务必恢复配置项的值,以免影响后续集群的正常工作。
obclient> ALTER SYSTEM SET _mini_merge_concurrency = 3;
Query OK, 0 rows affected
obclient> ALTER SYSTEM SET _ob_minor_merge_schedule_interval = '20s';
Query OK, 0 rows affected