保护模式功能本质上用于定义主集群以何种模式(强同步或异步同步)向不同的备集群传输日志,备集群以何种方式接收日志以及数据是否无损。
OceanBase 数据库提供了两个字段来描述保护模式的配置及主备集群的状态:保护模式(PROTECTION_MODE
)和保护级别(PROTECTION_LEVEL
)。接着将从以下两个场景来描述这两个字段的取值及其含义。
最大性能模式切换为最大保护模式场景
默认情况下,主集群和备集群均处于最大性能模式,主集群异步向所有备集群传输日志,备集群数据落后于主集群,数据是有损的。主集群和备集群的保护模式和保护级别均显示为 MAXIMUM PERFORMANCE
。
最大保护模式下,主集群会强同步日志给 SYNC
备集群,SYNC
备集群最终会达到数据无损状态。整个模式过程不是原子的,会存在中间状态。下图展示了从最大性能模式切换为最大保护模式时,<PROTECTION_MODE
,PROTECTION_LEVEL
>二元组状态的转换流程。
图中:
初始状态的主备集群:
主集群和备集群均处于最大性能模式,保护模式(
PROTECTION_MODE
)和保护级别(PROTECTION_LEVEL
)的字段均为MAXIMUM PERFORMANCE
。收到保护模式切换命令后的主集群:
主集群的保护模式(
PROTECTION_MODE
)字段切换为MAXIMUM PROTECTION
,保护级别(PROTECTION_LEVEL
)字段保持为MAXIMUM PERFORMANCE
。然后开始通知所有 Server 强同步日志给SYNC
的备集群。等待所有 Server 都进入强同步模式后,保护级别(
PROTECTION_LEVEL
)的字段切换为MAXIMUM PROTECTION
,表示主集群进入强同步模式。注意
此过程不会停写,需要强同步的日志是之后新写的日志,已经提交成功的日志不受影响。
感知到保护模式变换后的
SYNC
备集群:SYNC
备集群的保护模式(PROTECTION_MODE
)字段变为MAXIMUM PROTECTION
,保护级别(PROTECTION_LEVEL
)字段保持为MAXIMUM PERFORMANCE
。待主集群进入强同步模式后,保护级别(
PROTECTION_LEVEL
)字段会变为RESYNCHRONIZATION
,表示处于追赶数据状态。在这个状态下,备集群会补齐与主集群的日志 GAP。待落后的日志补齐后,备集群的保护级别(
PROTECTION_LEVEL
)字段将变为MAXIMUM PROTECTION
,表示备集群与主集群数据一致,达到数据无损状态。
感知到保护模式变换后的
ASYNC
备集群:ASYNC
备集群的保护模式(PROTECTION_MODE
)字段变为MAXIMUM PROTECTION
,由于始终处于异步同步状态,因此保护级别(PROTECTION_LEVEL
)字段将保持为MAXIMUM PERFORMANCE
不变。
最大性能模式切换为最大可用模式的场景
最大可用模式是最大性能和最大保护两种保护模式的结合,最大可用模式下,主集群会存在两种状态:强同步日志给 SYNC
备集群和异步同步日志给 SYNC
备集群,两种状态会动态变化,同时影响备集群的状态。下图展示了从最大性能模式切换为最大可用模式时,<PROTECTION_MODE
,PROTECTION_LEVEL
>二元组状态的转换流程。图中:
初始状态的主备集群:
主集群和备集群均处于最大性能模式,保护模式(
PROTECTION_MODE
)和保护级别(PROTECTION_LEVEL
)的字段均为MAXIMUM PERFORMANCE。
收到保护模式切换命令后的主集群:
主集群的保护模式(
PROTECTION_MODE
)字段切换为MAXIMUM AVAILABILITY
,保护级别(PROTECTION_LEVEL
)保持为MAXIMUM PERFORMANCE
,表示当前仍然维持异步同步模式。然后不断检查备集群是否同步正常,如果备集群同步正常,则开始通知所有 Server 强同步日志给
SYNC
备集群。等待所有 Server 都进入强同步模式后,保护级别(
PROTECTION_LEVEL
)字段切换为MAXIMUM AVAILABILITY
,表示主集群进入强同步模式。此后,一直维持强同步模式,直到感知到
SYNC
备集群同步日志异常,自动降级为异步同步模式,保护级别(PROTECTION_LEVEL
)字段切换为MAXIMUM PERFORMANCE
。
感知到保护模式变换后的
SYNC
备集群:SYNC
备集群的保护模式(PROTECTION_MODE
)字段切换为MAXIMUM AVAILABILITY
。与最大保护模式类似,待主集群进入强同步模式后,保护级别(
PROTECTION_LEVEL
)字段会变为RESYNCHRONIZATION
,表示处于追赶数据状态。待落后的日志补齐后,备集群的保护级别(
PROTECTION_LEVEL
)字段将变为MAXIMUM AVAILABILITY
,表示处于强同步状态,与主集群数据一致,达到数据无损状态。
感知到保护模式变换后的
ASYNC
备集群:ASYNC
备集群的保护模式(PROTECTION_MODE
)字段变为MAXIMUM AVAILABILITY
,由于始终处于异步同步状态,因此保护级别(PROTECTION_LEVEL
)字段将保持为MAXIMUM PERFORMANCE
不变。
从以上两个场景可以看出,保护模式(PROTECTION_MODE
)字段是跨集群共享的状态值,主集群和备集群是一致的,表示当前配置下主备集群的数据保护能力。
保护模式(PROTECTION_MODE)字段的取值及含义如下:
MAXIMUM PERFORMANCE
:最大性能模式,表示主集群会异步同步日志给所有备集群。MAXIMUM PROTECTION
:最大保护模式,表示主集群会强同步日志给SYNC
备集群。MAXIMUM AVAILABILITY
: 最大可用模式,表示主集群会尽力强同步日志给SYNC
备集群,支持自动降级为异步同步模式。
保护级别(PROTECTION_LEVEL
)是集群级别的状态,在主集群和备集群上有不同的含义。在主集群上表示是否正在强同步日志;在备集群上表示当前是否进入强同步模式,数据是否无损。
保护级别(PROTECTION_LEVEL
)字段的取值及含义如下:
MAXIMUM PERFORMANCE
:表示主集群和备集群都在异步同步模式。MAXIMUM PROTECTION
:主集群表示在最大保护模式下强同步日志给SYNC
备集群;备集群表示进入强同步模式,数据无损。MAXIMUM AVAILABILITY
:主集群表示在最大可用模式下强同步日志给SYNC
备集群;备集群表示进入强同步模式,数据无损。RESYNCHRONIZATION
:主集群不会出现这个状态;备集群表示在追赶数据中,正在补齐日志 GAP。
不同模式下,主集群和备集群的保护级别的取值组合如下表所示。
保护模式 | 主集群为最大性能级别 | 主集群为最大保护级别 | 主集群为最大可用级别 |
---|---|---|---|
最大性能模式 |
| N/A | N/A |
最大保护模式 | 主集群的最大性能级别为临时状态,则:
|
| N/A |
最大可用模式 |
| N/A |
|
获取保护模式和保护级别
登录集群,查询 V$OB_CLUSTER
视图的 PROTECTION_MODE
和PROTECTION_LEVEL
列可以分别获取当前集群的保护模式和保护级别。
obclient> SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$OB_CLUSTER;
+--------------------+--------------------+
| PROTECTION_MODE | PROTECTION_LEVEL |
+--------------------+--------------------+
| MAXIMUM PROTECTION | MAXIMUM PROTECTION |
+--------------------+--------------------+
1 row in set