#自动选举配置

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不支持开启自动降备功能时,进行备份恢复。