#一主多备自动选主
# 功能介绍
主备自动选主是指基于Raft选举算法规则(3个或以上节点形成多数派)保障业务连续性,当主库发生异常不能对外服务时,系统通过一定机制在多个备库节点间选举一个节点提升为主库(其余节点依然为备库),旧的主库降级为备库。
自动选主配置主要涉及以下配置参数:
NODE_ID:各主备节点的全局唯一ID,部署/扩容/托管时会自动配置且不允许修改。
HA_ELECTION_TIMEOUT:心跳超时时间,根据心跳检测数据库节点的状态。
HA_HEARTBEAT_INTERVAL:发送心跳的周期,主库会周期性地向所有跟随者(备库)发送心跳以维持地位。
HA_ELECTION_ENABLED:自动选主功能的总开关。
HA_ELECTION_LEADER_LEASE_ENABLED:主库未收到多数派备库心跳响应时是否进行主动降备,可选配置。
HA_ELECTION_PRIORITY:节点优先级,开启自动选主后,在保障数据安全的前提下节点的优先级越高会越优先成为新主,可选配置。
HA_ELECTION_AUTO_PRIMARY_SWITCH:主库发现高优先级备库时是否进行主备切换,可选配置。
# 适用场景
| 部署形态 | 高可用部署规模 |
|---|---|
| 单机部署 | 一主多备部署,且不存在级联备 |
| 存算一体分布式集群部署 | DN组内节点一主多备部署 |
# 开启自动选主
# 步骤1:准备一主多备环境
部署单机一主一备高可用环境,可以参考安装部署中所述的单机(主备)部署步骤直接安装相应环境,或参考扩缩容构建相应环境,环境准备过程中需注意:
备库数量至少2个,且未添加级联备。
主备库所安装的数据库版本必须一致,各项资源参数建议保持一致。
主备库安装过程中所定义的DATA目录应尽量保持一致。
环境准备完成后,可以检查数据库部署规模是否符合要求:
$ yasboot cluster status -c yashandb -d -p sys_password
# 单机一主多备环境示例:
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+------------------+--------------------------------+
| host0003 | db | 1-3:3 | 49582 | open | normal | standby | 192.168.1.4:1688 | /data/yashan/yasdb_data/db-1-3 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+------------------+--------------------------------+
# 分布式DN组内节点一主多备环境示例:
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| host0001 | mn | 1-1:1 | 56961 | open | normal | primary | 192.168.1.2:1678 | /data/yashan/yasdb_data/mn-1-1 |
| +-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| | dn | 3-2:7 | 57029 | open | normal | standby | 192.168.1.2:1698 | /data/yashan/yasdb_data/dn-3-2 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| host0002 | mn | 1-2:2 | 57024 | open | normal | standby | 192.168.1.3:1678 | /data/yashan/yasdb_data/mn-1-2 |
| +-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| | cn | 2-1:4 | 57024 | open | normal | primary | 192.168.1.3:1688 | /data/yashan/yasdb_data/cn-2-1 |
| +-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| | dn | 3-3:8 | 57016 | open | normal | standby | 192.168.1.3:1698 | /data/yashan/yasdb_data/dn-3-3 |
+----------+-------+-----------------+-----------------+---------------+--------------------+-------------------+---------------------------------+
| host0003 | mn | 1-3:3 | 57021 | open | normal | standby | 192.168.1.4:1678 | /data/yashan/yasdb_data/mn-1-3 |
| +-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| | cn | 2-2:5 | 57021 | open | normal | primary | 192.168.1.4:1688 | /data/yashan/yasdb_data/cn-2-2 |
| +-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
| | dn | 3-1:6 | 57021 | open | normal | primary | 192.168.1.4:1698 | /data/yashan/yasdb_data/dn-3-1 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+-------------------+---------------------------------+
# 步骤2:设置心跳时间
自动选主功能依赖如下两个时间参数,通常采用默认值配置即可。
HA_ELECTION_TIMEOUT:心跳超时时间,单位为秒,默认值为9。
HA_HEARTBEAT_INTERVAL:发送心跳的周期,单位为秒,默认值为3。
当超过HA_ELECTION_TIMEOUT设置时间备库仍未收到心跳时,备库自动发起选举。
Caution:
参与自动选主的同组主备库/节点的心跳周期和心跳超时时间配置必须一致,否则可能引起心跳超时误判,导致误切换。
-- 查看心跳超时时间
SHOW PARAMETER HA_ELECTION_TIMEOUT
NAME VALUE
------------------------- ---------
HA_ELECTION_TIMEOUT 9
-- 查看心跳发送周期
SHOW PARAMETER HA_HEARTBEAT_INTERVAL
NAME VALUE
------------------------- ---------
HA_HEARTBEAT_INTERVAL 3
# 步骤3:调整主备库保护模式
为确保在任意节点故障后选出来的新主不丢失已提交成功的事务,必须将主库和备库的保护模式均调整为最大保护模式。
依次在主备库上查询V$DATABASE视图,通过protection_mode字段确认当前保护模式:
SELECT database_id,database_name,open_mode,database_role,protection_mode FROM V$DATABASE;若为MAXIMUM PROTECTION最大保护模式则无需调整,否则须调整为最大保护模式。
如需切换保护模式,在主库执行如下语句:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;主库的保护模式会随着心跳同步到备库(可能需要一次心跳的时间)。为了加快保护模式设置速度,可以在主库修改保护模式后,在备库上也依次执行此操作。
再次查看主备库的保护模式,检查配置是否生效:
SELECT database_id,database_name,open_mode,database_role,protection_mode FROM V$DATABASE;
# 步骤4:开启主备库自动选主
自动选主的开关由HA_ELECTION_ENABLED参数控制,默认值为FALSE,即自动选主功能为关闭状态,如需开启自动选主功能则需将该参数设置为TRUE。
开启自动选主时应遵循先主后备的操作顺序。
HA_ELECTION_ENABLED参数支持在线调整,请依次在主库、所有备库上执行如下语句进行查看和修改:
-- 查看参数HA_ELECTION_ENABLED值
SHOW PARAMETER HA_ELECTION_ENABLED
-- 修改参数HA_ELECTION_ENABLED值
ALTER SYSTEM SET HA_ELECTION_ENABLED=TRUE;
Caution:
当Raft集群启动后,如需开启自动选主,开启顺序必须为先开启主库的自动选主,再开启备库的自动选主,否则容易发生备库自动升主,导致双主。
自动选主功能开启时,shutdown主库可能会触发备库自动升主,如需避免,应在执行shutdown前先手动关闭自动选主,关闭顺序必须为先关闭备库的自动选主,再关闭主库的自动选主。
# 步骤5:配置自动降备
自动降备用于控制主库未收到多数派备库心跳响应时是否进行主动降备,自动降备的开关由HA_ELECTION_LEADER_LEASE_ENABLED参数控制,默认值为FALSE,即不开启。
HA_ELECTION_LEADER_LEASE_ENABLED参数支持在线修改该参数的配置,且该参数只对主库生效,用户可根据自身业务系统情况按需选配。
当参数设置为TRUE时,下述情况中主库会在心跳超时时间(HA_ELECTION_TIMEOUT)后自动降备:
处于最大保护模式下,主库收到备库心跳数 <
QUORUM_SYNC_STANDBY中的syncNum,syncNum为用户自定义的同步备数量。处于非最大保护模式下,主库收到备库心跳数 <
(N / 2 + 1),N为所有库(含主库)的数量,若计算结果为小数则直接向下取整。
-- 查看是否开启主库自动降备功能
SHOW PARAMETER HA_ELECTION_LEADER_LEASE_ENABLED;
NAME VALUE
--------------------------------- ---------
HA_ELECTION_LEADER_LEASE_ENABLED FALSE
-- 开启主库自动降备功能
ALTER SYSTEM SET HA_ELECTION_LEADER_LEASE_ENABLED=TRUE;
Caution:
在单机一主多备部署中,在对主库(尤其是故障场景中仅剩孤立主库时)执行恢复操作前,需要先关闭自动降备功能,避免因未及时检测到备库心跳而触发自动降备,待恢复完成后再按需还原对应配置。
# 步骤6:配置节点优先级
节点的优先级通过HA_ELECTION_PRIORITY参数配置,值越大表示其节点优先级越高,默认值为1。
开启自动选主后,在保障数据安全的前提下节点的优先级越高会越优先成为新主。当某个节点的优先级为0时,该节点不会发起选举,即不会通过自动选主机制成为下一任主节点。
HA_ELECTION_PRIORITY参数支持在线修改该参数的配置,用户可根据自身业务系统情况按需选配。
-- 查看目标节点的优先级值
SHOW PARAMETER HA_ELECTION_PRIORITY;
NAME VALUE
--------------------------------- ---------
HA_ELECTION_PRIORITY 1
-- 修改目标节点的优先级值
ALTER SYSTEM SET HA_ELECTION_PRIORITY=2;
# 步骤7:配置自动换主
自动换主用于控制主库发现高优先级备库时是否进行主备切换,通过HA_ELECTION_AUTO_PRIMARY_SWITCH参数配置开关,默认值为FALSE,即不开启。
支持在线修改该参数的配置,且参数只对主库生效。用户可根据自身业务系统情况按需选配。
当参数设置为TRUE时,主库每隔一定时间会检测是否存在更高优先级的节点,如存在则进行主备切换。间隔时间默认为60s,如需调整该间隔时间请联系我们的技术支持处理。
-- 查看是否开启主库自动换主功能
SHOW PARAMETER HA_ELECTION_AUTO_PRIMARY_SWITCH;
NAME VALUE
------------------------------------ ---------
HA_ELECTION_AUTO_PRIMARY_SWITCH FALSE
-- 开启主库自动换主功能
ALTER SYSTEM SET HA_ELECTION_AUTO_PRIMARY_SWITCH=TRUE;
# 步骤8(可选):配置条件故障切换
条件故障切换是可选配置,可根据实际需求进行选配。
在某些场景中,为防止主库可能因出现特定异常而无法继续提供服务(但主备间网络依旧正常),可以通过事先指定自动切换的条件适时触发自动选主,更针对性地保障数据库持续提供服务。条件故障切换有两种类型,分别由以下两个参数控制:
FAILOVER_ERROR_CONDITION:可以配置主库向客户端抛出某些错误码时,主库立即关闭。错误码可以为数据库错误码,也可以为数据库错误码+系统错误码的组合。建议避免选择高频率的错误码以免过于频繁地触发自动切换。对文件类操作的异常,数据库错误码可能相同但系统错误码不同,建议采用“数据库错误码-系统错误码”格式更精准地指定触发条件。
FAILOVER_HEALTH_CONDITION:可以配置主库出现如下异常场景时,主库立即关闭。
CORRUPTED_CONTROLFILE:表示主库写控制文件失败。
INACCESSIBLE_LOGFILE:表示主库写redo文件失败。
STUCK_ARCHIVER:表示主库因磁盘满导致归档失败。
DATAFILE_WRITE_ERRORS:表示主库写脏页失败。
DATAFILE_NO_SPACE:表示主库因磁盘满导致创建或写入数据文件失败。
SLICE_NO_SPACE:表示主库因磁盘满导致创建或写入slice文件失败。
条件故障切换的流程如下:
- 按需配置自动切换的条件。
-- 本文仅为示例,请根据实际需求配置
-- 设置主库发生redo写失败或者dbwr刷脏页写失败后,关闭主库并触发选举
ALTER SYSTEM SET FAILOVER_HEALTH_CONDITION = 'INACCESSIBLE_LOGFILE, DATAFILE_WRITE_ERRORS' scope = both;
-- 设置主库抛出数据库错误为311时,关闭主库并触发选举
ALTER SYSTEM SET FAILOVER_ERROR_CONDITION = '311' scope = both;
-- 设置主库抛出数据库错误为311并且对应的系统错误码为28时,关闭主库并触发选举
ALTER SYSTEM SET FAILOVER_ERROR_CONDITION = '311-28' scope = both;
Note:
仅当开启自动选主时,条件故障切换参数相关配置会在数据库为主库时生效,并且不会自动同步给备库。
一旦主库在运行中出现切换条件所指定的异常或错误,主库会尝试同步剩余redo日志给备库,然后立即关闭(终止YASDB进程)。
备库将触发心跳超时,发起选举,从中选出一个新的主库。
# 关闭自动选主
自动选主的开关由HA_ELECTION_ENABLED参数控制,如需关闭自动选主功能只需将该参数设置为FALSE即可。
为避免误触自动选主机制,关闭自动选主时应遵循先备后主的操作顺序。
# 单机高可用环境
单机高可用环境中,需要依次在所有备库和主库上修改HA_ELECTION_ENABLED的值。
-- 关闭自动选主应严格按照先备库后主库的操作顺序
-- 依次在备库1、备库2……备库n上操作
ALTER SYSTEM SET HA_ELECTION_ENABLED=FALSE;
-- 在主库上操作
ALTER SYSTEM SET HA_ELECTION_ENABLED=FALSE;
# 存算一体分布式高可用环境
存算一体分布式高可用环境中,可以直接指定组或指定节点修改HA_ELECTION_ENABLED的值。
-- 指定DN修改HA_ELECTION_ENABLED的值,对所有DN组生效
ALTER SYSTEM SET ha_election_enabled = FALSE SCOPE = BOTH TYPE = DN;
-- 指定MN修改HA_ELECTION_ENABLED的值,对所有MN组生效
ALTER SYSTEM SET ha_election_enabled = FALSE SCOPE = BOTH TYPE = MN;
-- 指定某个节点修改HA_ELECTION_ENABLED的值,仅对该节点生效
ALTER SYSTEM SET ha_election_enabled = FALSE SCOPE = BOTH NODE = 3-1;

