#yasom仲裁选主配置
在共享集群一主一备部署形态下,可以使用基于yasom进程的仲裁选主功能保障业务连续性,当主集群所有实例发生异常不能对外服务时,系统通过yasom仲裁将备集群升为新的主集群,并将原主集群降为备集群。
# 功能介绍
开启仲裁选主后,主集群的实例在启动前会连接yasom或备集群实例确认实际角色,若连接失败则主集群启动失败。如需降备,原主集群会直接以备库角色启动。正常运行中,yasom进程会对数据库状态进行监控,当主集群所有实例出现故障时,在备集群的实例上执行failover;当备集群出现故障,导致最大保护模式下主集群业务阻塞时,将主集群保护模式降级。
仲裁选主仅在yasom和备集群的yasagent进程在线时生效。
仲裁的模式分为零丢失模式和普通模式,具体表现如下:
零丢失模式(ZeroDataLossMode=true):主备保护模式支持最大保护和最大可用,开启零丢失模式的仲裁选主后,yasom会自动将保护模式调整为最大保护。处于最大保护模式的场景下,主集群所有实例发生故障时yasom会执行自动failover切换。若备集群异常,主集群会降为最大可用模式,若此时主集群再发生异常,为确保备集群不丢数据(即RPO=0),yasom不会自动failover。
普通模式(ZeroDataLossMode=false):主备保护模式支持最大可用和最大性能。切换限制少,但不保证RPO=0,该模式可能会导致数据丢失。
# 配置步骤
# 步骤1:准备共享集群高可用环境
部署共享集群一主一备的高可用环境,可以参考安装部署中所述的共享集群部署步骤直接安装高可用环境,环境搭建过程中需注意:
备集群数量仅允许1个。
需开启操作系统身份认证(遵循标准安装步骤时默认已开启),才能正常使用仲裁选主功能。
建议将yasom部署在独立的服务器,不要与主/备集群的实例部署在同一服务器。
Caution:
备集群与yasom部署于同一台服务器时,不建议使用仲裁选主。如仍需使用,推荐使用普通模式。因为在零丢失模式下,若yasom和备集群同时故障,主集群的最大保护模式将无法降级,会使主集群产生业务阻塞。
若yasom不可用,即使处于仲裁选主的零丢失模式,仍有可能因数据库保护模式无法变更(例如,此时备集群宕机,主集群的保护模式无法从最大保护变为最大可用),而使得主集群产生业务阻塞。
部署成功后,检查数据库状态。
$ yasboot cluster status -c yashandb -d
hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path
-------------------------------------------------------------------------------------------------------------------------------------------------------------
host0001 | ce | 1-1:1 | 19513 | open | normal | primary | 192.168.1.2:1688 | /data/yashan/yasdb_data/ce-1-1
---------+-----------+--------+-------+-----------------+-----------------+---------------+--------------------+---------------------------------------------
host0002 | ce | 1-2:2 | 19608 | open | normal | primary | 192.168.1.3:1688 | /data/yashan/yasdb_data/ce-1-2
---------+-----------+--------+-------+-----------------+-----------------+---------------+--------------------+---------------------------------------------
host0003 | ce | 2-1:3 | 19703 | open | normal | standby | 192.168.1.4:1688 | /data/yashan/yasdb_data/ce-2-1
---------+-----------+--------+-------+-----------------+-----------------+---------------+--------------------+---------------------------------------------
host0004 | ce | 2-2:4 | 19651 | started | - | - | 192.168.1.5:1688 | /data/yashan/yasdb_data/ce-2-2
---------+-----------+--------+-------+-----------------+-----------------+---------------+--------------------+---------------------------------------------
# 步骤2:配置仲裁选主参数
仲裁选主的参数如下:
| 参数名 | 默认值 | 取值范围 | 含义 |
|---|---|---|---|
| FailoverThreshold | 9 | [2,1000] | 备集群心跳超时时间(单位:秒),到达该时间后,yasom将执行failover切换流程 |
| FailoverAutoReinstate | false | true/false | 是否启用自动脑裂修复。 启用后,如果备集群发生脑裂处于NEED REPAIR状态,yasom将尝试自动修复。但是共享集群模式下,不支持启用该选项 |
| ZeroDataLossMode | true | true/false | 是否启用零丢失模式。 启用后,将设置主备为最大保护模式,当主集群宕机时,备集群可自动failover;当备集群异常时,主集群将由yasom降级为最大可用模式并禁止自动failover,直到备集群恢复同步后,yasom重新将主集群升级为最大保护模式并允许自动failover |
- 执行如下命令,配置仲裁选主参数:
# 本文仅为示例值,请根据实际需求调整
$ yasboot election config set -k FailoverThreshold -v 5 -c yashandb
$ yasboot election config set -k ZeroDataLossMode -v true -c yashandb
- 查看仲裁选主参数是否配置正确,数据库状态是否正常:
$ yasboot election config show -c yashandb
group 3
Protection Mode: MAXIMUM AVAILABILITY
Members:
[1-1:1] - Primary database
[1-2:2] - Primary database
[2-1:3] - Physical standby database
Transport Lag: 0 seconds
Apply Lag: 0 seconds
Apply Rate: 0.00 KByte/s
[2-2:4] - Physical standby database (nomount)
Properties:
FailoverThreshold = 5
FailoverAutoReinstate = false
ZeroDataLossMode = true
Automatic Failover: DISABLED
根据返回信息可知,仲裁选主相关参数已生效,主备状态正常,其中2-1节点是备集群的master实例,接收和回放所有主库实例发送的redo。
# 步骤3:开启仲裁选主
开启仲裁选主前需确保主备集群状态正常、保护模式相同、所有实例均已启动,且主备集群各自至少有1个实例处于OPEN阶段。
- 执行如下命令,开启仲裁选主:
$ yasboot election enable on -c yashandb
- 查看仲裁选主状态:
$ yasboot election config show -c yashandb
group 3
Protection Mode: MAXIMUM PROTECTION
Members:
[1-1:1] - Primary database
[1-2:2] - Primary database
[2-1:3] - Physical standby database
Transport Lag: 0 seconds
Apply Lag: 15 seconds
Apply Rate: 0.00 KByte/s
[2-2:4] - Physical standby database (nomount)
Properties:
FailoverThreshold = 5
FailoverAutoReinstate = false
ZeroDataLossMode = true
Automatic Failover: Enabled in Zero Data Loss Mode
根据返回信息,“Enabled in Zero Data Loss Mode”表示已在零丢失模式下开启仲裁选主,主备的保护模式会自动改为最大保护,此状态下允许自动failover(如果主集群发生故障,备集群会自动failover升主)。
在当前配置下,数据库对故障的表现为:
当备集群发生故障时,yasom会将主集群的保护模式改为最大可用,防止业务阻塞,同时将禁止自动failover(因为最大可用模式存在数据丢失风险)。直到备集群恢复正常,主备同步完成后,yasom将主集群的保护模式恢复为最大保护并允许自动failover。
当主集群发生故障时,yasom会检测备集群是否连接超时,当时长超过FailoverThreshold参数值时,yasom将下发failover指令给备集群,让其升主。
旧主集群宕机后重启时,会与yasom确认角色,如果确认已有新的主集群,旧主集群将以备集群角色启动。
# 常见问题
# 为什么备集群的升主时间较长?
正常状态下,主集群所有实例均处于OPEN阶段,备集群则仅master实例处于OPEN阶段(其他实例均处于NOMOUNT阶段)。基于此,可将自动升主流程分为如下两个阶段:
- 备集群master实例执行failover操作,通常可在10s内完成master实例升主,恢复对外服务。
- yasom依次启动新主集群中的其他实例(NOMOUNT阶段至OPEN阶段),直至新主集群的所有实例都处于OPEN阶段后整个failover流程才算完成。实例启动过程比较耗时,使得升主时间整体变长。
# 如何查看仲裁选主记录?
使用yasboot election event命令可以查看仲裁选举的记录,包括failover、保护模式切换以及数据库启动角色确认等。
# 仲裁选举启动失败该如何处理?
开启仲裁选举功能的前提是主备集群状态正常,所有实例在线,并且主备集群各自至少有一个实例是OPEN状态。若功能启动失败,请检查主备集群连接状态,以及每个数据库V$DATABASE的STATUS是否为NORMAL。如果数据库不正常,请通过查询V$DIAG_INCIDENT,查看告警日志,运行日志等定位,常见的故障可能有磁盘空间不足,网络故障等。
# 为什么无法切换到最大保护模式?
切换到最大保护模式时要求主集群的redo已完全同步给备集群。如果备集群故障或备集群redo接收速度慢,都会导致redo无法同步,请检查备集群状态是否正常,网络带宽是否充足,并保证足够的备集群的硬件资源。
# 备集群Apply Lag越来越大该怎么处理?
备集群回放速度慢,跟不上主集群redo产生速度时,备集群Apply Lag会越来越大。请保证备集群拥有足够的硬件资源(不要远低于主集群的资源),包括CPU、内存以及磁盘性能等。也可以尝试修改并行参数,提高并行度。
# 主集群故障后,长时间无法升主的可能原因有哪些?
可能是备集群回放速度慢,有大量的redo等待回放。可以通过查询V$DATABASE的switchover_status确认备集群是否在升主,如果是,请等待redo回放完毕。
备集群状态异常,不可升主。检查是否出现need repair、是否磁盘空间满。
零丢失模式下,如果数据库处于最大可用模式是禁止自动failover的,如需强制failover,请强制关闭yasom仲裁后手动执行failover。
# 强制关闭yasom仲裁后,主集群重启报确认角色失败该怎么处理?
强制关闭yasom仲裁选主功能时会尝试重置每个数据库上的OM_ELECTION_ENABLE参数,如果数据库不可访问,会导致参数残留。该主集群重启后,无法通过yasom确认角色,会启动失败。
请手动修改主备的OM_ELECTION_ENABLE参数。
# 使用yasboot stop命令关闭主集群后备集群不会自动升主,但为什么使用SQL语句关闭主集群后备集群会自动升主?
yasom会将通过yasboot下发stop、restart等命令视作用户主动发起的运维操作而非故障场景,因此不会下发failover命令升主。如果直接使用SQL语句关闭数据库,因yasom无法感知,会将其一律视作故障场景,从而触发自动选主。
在启用yasom仲裁选主功能后,建议使用yasboot命令进行节点启停等运维操作,避免不必要的故障切换。

