#yasom仲裁选主配置
在单机一主一备部署形态下,可以使用基于yasom进程的仲裁选主功能保障业务连续性,当主库发生异常不能对外服务时,系统通过yasom仲裁将备库升为主库,并将原主库降为备库。
# 功能介绍
开启仲裁选主后,主库启动前会连接yasom或备库确认实际角色,若连接失败则主库启动失败。如需降备,原主库会直接以备库角色启动。正常运行中,yasom进程会对数据库状态进行监控,当主库出现故障时,在备库执行failover;当备库出现故障最大保护模式下主库业务阻塞时,将主库保护模式降级。
仲裁选主仅在yasom和备库的yasagent进程在线时生效。
仲裁的模式分为零丢失模式和普通模式,具体表现如下:
零丢失模式(ZeroDataLossMode=true):主备保护模式支持最大保护和最大可用,开启零丢失模式的仲裁选主后,yasom会自动将保护模式调整为最大保护。处于最大保护模式的场景下,主库发生故障时yasom会执行自动failover切换。若某个备库异常,主库会降为最大可用模式,若此时主库异常,为确保备库不丢数据(即RPO=0),yasom不会自动failover。
普通模式(ZeroDataLossMode=false):主备保护模式支持最大可用和最大性能。切换限制少,但不保证RPO=0,该模式可能会导致数据丢失。
# 配置步骤
# 步骤1:准备一主一备环境
部署单机一主一备高可用环境,可以参考安装部署中所述的单机(主备)部署步骤直接安装高可用环境,或参考通过yasboot扩容备库构建高可用环境,环境搭建过程中需注意:
备库数量仅允许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 | db | 1-1:1 | 54814 | open | normal | primary | 192.168.1.2:1688 | /data/yashan/yasdb_data/db-1-1 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+------------------+--------------------------------+
| host0002 | db | 1-2:2 | 49529 | open | normal | standby | 192.168.1.3:1688 | /data/yashan/yasdb_data/db-1-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 1
Protection Mode: MAXIMUM AVAILABILITY
Members:
[1-1:1] - Primary database
[1-2:2] - Physical standby database
Transport Lag: 0 seconds
Apply Lag: 15 seconds
Apply Rate: 0.00 KByte/s
Properties:
FailoverThreshold = 5
FailoverAutoReinstate = false
ZeroDataLossMode = true
Automatic Failover: DISABLED
根据返回信息可知,仲裁选主相关参数已生效,并且主备状态正常,没有显示告警。
# 步骤3:开启仲裁选主
开启仲裁选主前需确保主备库状态均正常且保护模式相同。
- 执行如下命令,开启仲裁选主:
$ yasboot election enable on -c yashandb
- 查看仲裁选主状态:
$ yasboot election config show -c yashandb
group 1
Protection Mode: MAXIMUM PROTECTION
Members:
[1-1:1] - Primary database
[1-2:2] - Physical standby database
Transport Lag: 0 seconds
Apply Lag: 15 seconds
Apply Rate: 0.00 KByte/s
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确认角色,如果确认已有新的主库,旧主库将以备库角色启动。
# 常见问题
# 如何查看仲裁选主记录?
使用yasboot election event命令可以查看仲裁选举的记录,包括failover,保护模式切换,脑裂修复,数据库启动角色确认等。
# 仲裁选举启动失败该如何处理?
开启仲裁选举功能的前提是主备库状态正常。若功能启动失败,请检查主备连接状态,以及每个数据库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命令进行节点启停等运维操作,避免不必要的故障切换。

