#共享集群一主一备配置

本文所述一主一备配置基于主集群已经部署完成,部署过程中可能需要重启集群。若主集群为正在使用的生产环境,请确保在可对其执行重启的时间段内进行主备部署。

# Step1:备集群准备

主备部署前,需要先进行备集群上的数据库安装,请按安装手册完成该共享集群的基础环境搭建,且需注意如下事项:

  • 备集群的各项资源参数建议与主集群一致。
  • 备集群所安装的数据库版本必须为与主集群一致的数据库版本。
  • 备集群安装过程中所定义的DBFILES目录应尽量与主集群保持一致,无法保持一致的情况下,必须设置路径转换参数,详见下面描述。
  • YashanDB默认安装完成后会创建一个初始数据库,需使用DROP DATABASE语句删除该数据库。
--连接备集群任一节点
$ yasql sys/sys

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

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

--逐一连接备集群的所有节点,并执行shutdown关闭数据库。
SHUTDOWN;
exit

--重新拉起集群,此时实例1为nomount状态
$ ycsctl start ycs &

# Step2:开启主集群归档

检查主集群归档是否打开,如未打开,需要按如下步骤将主集群调整为归档模式:

  1. 关闭主集群实例,然后选择任一节点拉起至mount状态,其他节点为nomount或者关闭状态。

  2. 调整数据库的归档模式 ALTER DATABASE ARCHIVELOG。

  3. 调整当前数据库为OPEN,然后逐一拉起其他节点至OPEN状态。

# Step3:主备集群参数配置

与主备部署相关的参数有:

  • LISTEN_ADDR:本机数据库的IP与监听端口,该参数在安装时已配置。
  • NODE_ID:各节点编号,该参数在创建节点时已配置,且不能重复,主要用于主备集群自动选主。
  • REPLICATION_ADDR:主集群下每个节点都需要配置,且每个节点的配置端口均不一样。
  • ARCHIVE_DEST_1:对端数据库的IP与同步复制端口(该类型的参数有32个,从ARCHIVE_DEST_1到 ARCHIVE_DEST_32,每个参数表示一个备集群的链路属性,所以一个主集群最多支持32个备集群),必须配置。主集群的每个节点都需要配置目标备集群的REPLICATION_ADDR,且主集群每个节点的该配置必须保持一致。
  • DB_FILE_NAME_CONVERT:对端到本机的数据文件转换路径,支持递归转换,主备数据文件路径不同时必须配置。
  • REDO_FILE_NAME_CONVERT:对端到本机的日志文件转换路径,支持递归转换,主备日志文件路径不同时必须配置。
  • HA_SSL_ENABLE(SSL_ENABLE):主备间SSL加密传输开关。当REPLICATION_ADDR和LISTEN_ADDR共享端口,主备加密传输参照SSL_ENABLE,否则参照HA_SSL_ENABLE; 主备之间的开关参数必须一致;当开启时,主备需要配置SSL_CERT_FILE/SSL_KEY_FILE/SSL_DH_PARAM_FILE参数,配置方式见数据库管理手册SSL连接配置

Note

递归转换:逐一设置文件路径转换非常繁琐且易出错,当主备文件路径上的某个节点开始往后的内容全部一致时,只需设置这个节点路径的转换参数,系统对具有相同父目录的文件或文件夹进行递归转换。

假设主集群和备集群的DBFILES目录分别为'+DG0/yashan/node_1'和'+DG0/yashan/node_2',主集群的数据文件有'+DG0/yashan/node_1/spc1/datafile1'和'+DG0/yashan/node_1/spc2/datafile2'。设置备集群的转换路径为"DB_FILE_NAME_CONVERT='+DG0/yashan/node_1', '+DG0/yashan/node_2'",那么备集群上创建的datafile1和datafile2将分别位于'+DG0/yashan/node_2/spc1/datafile1'和'+DG0/yashan/node_2/spc2/datafile2'。

在主集群下,所有的节点的以上配置项必须保持一致。

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

主集群所有节点基本配置如下:

--ARCHIVE_DEST_1 每个节点配置必须一致,指向的IP地址和端口包括备集群所有实例的IP和端口。
--NODE1
ALTER SYSTEM SET LISTEN_ADDR=192.168.1.2:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.2:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.2.2:1689,192.168.2.3:1689' scope=both;
--NODE2
ALTER SYSTEM SET LISTEN_ADDR=192.168.1.3:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.1.3:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.2.2:1689,192.168.2.3:1689' scope=both;

-- 以下参数当主备集群上路径完全一致时无须配置。
-- +DG0/yasdb/YASDB_DATA为主集群路径,+DG0/db1/yashandb/yasdb_data为备集群路径。
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=
'+DG0/db1/yashandb/yasdb_data','+DG0/yasdb/YASDB_DATA' scope=both; 
ALTER SYSTEM SET REDO_FILE_NAME_CONVERT=
'+DG0/db1/yashandb/yasdb_data','+DG0/yasdb/YASDB_DATA' scope=both; 
ALTER SYSTEM SET DB_BUCKET_NAME_CONVERT=
'+DG0/db1/yashandb/yasdb_data','+DG0/yasdb/YASDB_DATA' scope=both; 

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

