本节主要介绍 Failover 操作前的准备事项,包括选择 Failover 命令、获取集群信息及注意事项。

当主集群不可用的情况下,可以将备集群切换为新的主集群继续提供服务。您可以根据备集群的保护模式和保护级别、以及同步状态,选择合适的备集群和 Failover 命令。

选择 Failover 命令

执行 Failover 操作前,可以查询备集群 V$OB_CLUSTER 视图的 PROTECTION_MODEPROTECTION_LEVEL 字段,查询结果存在以下两种场景:

  • 保护级别 PROTECTION_LEVEL 和保护模式 PROTECTION_MODE 均为 MAXIMUM AVAILABILITY 或者 MAXIMUM PROTECTION

    备集群处于最大可用级别和最大保护级别时,表示主集群不可用前,主备集群处于强同步状态,备集群的所有分区数据一致,且各个分区数据没有空洞。这种情况下,可以采用无损 Failover 命令将备集群直接激活为主集群角色,且整个过程不会丢失数据。

    无损 Failover 命令的语法如下:

    1. obclient> ALTER SYSTEM FAILOVER TO cluster_name CLUSTER_ID = cluster_id [FORCE];

    您也可以通过添加 FORCE 关键字来跳过备集群保护模式和保护级别的检查。

  • 保护级别 PROTECTION_LEVEL 和保护模式 PROTECTION_MODE 的其他任意组合

    备集群处于其他状态时,无法确定备集群的各个分区的数据是否一致,以及每个分区的数据是否有空洞。这种情况下,可以采用有损 Failover 命令将备集群切换为主集群角色,整个过程会将所有分区的数据恢复到一致性快照点,保证该快照点之前的所有分区数据的完整性。Failover 执行成功后,系统处于一致性状态,但是无法保证数据无损。

    有损 Failover 命令的语法如下:

    1. obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER [FORCE];

注意事项及影响

执行 Failover 流程的注意事项及影响:

  • 对集群状态的要求

    Failover 流程对各个集群的状态有要求:

    • 对于主集群,要求主集群的所有 OBServer 全部宕机,避免双写,同时也是保证无损 Failover 场景下原主集群接入到新主集群的必要条件。

    • 对于即将执行有损 Failover 的备集群,要求所有的 OBServer 都处于 ACTIVE 状态,否则会导致 Failover 命令执行失败。

  • 对保护模式的影响

    Failover 流程对保护模式有影响,即无论操作前属于何种保护模式,执行 Failover 操作后,集群将统一被设置为最大性能模式。您需要重新调整保护模式的配置。

  • 对索引的影响

    Failover 过程会特殊处理索引。OceanBase 数据库会自动删除执行 Failover 操作后未生效的索引和多余的索引。在无损 Failover 场景下,会存在原主集群上已经生效的索引,但在新主集群上会被删除。这是因为备集群的索引为异步构建,与主集群不同步。即使是无损 Failover 也无法保证索引无损。

  • 对副本的影响

    Failover 过程不能处理正在创建中的副本。备集群创建分区时会从主集群同步元数据,如果主集群不可用,备集群正在创建中的副本可能会一直处于 standby restore 状态。

    如果存在正在创建中的副本,可能导致 Failover 过程卡住直到超时。为了确保 Failover 操作能顺利完成,建议备集群执行 Failover 前通过以下 SQL 语句检查处于 standby restore 状态的分区副本。

    注意

    检查前要求主集群处于不可用状态,否则检查的备集群的状态不可信。

    1. obclient> SELECT * FROM __ALL_VIRTUAL_META_TABLE WHERE IS_RESTORE = 100;

    IS_RESTORE 字段取值的含义如下:

    • 0 表示正常副本

    • 100 表示 standby restore 副本

    对于查询结果:

    • 如果分区所有副本都处于 standby restore 状态,Failover 过程会过滤这个分区,执行 Failover 操作前不需要您介入处理,但 Failover 完成后需要手动处理。

    • 如果部分副本已经完成 standby restore,处于正常状态,则应尽量等待其他副本完成 standby restore。这个过程要求 Leader 副本是正常状态的副本。

    • 如果执行 Failover 操作前未等待所有副本完成 standby restore,并且是少数派副本完成,而多数派副本没有完成的情况,则 Failover 过程可能会卡住,因为多数派副本均不正常。这种情况需要将该分区的所有副本都强制删除,这样 Failover 过程就不会处理该分区。

获取集群信息

假设当前存在一主一备两个集群(现场操作时,请以实际环境为准):

  • 主集群信息

    1. obclient> SELECT CLUSTER_ID, CLUSTER_NAME, CLUSTER_ROLE FROM V$OB_CLUSTER;
    2. +------------+--------------+--------------+
    3. | CLUSTER_ID | CLUSTER_NAME | CLUSTER_ROLE |
    4. +------------+--------------+--------------+
    5. | 1 | obcluster | PRIMARY |
    6. +------------+--------------+--------------+
    7. 1 row in set
  • 备集群信息

    1. obclient> SELECT CLUSTER_ID, CLUSTER_NAME, CLUSTER_ROLE FROM V$OB_CLUSTER;
    2. +------------+--------------+------------------+
    3. | CLUSTER_ID | CLUSTER_NAME | CLUSTER_ROLE |
    4. +------------+--------------+------------------+
    5. | 2 | obcluster | PHYSICAL STANDBY |
    6. +------------+--------------+------------------+
    7. 1 row in set