#自动选主配置
YashanDB主备高可用的自动选主配置是在一主多备部署(不能为级联备)的基础上,增加HA_ELECTION_ENABLED、NODE_ID、HA_ELECTION_TIMEOUT和HA_HEARTBEAT_INTERVAL这4个配置参数进行控制,将其扩展为用于自动选主的Raft集群架构。
其中,参数NODE_ID需要在建实例之前就已定义,且建实例之后不能修改。在Raft集群中,主库与备库之间的NODE_ID必须两两各不相同。(YashanDB默认安装下NODE_ID为1-1:1)
基于上述要求,Raft集群架构需要在安装产品前就已规划好按自动选主模式配置,或预设好参数以便日后扩展,而不能直接在一个未预设参数的已有一主多备架构上进行扩展。
Caution:
- 基于Raft选举算法规则,Raft集群节点数至少包括三个才能形成多数派,因此,在一主一备架构上扩展Raft集群将无效,即无法实现自动选主后的主备自动切换。如仍需实现一主一备的自动切换,请使用基于yasom的仲裁选主。
- 在存在级联备的环境中,配置自动选主可能会导致选举异常。
# 开启自动选主
以下按一主两备(主库、备库1、备库2)模式介绍自动选主配置过程。
# 步骤1:准备主备库
单机一主多备部署,请按安装部署所述的单机(主备)部署步骤完成安装,且需注意如下事项:
备库数量至少2个,且不要添加级联备。
主备库所安装的数据库版本必须一致,各项资源参数建议保持一致。
主备库安装过程中所定义的DATA目录应尽量保持一致。
查看数据库状态:
$ 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 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+------------------+--------------------------------+
| host0003 | db | 1-3:3 | 49582 | open | normal | standby | 192.168.1.4:1688 | /data/yashan/yasdb_data/db-1-3 |
+----------+-----------+--------+-------+-----------------+-----------------+---------------+------------------+--------------------------------+
# 步骤2:调整主备库保护模式
查看主备库的保护模式
对于新建的数据库,其默认的保护模式为最大性能模式,可在主备库上分别执行以下查询:
SELECT database_id,database_name,open_mode,database_role,protection_mode FROM V$DATABASE;
protection_mode字段值为MAXIMUM PERFORMANCE表示最大性能模式。
为了保证在任意节点故障后,选出来的新主不丢失已提交成功的事务,必须将主库和备库的保护模式均调整为最大保护模式,即MAXIMUM PROTECTION。
切换主备库的保护模式
在主库上,使用如下语句执行切换:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
主库的保护模式会随着心跳同步到备库,这可能需要一次心跳的时间。为了加快保护模式设置速度,可以在主库修改保护模式后,在备库上也执行此操作。
再次查看主备库的保护模式
在主备库上分别执行以下查询:
SELECT database_id,database_name,open_mode,database_role,protection_mode FROM V$DATABASE;
protection_mode字段值为MAXIMUM PROTECTION表示最大保护模式。
Caution:
保护模式不为MAXIMUM PROTECTION时,连续多次故障后,可能存在数据丢失风险。因此在自动选主的主备部署架构中,强烈建议使用最大保护模式。
# 步骤3:设置自动选主的心跳时间
自动选主功能依赖如下两个时间参数:
- 心跳超时时间HA_ELECTION_TIMEOUT
- 发送心跳的周期HA_HEARTBEAT_INTERVAL
当超过HA_ELECTION_TIMEOUT设置时间备库仍未收到心跳时,备库自动发起选举。
正常情况下,上述参数按照默认值配置,HA_ELECTION_TIMEOUT值为9,HA_HEARTBEAT_INTERVAL值为3,单位均为秒。支持在线修改这两个参数的配置,用户可根据自身业务系统情况自行设置。
Caution:
- 所有节点的心跳周期和心跳超时时间,需要配置为一样的,否则可能引起心跳超时误判,导致误切换。
-- 查看心跳超时时间
SHOW PARAMETER HA_ELECTION_TIMEOUT
NAME VALUE
------------------------- ---------
HA_ELECTION_TIMEOUT 9
-- 查看心跳发送周期
SHOW PARAMETER HA_HEARTBEAT_INTERVAL
NAME VALUE
------------------------- ---------
HA_HEARTBEAT_INTERVAL 3
# 步骤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,即不开启。
当参数设置为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参数配置数值。开启自动选主的场景下,节点的优先级越高,在保障数据安全的前提下会更优先成为主节点。当节点优先级为0时,该节点不会发起选举,即不会通过自动选主机制成为下一任主节点。支持在线修改该参数的配置,用户可根据自身业务系统情况自行设置。
该参数默认值为1。
-- 查看主备的节点优先级值
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;
# 关闭自动选主
自动选主的开关由HA_ELECTION_ENABLED参数控制,如需关闭自动选主功能只需将该参数设置为FALSE即可。
为避免误触自动选主机制,关闭自动选主时应遵循先备后主的操作顺序。
单机高可用环境中,需要依次在所有备库和主库上修改HA_ELECTION_ENABLED的值。
-- 关闭自动选主应严格按照先备库后主库的操作顺序
-- 依次在备库1、备库2……备库n上操作
ALTER SYSTEM SET HA_ELECTION_ENABLED=FALSE;
-- 在主库上操作
ALTER SYSTEM SET HA_ELECTION_ENABLED=FALSE;

