#自动选举配置

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

# 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
$ nohup yasdb 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;

开启归档示例

$ nohup yasdb 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=127.0.0.1:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=127.0.0.1:1689 scope=spfile;
--1789/1889为备机1/备机2的同步复制端口,1-2:1/1-3:1为备机1/备机2的节点ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=127.0.0.1:1789 NODE_ID=1-2:1' scope=both;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=127.0.0.1:1889 NODE_ID=1-3:1' scope=both;

--以下参数当主备机上路径完全一致时无须配置
--/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=127.0.0.1:1678 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=127.0.0.1:1789 scope=spfile;
--1689/1889为主机/备机2的同步复制端口,1-1:1/1-3:1为主机/备机2的节点ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=127.0.0.1:1689 NODE_ID=1-1:1' scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=127.0.0.1:1889 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=127.0.0.1:1888 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=127.0.0.1:1889 scope=spfile;
--1689/1789为主机/备机1的同步复制端口,1-1:1/1-2:1为主机/备机1的节点ID
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=127.0.0.1:1689 NODE_ID=1-1:1' scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_2='SERVICE=127.0.0.1:1789 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           

HA_ELECTION_TIMEOUT参数和HA_HEARTBEAT_INTERVAL参数支持在线调整,用户可以根据自身业务系统情况进行适当设置。

Warn

  • 在shutdown主机后,自动选举模式下可能会触发备机自动升主,如不想主机角色发生变化,应在执行shutdown之前手动关闭自动选举。
  • 关闭自动选举的顺序必须为先关闭备机的自动选举,再关闭主机的自动选举