#自动选主配置

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)模式介绍自动选主配置过程。

Note

以下Step1 - 5所述配置基于安装过程使用了默认的安装参数,也可以在安装过程中通过调整安装参数,一次完成。

# 步骤1:准备主备库

主备部署前,需要先进行主备库安装,请按安装部署所述步骤完成安装,且需注意如下事项:

  • 主备库的各项资源参数建议一致。
  • 主备库所安装的数据库版本必须一致。
  • 主备库安装过程中所定义的DATA目录应尽量保持一致。
  • 产品安装时的NODE_ID参数必须设置,可将主库的NODE_ID设为1-1:1、备库1的NODE_ID设为1-2:1、备库2的NODE_ID设为1-3:1...,以确保NODE_ID各不相同。
  • YashanDB默认安装完成后会创建一个初始数据库,请使用DROP DATABASE语句删除该数据库。(主库可选执行,备库必须执行)
--登录初始数据库,安装后为open状态
$ yasql sys/sys

--重启至nomount状态
SQL> SHUTDOWN;
exit
$ yasboot cluster start -c yashandb -m nomount

--删除初始数据库
SQL> DROP DATABASE;

# 步骤2:主库建库

当对主库执行了Step1的最后一步操作时,需对其重新建库(指定归档模式),否则只需开启归档。

建库示例

CREATE DATABASE yashan
CHARACTER SET utf8
ARCHIVELOG
LOGFILE ('/home/yasdb/YASDB_DATA/dbfiles/redo1' size 2G BLOCKSIZE 512,
'/home/yasdb/YASDB_DATA/dbfiles/redo2' size 2G BLOCKSIZE 512,
'/home/yasdb/YASDB_DATA/dbfiles/redo3' size 2G BLOCKSIZE 512,
'/home/yasdb/YASDB_DATA/dbfiles/redo4' size 2G BLOCKSIZE 512)
UNDO TABLESPACE DATAFILE '?/dbfiles/undo' size 2G autoextend ON NEXT 256M MAXSIZE 64G
SWAP TABLESPACE TEMPFILE '?/dbfiles/swap' size 2G autoextend ON NEXT 256M MAXSIZE 64G
SYSTEM TABLESPACE DATAFILE 'system' size 128M MEMORY MAPPED
DEFAULT TABLESPACE DATAFILE '?/dbfiles/users' size 5G;

开启归档示例

$ yasboot cluster restart -c yashandb -m mount
$ yasql sys/sys
SQL> ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

# 步骤3:配置主备库参数

一主一备部署中的主备库参数配置操作,其中,ARCHIVE_DEST系列参数均需增加NODE_ID选项。

主库配置示例(LISTEN_ADDR和REPLICATION_ADDR参数重启数据库后生效,其他立即生效,ARCHIVE_DEST_XXX参数在REPLICATION_ADDR参数重启生效后再进行设置)

ALTER SYSTEM SET LISTEN_ADDR=192.168.1.2:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.2:1689 scope=spfile;
--1689为备库1/备库2的同步复制端口,1-2:1/1-3:1为备库1/备库2的节点ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.3:1689 NODE_ID=1-2:1' scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=192.168.1.4:1689 NODE_ID=1-3:1' scope=spfile;

--以下参数当主备库上路径完全一致时无须配置
--/home/yasdb/YASDB_DATA为主库路径,/home/db1/yashandb/yasdb_data为备库1路径,/home/db2/yashandb/yasdb_data为备库2路径
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/yasdb/YASDB_DATA'
scope=both; 
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/yasdb/YASDB_DATA'
scope=both; 
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'/home/db1/yashandb/yasdb_data','/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/yasdb/YASDB_DATA'
scope=both; 

备库1配置示例(重启数据库后生效)

ALTER SYSTEM SET LISTEN_ADDR=192.168.1.3:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.3:1689 scope=spfile;
--1689为主库/备库2的同步复制端口,1-1:1/1-3:1为主库/备库2的库ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.2:1689 NODE_ID=1-1:1' scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=192.168.1.4:1689 NODE_ID=1-3:1' scope=spfile;

--以下参数当主备库上路径完全一致时无须配置
--/home/yasdb/YASDB_DATA为主库路径,/home/db1/yashandb/yasdb_data为备库1路径,/home/db2/yashandb/yasdb_data为备库2路径
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data'
scope=spfile; 
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data'
scope=spfile; 
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data'
scope=spfile; 

