本节主要介绍 Failover 操作前的准备事项,包括选择 Failover 命令、获取集群信息及注意事项。
当主集群不可用的情况下,可以将备集群切换为新的主集群继续提供服务。您可以根据备集群的保护模式和保护级别、以及同步状态,选择合适的备集群和 Failover 命令。
选择 Failover 命令
执行 Failover 操作前,可以查询备集群 V$OB_CLUSTER
视图的 PROTECTION_MODE
和 PROTECTION_LEVEL
字段,查询结果存在以下两种场景:
保护级别
PROTECTION_LEVEL
和保护模式PROTECTION_MODE
均为MAXIMUM AVAILABILITY
或者MAXIMUM PROTECTION
备集群处于最大可用级别和最大保护级别时,表示主集群不可用前,主备集群处于强同步状态,备集群的所有分区数据一致,且各个分区数据没有空洞。这种情况下,可以采用无损 Failover 命令将备集群直接激活为主集群角色,且整个过程不会丢失数据。
无损 Failover 命令的语法如下:
obclient> ALTER SYSTEM FAILOVER TO cluster_name CLUSTER_ID = cluster_id [FORCE];
您也可以通过添加
FORCE
关键字来跳过备集群保护模式和保护级别的检查。保护级别
PROTECTION_LEVEL
和保护模式PROTECTION_MODE
的其他任意组合备集群处于其他状态时,无法确定备集群的各个分区的数据是否一致,以及每个分区的数据是否有空洞。这种情况下,可以采用有损 Failover 命令将备集群切换为主集群角色,整个过程会将所有分区的数据恢复到一致性快照点,保证该快照点之前的所有分区数据的完整性。Failover 执行成功后,系统处于一致性状态,但是无法保证数据无损。
有损 Failover 命令的语法如下:
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
状态的分区副本。注意
检查前要求主集群处于不可用状态,否则检查的备集群的状态不可信。
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 过程就不会处理该分区。
获取集群信息
假设当前存在一主一备两个集群(现场操作时,请以实际环境为准):
主集群信息
obclient> SELECT CLUSTER_ID, CLUSTER_NAME, CLUSTER_ROLE FROM V$OB_CLUSTER;
+------------+--------------+--------------+
| CLUSTER_ID | CLUSTER_NAME | CLUSTER_ROLE |
+------------+--------------+--------------+
| 1 | obcluster | PRIMARY |
+------------+--------------+--------------+
1 row in set
备集群信息
obclient> SELECT CLUSTER_ID, CLUSTER_NAME, CLUSTER_ROLE FROM V$OB_CLUSTER;
+------------+--------------+------------------+
| CLUSTER_ID | CLUSTER_NAME | CLUSTER_ROLE |
+------------+--------------+------------------+
| 2 | obcluster | PHYSICAL STANDBY |
+------------+--------------+------------------+
1 row in set