--NODE1
ALTER SYSTEM SET LISTEN_ADDR=192.168.2.2:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.2.2:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.2:1689,192.168.1.3:1689' scope=spfile;
--NODE2
ALTER SYSTEM SET LISTEN_ADDR=192.168.2.3:1688 scope=spfile;
ALTER SYSTEM SET REPLICATION_ADDR=192.168.2.3:1689 scope=spfile;
ALTER SYSTEM SET ARCHIVE_DEST_1='SERVICE=192.168.1.2:1689,192.168.1.3:1689' scope=spfile;

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

Note

1.转换路径仅在当前节点角色为备集群时起作用。

2.转换路径如果设置不正确,可能会导致备集群找错文件或者误改文件。如果备集群所需要的文件路径找不到,备集群回放进程将挂起并上报告警,此时用户需手动执行shutdown abort关闭备集群数据库。

3.ARCHIVE_DEST_1一旦配置即生效,复制链路被占用且不允许修改,部署过程中如用户发现配置错误,需重新设置该参数时,直接修改将被提示YAS-02425错误,此时应该先将该参数设置为空,释放链路后再重新设为正确的值。

4.同一集群下所有节点的ARCHIVE_DEST_1必须保持一致。

5.共享集群主实例的确认方式请查阅附录

# Step4:备集群初始化

备集群的初始化,即对其进行与主集群的数据同步,YashanDB支持通过在线传输或备份恢复的方式进行数据同步(本文以在线传输为例)。

执行在线传输方式的初始化要求主集群为open状态,备集群为nomount状态(未建库)。

在线传输方式的工作流程为:

  1. 用户在主集群或备集群上发起BUILD DATABASE命令。
  2. 收到命令后,主集群将控制文件、数据文件、redo日志文件和归档日志文件等通过网络传输直接发送到备集群,不会生成临时备份文件,效率较高。
  3. 备集群根据收到的文件直接在线恢复。
  4. 备集群恢复完成之后,打开数据库。

备集群发起build示例

--以下操作均在备集群主实例上执行:

--检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SELECT CONNECTION,STATUS,PEER_ADDR,TRANSPORT_LAG,APPLY_LAG
FROM V$REPLICATION_STATUS;
 
--主备网络连接正常时,在备集群上执行在线同步操作
BUILD DATABASE;

--检查备集群的实例状态是否正常,STATUS应为OPEN
SELECT STATUS FROM V$INSTANCE;

--检查备集群的状态、打开模式和角色信息是否异常,STATUS应为NORMAL,OPEN_MODE应为READ_ONLY,DATABASE_ROLE应为STANDBY
SELECT STATUS, OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;

主集群发起build示例

--以下操作在主集群任一实例上执行:

--检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通,DATABASE_MODE应为STARTED
SELECT CONNECTION,STATUS,DATABASE_MODE
FROM V$ARCHIVE_DEST_STATUS
WHERE DEST_ID = 1;

--查询备集群的DB_UNIQUE_NAME
SELECT DB_UNIQUE_NAME FROM V$ARCHIVE_DEST WHERE DEST_ID = 1;

--发起build,standby1参数为备集群的DB_UNIQUE_NAME
BUILD DATABASE TO STANDBY (standby1);

--以下操作在备集群主实例上执行:

--检查备集群的实例状态是否正常,STATUS应为OPEN
SELECT STATUS FROM V$INSTANCE;

# Step5:部署后检查

备集群初始化后,需要检查主备集群的日志传输是否正常,及主备同步是否有延时,可在备集群主实例上执行如下操作检查:

1.查询V$INSTANCE视图,status为OPEN,表示备集群数据库正常开启。

2.查询V$DATABASE视图,status为NORMAL,log_mode为ARCHIVELOG,open_mode为READ_ONLY,database_role为STANDBY,表示备集群数据库已经创建成功,数据库运行正常且为归档模式,提供只读业务。

3.查询V$REPLICATION_STATUS视图,如果connection为CONNECTED,status为NORMAL,peer_mode为OPEN,peer_addr为主集群的IP,则主备同步正常;如果status为NEED REPAIR,表示同步有间隙,需要介质恢复。如果transport_lag与apply_lag的值均为0,表示备集群同步主集群的日志和自身应用日志均无延时情况,同步正常;如果不为0,尝试切换一两个日志,再看是否为0,否则需要重新初始化备集群。

SELECT * FROM V$INSTANCE;
SELECT database_id, database_name, status, log_mode, open_mode, database_role 
FROM V$DATABASE;
SELECT connection, status, peer_mode, peer_addr, transport_lag, apply_lag 
FROM V$REPLICATION_STATUS;

此外,还可以通过在主集群中创建表、插入数据,提交事务,然后在备集群查看表数据信息,确认主备集群数据同步是否正常。

# 附录:确认共享集群主实例

共享集群部署下,只要有在线的实例,YCS都会选举其中一个作为该集群的主实例,有若干种方式来获取主实例ID或检查一个实例是否是主实例:

1.使用ycsctl工具,在共享集群任一YCS在线的节点上执行ycsctl status命令,结果中的YasDB Master ID字段即为集群主实例ID。

2.使用yasboot工具,yasboot ycs系列命令能起到和ycsctl命令等价的效果。

3.查询V$INSTANCE视图,若INSTANCE_ROLE字段为MASTER_ROLE,表示该实例是主实例。