#自动选举配置
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所述配置基于安装过程使用了默认的安装参数,也可以在安装过程中通过调整安装参数,一次完成。
# Step1:主备节点准备
主备部署前,需要先进行主备节点上的数据库安装,请按安装部署所述步骤完成安装,且需注意如下事项:
- 主备节点的各项资源参数建议一致。
- 主备节点所安装的数据库版本必须一致。
- 主备节点安装过程中所定义的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;
# Step2:主节点建库
当对主节点执行了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;
# Step3:主备节点参数配置
同一主一备部署中的主备节点参数配置操作,其中,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;
# Step3:备节点初始化
同一主多备部署中的备节点初始化操作,可在备节点1和备节点2上分别执行,或由主节点发起并行build。
# Step4:部署后检查
同一主一备部署中的部署后检查操作。
# Step5:调整主备节点保护模式
查看主备节点的保护模式
对于新建的数据库,其默认的保护模式为最大性能模式,可在主备节点上分别执行以下查询:
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表示最大保护模式。
Note:
保护模式为MAXIMUM PERFORMANCE时,有时也可以保持主备数据一致性,并且旧主节点可以正常打开和同步新主节点信息,但是存在丢数据的风险,在自动选举的主备部署架构中,不建议使用该模式。
# Step6:打开主备节点自动选举
完成以上步骤后,在主节点关闭或者异常关机时,系统还不能实现在备节点间自动选举出一个副节点提升为新主节点,必须打开自动选举的开关后才能实现。
自动选举的开关由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集群启动后,从一个自动选举关闭的状态下开启自动选举时,切记先开启主节点的自动选举,再开启备节点的自动选举,否则容易发生备节点自动升主,导致双主。
# Step7:设置自动选举的心跳时间
自动选举功能依赖如下两个时间参数:
心跳超时时间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
# Step8:设置主节点在未收到半数备节点心跳响应时自动降备的功能
依赖参数:
- HA_ELECTION_LEADER_LEASE_ENABLED
该参数默认值为FALSE,需要由用户决定是否开启此功能。
当参数设置为TRUE时,下述情况中主节点会在心跳超时时间(HA_ELECTION_TIMEOUT)后自动降备:
处于最大保护模式下,主节点收到备节点心跳数<
QUORUM_SYNC_STANDBY中的syncNum
。处于非最大保护模式下,主节点收到备节点心跳数<
(N/2 +1)
。
其中N为所有节点(包含主节点)的数量,syncNum为用户定义的同步备数量。
可以通过语句查看:
--查看是否开启主节点自动降备功能
SHOW PARAMETER HA_ELECTION_LEADER_LEASE_ENABLED;
NAME VALUE
--------------------------------- ---------
HA_ELECTION_LEADER_LEASE_ENABLED FALSE
--开启主节点自动降备功能
ALTER SYSTEM SET HA_ELECTION_LEADER_LEASE_ENABLED=TRUE;
HA_ELECTION_TIMEOUT参数,HA_HEARTBEAT_INTERVAL参数以及HA_ELECTION_LEADER_LEASE_ENABLED参数支持在线调整,用户可以根据自身业务系统情况进行适当设置。
Warn:
- 在shutdown主节点后,自动选举模式下可能会触发备节点自动升主,如不想主节点角色发生变化,应在执行shutdown之前手动关闭自动选举。
- 关闭自动选举的顺序必须为先关闭备节点的自动选举,再关闭主节点的自动选举。
- 自动选举不支持QUORUM_SYNC_STANDBYS,REQUIRED_SYNC_STANDBYS参数指定备机名。
- YashanDB不支持开启自动降备功能时,进行备份恢复。