本节主要介绍如何执行有损 Failover 流程。

操作步骤

  1. 确认主集群处于不可用状态,即主集群上的所有 OBServer 均已宕机。

    为了保证安全,要求主备集群中只能存在一个真正的主集群。如果主集群可用,则在备集群上执行Failover 命令会报错。因此,在执行 Failover 命令前,需要确认主集群处于不可用状态,避免后续 Failover 命令执行失败。

  2. 在各个备集群上查询集群状态,选择合适的备集群作为目标主集群。

    1. 在备集群上,查询 V$OB_CLUSTER 视图,获取集群信息。

      1. obclient> SELECT CLUSTER_ROLE, PROTECTION_MODE, PROTECTION_LEVEL, CURRENT_SCN FROM V$OB_CLUSTER;
      2. +------------------+---------------------+---------------------+------------------+
      3. | CLUSTER_ROLE | PROTECTION_MODE | PROTECTION_LEVEL | CURRENT_SCN |
      4. +------------------+---------------------+---------------------+------------------+
      5. | PHYSICAL STANDBY | MAXIMUM PERFORMANCE | MAXIMUM PERFORMANCE | 1613813589631620 |
      6. +------------------+---------------------+---------------------+------------------+
      7. 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_SCN01,则表示备集群的部分租户还处于构建状态,数据不完整,执行 Failover 后数据可能会清空。

    2. 在备集群上,查询 V$OB_CLUSTER_STATS,查看各个租户的同步进度。

      1. obclient> SELECT TENANT_ID, MIN_SYS_TABLE_SCN, MIN_USER_TABLE_SCN FROM V$OB_CLUSTER_STATS;
      2. +-----------+-------------------+--------------------+
      3. | TENANT_ID | MIN_SYS_TABLE_SCN | MIN_USER_TABLE_SCN |
      4. +-----------+-------------------+--------------------+
      5. | 1 | 1613813707942627 | 1613813707942627 |
      6. | 1001 | 1613813589631620 | 1613813589631620 |
      7. | 1002 | 1613813589631620 | 1613813589631620 |
      8. +-----------+-------------------+--------------------+
      9. 3 rows in set

      返回结果中:

      • TENANT_ID:表示租户 ID,TENANT_ID1 表示系统租户,其他数值表示普通租户。

      • MIN_SYS_TABLE_SCN:表示系统表的同步进度最小值。

      • MIN_USER_TABLE_SCN:表示用户表的同步进度最小值。

      系统租户在主备集群上相互独立,不会进行物理同步,有损 Failover 过程中不会执行回滚操作。

      普通租户在主备集群上物理同步,不同分区的同步进度不同,有损 Failover 以普通租户为单位执行回滚操作:

      • 所有系统表分区的回滚点为:MIN_SYS_TABLE_SCN

      • 所有用户表分区的回滚点为:MIN_USER_TABLE_SCNMIN_SYS_TABLE_SCN 的最小值

  3. 选择备集群后,登录备集群,修改配置项,加快 Failover 的速度。

    修改以下 2 个隐藏配置项,可以加快 Failover 的速度:

    • _mini_merge_concurrency:用于控制转储的并发度,默认值为 3,可以修改为 16

    • _ob_minor_merge_schedule_interval:用于调度转储的间隔时间,默认为 20s,建议修改为 3s

    具体操作如下:

    1. 查看配置项的值。

      在修改配置项前,建议先记录这些配置项的原始值,便于后续恢复这些配置项的值。

      1. obclient> SELECT NAME, VALUE FROM __ALL_VIRTUAL_SYS_PARAMETER_STAT WHERE NAME = '_mini_merge_concurrency';
      2. +-----------------------------+-------+
      3. | NAME | VALUE |
      4. +-----------------------------+-------+
      5. | _mini_merge_concurrency | 3 |
      6. +-----------------------------+-------+
      7. 1 row in set
      8. obclient> SELECT NAME, VALUE FROM __ALL_VIRTUAL_SYS_PARAMETER_STAT WHERE NAME = '_ob_minor_merge_schedule_interval';
      9. +-----------------------------------+-------+
      10. | NAME | VALUE |
      11. +-----------------------------------+-------+
      12. | _ob_minor_merge_schedule_interval | 20s |
      13. +-----------------------------------+-------+
      14. 1 row in set
    2. 修改配置项的值。

      1. obclient> ALTER SYSTEM SET _mini_merge_concurrency = 16;
      2. Query OK, 0 rows affected
      3. obclient> ALTER SYSTEM SET _ob_minor_merge_schedule_interval = '3s';
      4. Query OK, 0 rows affected
  4. 在备集群上,执行以下命令,切换为主集群。

    1. 通过系统变量 ob_query_timeout 来设置命令的超时时间,单位为微秒,默认值为 10000000 表示10 秒。更多系统变量 ob_query_timeout 的说明,请参见 ob_query_timeout

      说明

      设置命令的超时时间为可选操作,您可以根据实际情况进行调整,建议设置为 100 秒(100000000)。

      1. obclient> SET OB_QUERY_TIMEOUT = 100000000;
      2. Query OK, 0 rows affected
    2. 执行 Failover 命令。

      1. obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER;
      2. Query OK, 0 rows affected
  5. 查询 V$OB_CLUSTERV$OB_CLUSTER_FAILOVER_INFO 视图,观察集群状态,确定 Failover 切换位点。

    V$OB_CLUSTER_FAILOVER_INFO 视图记录了每一轮每个租户的 Failover 数据,SYS_TABLE_SCN 表示系统表的 Failover 位点,USER_TABLE_SCN 表示用户表的 Failover 位点,系统租户的 Failover 位点没有意义。

    1. obclient> SELECT CLUSTER_ROLE, STANDBY_BECAME_PRIMARY_SCN FROM V$OB_CLUSTER;
    2. +---------------- +--------------------------------------+
    3. | CLUSTER_ROLE | STANDBY_BECAME_PRIMARY_SCN |
    4. +----------------+---------------------------------------+
    5. | PRIMARY | 1613813589631620 |
    6. +-----------------+--------------------------------------+
    7. 1 row in set
    8. obclient> SELECT 'FAILOVER#', TENANT_ID, SYS_TABLE_SCN, USER_TABLE_SCN FROM V$OB_CLUSTER_FAILOVER_INFO;
    9. +----------------------+-------------+---------------------+-----------------------+
    10. | FAILOVER# | TENANT_ID | SYS_TABLE_SCN | USER_TABLE_SCN |
    11. +----------------------+-------------+---------------------+-----------------------+
    12. | 1613813770317824 | 1 | 1613813772434321 | 1613813772434321 |
    13. | 1613813770317824 | 1001 | 1613813589631620 | 1613813589631620 |
    14. | 1613813770317824 | 1002 | 1613813589631620 | 1613813589631620 |
    15. +----------------------+-------------+---------------------+-----------------------+
    16. 3 rows in set

    执行 Failover 后,集群角色从 PHYSICAL STANDBY 变为 PRIMARYSTANDBY_BECAME_PRIMARY_SCN记录了所有租户中最小的 Failover 的位点。Failover 位点的含义是小于或等于该位点的数据与原主集群的数据一致。

  6. 恢复配置项的值。

    注意

    如果执行 Failover 前修改了配置项,Failover 执行完成后请务必恢复配置项的值,以免影响后续集群的正常工作。

    1. obclient> ALTER SYSTEM SET _mini_merge_concurrency = 3;
    2. Query OK, 0 rows affected
    3. obclient> ALTER SYSTEM SET _ob_minor_merge_schedule_interval = '20s';
    4. Query OK, 0 rows affected