首批通过分布式安全可靠测评,为关键业务系统打造
Failover 前准备
更新时间:2024-04-07 14:30:34
本节主要介绍 Failover 操作前的准备事项。
当主集群不可用的情况下,可以将备集群切换为新的主集群继续提供服务。
有损 Failover 命令
当主集群不可用的情况下,可以采用有损 Failover 命令将备集群切换为主集群角色,整个过程会将所有分区的数据恢复到一致性快照点,保证该快照点之前的所有分区数据的完整性。Failover 执行成功后,系统处于一致性状态,但是无法保证数据无损。
有损 Failover 命令的语法如下:
obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER [FORCE];
注意事项及影响
执行 Failover 流程的注意事项及影响:
对集群状态的要求
Failover 流程对各个集群的状态有要求:
对于主集群,要求主集群的所有 OBServer 全部宕机,避免双写。
对于即将执行有损 Failover 的备集群,要求所有的 OBServer 都处于
ACTIVE状态,否则会导致 Failover 命令执行失败。如果备集群为
INACTIVE状态的 OBServer 都处于永久下线状态,您也可以添加FORCE关键字,强制 执行有损 Failover。语句如下:obclient> ALTER SYSTEM ACTIVATE PHYSICAL STANDBY CLUSTER FORCE;
对索引的影响
Failover 过程会特殊处理索引。OceanBase 数据库会自动删除执行 Failover 操作后未生效的索引和多余的索引。
对副本的影响
Failover 过程不能处理正在创建中的副本。备集群创建分区时会从主集群同步元数据,如果主集群不可用,备集群正在创建中的副本可能会一直处于
standby restore状态。如果存在正在创建中的副本,可能导致 Failover 过程卡住直到超时。为了确保 Failover 操作能顺利完成,建议备集群执行 Failover 前通过以下 SQL 语句检查处于
standby restore状态的分区副本。注意
检查前要求主集群处于不可用状态,否则检查的备集群的状态不可信。
obclient> SELECT * FROM oceanbase.__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 setCLUSTER_ID:代表集群ID。CLUSTER_NAME:代表集群名。CLUSTER_ROLE:代表集群角色。PRIMARY代表主集群,PHYSICAL STANDBY代表备集群。