备库2配置示例(重启数据库后生效)

ALTER SYSTEM SET LISTEN_ADDR=192.168.1.4:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.4:1689 scope=spfile;
--1689为主库/备库1的同步复制端口,1-1:1/1-2:1为主库/备库1的节点ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.2:1689 NODE_ID=1-1:1' scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=192.168.1.3:1689 NODE_ID=1-2:1' scope=spfile;

--以下参数当主备库上路径完全一致时无须配置
--/home/yasdb/YASDB_DATA为主库路径,/home/db1/yashandb/yasdb_data为备库1路径,/home/db2/yashandb/yasdb_data为备库2路径
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data'
scope=spfile; 
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data'
scope=spfile; 
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'/home/yasdb/YASDB_DATA','/home/db2/yashandb/yasdb_data','/home/db1/yashandb/yasdb_data','/home/db2/yashandb/yasdb_data'
scope=spfile; 

# 步骤4:初始化备库

一主多备部署中的备库初始化操作,可在备库1和备库2上分别执行,或由主库发起并行build。

# 步骤5:部署后检查

一主一备部署中的部署后检查操作。

# 步骤6:调整主备库保护模式

查看主备库的保护模式

对于新建的数据库,其默认的保护模式为最大性能模式,可在主备库上分别执行以下查询:

SELECT database_id,database_name,open_mode,database_role,protection_mode
FROM V$DATABASE;

protection_mode字段值为MAXIMUM PERFORMANCE表示最大性能模式。

Note

为确保主备Failover切换后:1.主备数据一致,备库不丢数据;2.旧主库以新备库角色可以正常打开,并能够正常同步新主库的数据。建议将主库和备库的保护模式均调整为最大保护模式,即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 PERFORMANCE时,在一定程度上能保持主备数据一致性,并且旧主库可以正常打开和同步新主库信息,但仍存在数据丢失风险。在自动选主的主备部署架构中,不建议使用该模式。

# 步骤7:开启主备库自动选主

完成以上步骤后,在主库关闭或者异常关机时,系统还不能实现在备库间自动选举出一个备库提升为新主库,必须打开自动选主的开关后才能实现。

自动选主的开关由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前先手动关闭自动选主,关闭顺序必须为先关闭备库的自动选主,再关闭主库的自动选主

# 步骤8:设置自动选主的心跳时间

自动选主功能依赖如下两个时间参数:

  • 心跳超时时间HA_ELECTION_TIMEOUT
  • 发送心跳的周期HA_HEARTBEAT_INTERVAL

当超过HA_ELECTION_TIMEOUT设置时间备库仍未收到心跳时,备库自动发起选举。

正常情况下,上述参数按照默认值配置,HA_ELECTION_TIMEOUT值为9,HA_HEARTBEAT_INTERVAL值为3,单位均为秒。支持在线修改这两个参数的配置,用户可根据自身业务系统情况自行设置。

--查看心跳超时时间
SHOW PARAMETER HA_ELECTION_TIMEOUT
NAME                      VALUE     
------------------------- --------- 
HA_ELECTION_TIMEOUT       9                                                                   

--查看心跳发送周期
SHOW PARAMETER HA_HEARTBEAT_INTERVAL
NAME                      VALUE     
------------------------- --------- 
HA_HEARTBEAT_INTERVAL     3           

# 步骤9:配置自动降备

自动降备用于控制主库未收到多数派备库心跳响应时是否进行主动降备,通过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;

Warn

自动降备功能开启时,不允许执行备份和恢复操作。

# 步骤10:配置节点优先级

节点的优先级,值越大表示其节点优先级越高,通过HA_ELECTION_PRIORITY参数配置数值。开启自动选主的场景下,节点的优先级越高,在保障数据安全的前提下会更优先成为主节点。当节点优先级为0时,该节点不会发起选举,即不会通过自动选主机制成为下一任主节点。支持在线修改该参数的配置,用户可根据自身业务系统情况自行设置。

该参数默认值为1。

--查看主备的节点优先级值
SHOW PARAMETER HA_ELECTION_PRIORITY;
NAME                               VALUE     
---------------------------------  --------- 
HA_ELECTION_PRIORITY               1                                                                             

--修改主备的节点优先级值
ALTER SYSTEM SET HA_ELECTION_PRIORITY=2;

# 步骤11:配置自动换主

自动换主用于控制主库发现高优先级备库时是否进行主备切换,通过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;