实时主备集群标准化部署+故障切换测试
1主备集群(2节点)规划
1.1服务器IP规划
类别 | 实例名 | 服务器地址 | 心跳IP |
---|---|---|---|
主库 | ZB1 | 192.168.11.128 | 10.10.1.128 |
备库 | ZB2 | 192.168.11.129 | 10.10.1.129 |
1.2端口规划
名称 | 端口 |
---|---|
PORT_NUM | 5236 |
MAL_PORT | 7336 |
MAL_DW_PORT | 7536 |
MAL_INST_DW_PORT | 7436 |
MAL_INST_PORT | 5236 |
注意:上述IP地址对应的服务器端口要求双向互通,监视器心跳IP要求和主备服务器心跳IP在同一网段。
1.3目录规划
目录 | 路径 |
---|---|
安装目录 | /home/dmdba/dmdbms |
数据文件目录 | /home/dmdba/dbdata/dmdata |
备份目录 | /home/dmdba/dbbak/dmbak |
归档目录 | /home/dmdba/dbarch/dmarch |
2.集群部署
2.1.数据库软件安装
可参考我之前的博文:DM数据库安装及启动教程(Linux超详细版)
注意:两台服务器都需要安装
2.2初始化实例
2个节点都有实例初始化,执行以下命令:
主机ZB1:
[dmdba@LH01 ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@LH01 bin]$./dminit path=/home/dmdba/dbdata/dmdata page_size=32 log_size=1024 instance_name=ZB1
开启服务
[dmdba@ZB1 bin]$ cp service_template/DmService dmserverd
[dmdba@ZB1 bin]$ vim dmserverd
INI_PATH=/home/dmdba/dbdata/dmdata/DAMENG/dm.ini
[dmdba@ZB1 bin]$ dmserverd start
开机自启配置
[root@ZB1 ~]# cd /home/dmdba/dmdbms/bin
[root@ZB1 bin]# cp dmserverd /etc/init.d/
[root@ZB1 bin]# chkconfig --add dmserverd
[root@ZB1 bin]# chkconfig --list
备机ZB2:
[dmdba@ZB2 ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@ZB2 bin]$ ./dminit path=/home/dmdba/dbdata/dmdata page_size=32 log_size=1024 instance_name=ZB2
开启服务
[dmdba@ZB2 bin]$ cp service_template/DmService dmserverd
[dmdba@ZB2 bin]$ vim dmserverd
INI_PATH=/home/dmdba/dbdata/dmdata/DAMENG/dm.ini
[dmdba@ZB2 bin]$ dmserverd start
开机自启配置
[root@ZB2 ~]# cd /home/dmdba/dmdbms/bin
[root@ZB2 bin]# cp dmserverd /etc/init.d/
[root@ZB2 bin]# chkconfig --add dmserverd
[root@ZB2 bin]# chkconfig --list
2.3数据库参数优化
主备机前台启动实例,出现system is ready后即为启动完成
[dmdba@ZB1 bin]$ ./dmserver /home/dmdba/dbdata/dmdata/DAMENG/dm.ini
[dmdba@ZB2 bin]$ ./dmserver /home/dmdba/dbdata/dmdata/DAMENG/dm.ini
登录数据库执行以下脚本
脚本文件百度网盘自取:
链接:https://pan.baidu.com/s/1WttHVgBR8DABQYI1oWf8xg?pwd=taux
提取码:taux
[dmdba@ZB1 bin]$ ./disql SYSDBA/SYSDBA@192.168.11.128:5236
SQL> start /home/dmdba/dm.sql
[dmdba@ZB2 bin]$ ./disql SYSDBA/SYSDBA@192.168.11.129:5236
SQL> start /home/dmdba/dm.sql
2.4脱机备份主机数据库
在主机ZB1上执行以下命令,确认主库dmap服务已启动:
ps -ef|grep dmap
若未启动,则先启动 DMAP 服务,使用dmdba用户切换到安装目录的 bin 下执行以下命令:
./DmAPService start
若已启动,则执行以下命令进行脱机备份
[dmdba@ZB1 bin]$ ./dmserverd stop
[dmdba@ZB1 bin]$ ./dmrman use_ap=2
[dmdba@ZB1 bin]$backup database '/home/dmdba/dbdata/dmdata/DAMENG/dm.ini' backupset '/home/dmdba/dbbak/dmbak/bakfull';
2.5脱机还原备机数据库
将备份的文件/home/dmdba/dbbak/dmbak/bakfull拷贝到备库服务器上。
[dmdba@ZB1 dmbak]# scp -r bakfull/ dmdba@192.168.11.129:/home/dmdba/dbbak/dmbak
在备机ZB2上,使用 dmrman 工具还原备库,dmdba 用户执行:
[dmdba@ZB2 dmbak]$ cd /home/dmdba/dmdbms/bin
[dmdba@ZB2 bin]$ ./dmserverd stop
[dmdba@ZB2 bin]$ ./dmrman
##执行restore
RMAN> restore database '/home/dmdba/dbdata/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/dbbak/dmbak/bakfull';
##执行recover
RMAN> recover database '/home/dmdba/dbdata/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/dbbak/dmbak/bakfull';
##执行recover update db_magic
RMAN> recover database '/home/dmdba/dbdata/dmdata/DAMENG/dm.ini' update db_magic;
2.6配置文件修改
2.6.1修改dm.ini参数
在ZB1和ZB2上分别修改dm.ini参数值:
vi /dmdata/DAMENG/dm.ini
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2.6.2配置归档配置文件 dmarch.ini
在ZB1和ZB2上分别修改dmarch.ini参数值:
[dmdba@ZB1 DAMENG]$ vi /home/dmdba/dbdata/dmdata/DAMENG/dmarch.ini
[dmdba@ZB2 DAMENG]$ vi /home/dmdba/dbdata/dmdata/DAMENG/dmarch.ini
##注意:如果没有dmarch.ini需要新建
主机ZB1上添加以下内容:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
aRCH_DEST = ZB2 #实时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dbarch/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
备机ZB2上添加以下内容:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
aRCH_DEST = ZB1 #实时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dbarch/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
2.6.3配置MAL系统配置文件 dmmal.ini
在实例目录下新建文件 dmmal.ini,执行以下命令。
[dmdba@ZB1 DAMENG]$ vi /home/dmdba/dbdata/dmdata/DAMENG/dmmal.ini
##注意:主备库2个节点文件内容要相同,内容如下:
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 15
[MAL_INST1]
MAL_INST_NAME = ZB1
MAL_HOST = 10.10.1.128
MAL_PORT = 7336
MAL_INST_HOST = 192.168.11.128
MAL_INST_PORT = 5236
MAL_DW_PORT = 7536
MAL_INST_DW_PORT = 7436
[MAL_INST2]
MAL_INST_NAME = ZB2
MAL_HOST = 10.10.1.129
MAL_PORT = 7336
MAL_INST_HOST = 192.168.11.129
MAL_INST_PORT = 5236
MAL_DW_PORT = 7536
MAL_INST_DW_PORT = 7436
2.6.4配置守护进程配置文件 dmwatcher.ini
在实例目录下新建文件 dmwatcher.ini,执行以下命令:
vi /home/dmdba/dbdata/dmdata/DAMENG/dmwatcher.ini
##注意:主备库2个节点文件内容相同(由于实例路径的原因),内容如下:
[GRP_DW]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /home/dmdba/dbdata/dmdata/DAMENG/dm.ini # dm.ini 配置文件>路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserverd #命令行方式启动
2.6.5修改主备库状态和oguid
修改主库oguid和数据库状态,在ZB1上执行以下命令
(1)主库mount方式后台启动
在ZB1上目录/dmdbms/bin/service_template拷贝DmService文件到/ dmdbms/bin目录下改名为dmserverd,然后修改dmserverd中INI_PATH为主库dm.ini路径(/dmdata/DAMENG/dm.ini),修改START_MODE为mount,保存修改后,执行命令:
./dmserverd start #启动主库数据库后台服务
(2)使用disql工具连接主库
[dmdba@ZB1 bin]$ ./disql SYSDBA/SYSDBA@192.168.11.128:5236
(3)修改oguid
SQL> sp_set_oguid(453331);
(4)修改数据库模式为primary
SQL> alter database primary;
修改备库oguid和数据库状态,在ZB2上执行以下命令
(1)备库mount方式后台启动
在ZB2上目录/dmdbms/bin/service_template拷贝DmService文件到/ dmdbms/bin目录下改名为dmserverd,然后修改dmserverd中INI_PATH为主库dm.ini路径(/dmdata/DAMENG/dm.ini),修改START_MODE为mount,保存修改后,执行命令:
./dmserverd start #启动主库数据库后台服务
(2)使用disql工具连接备库
[dmdba@ZB2 bin]$ ./disql SYSDBA/SYSDBA@192.168.11.129:5236
(3)修改oguid
sp_set_oguid(453331);
(4)修改数据库模式为standby
alter database standby;
如果不慎配成了primary,解决办法如下:
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> alter database standby;
就可以了
2.6.6修改后台启动脚本
(1)守护进程后台启动脚本
在ZB1和ZB2上的目录/dmdbms/bin/service_template拷贝DmWatcherService文件到/ dmdbms/bin目录下,然后修改DmWatcherService中 INI_PATH为ZB1和ZB2指定守护进程配置文件dmwatcher.ini的路径(比如/ dmdata/DAMENG/dmwatcher.ini)。
[root@ZB1 dmdbms]# cp ./bin/service_template/DmWatcherService ./bin/DmWatcherService
[root@ZB1 bin]# vi DmWatcherService
INI_PATH=/home/dmdba/dbdata/dmdata/DAMENG/dmwatcher.ini
(2)监视器进程后台脚本
在要部署的监视服务器ZB2上的/dmdbms/bin/service_template拷贝DmMonitorService到/dmdbms/bin目录下,然后修改DmMonitorService中INI_PATH为监视器配置文件dmmonitor.ini路径(比如/ dmdata/DAMENG/dmmonitor.ini).
[dmdba@ZB2 DAMENG]$ cd /home/dmdba/dmdbms/bin
[dmdba@ZB2 bin]$ cp ./service_template/DmMonitorService DmMonitorService
[dmdba@ZB2 bin]$ vi DmMonitorService
INI_PATH=/home/dmdba/dbdata/dmdata/DAMENG/dmmonitor.ini
[dmdba@ZB2 bin]$ cd /home/dmdba/dbdata/dmdata/DAMENG/
[dmdba@ZB2 DAMENG]$ vi dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /home/dmdba/dbdata/dmdata/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 200 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 1024 #不限定日志文件总占用空间
[GRP_DW]
MON_INST_OGUID = 453331 #组 GRP_DW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_DW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 10.10.1.128:7536
MON_DW_IP = 10.10.1.129:7536
2.6.7配置sql日志
ZB1和ZB2切换到/dmdata/DAMENG/目录下,执行vi sqllog.ini(记录1.5s以上sql),修改内容如下:
[dmdba@ZB1 bin]$ cd /home/dmdba/dbdata/dmdata/DAMENG/
[dmdba@ZB1 DAMENG]$ vi sqllog.ini
BUF_TOTAL_SIZE = 10240
BUF_SIZE = 1024
BUF_KEEP_CNT = 6
[SLOG_ALL]
FILE_PATH = /sqllog
PART_STOR = 1
SWITCH_MODE = 2
SWITCH_LIMIT = 512
ASYNC_FLUSH = 1
FILE_NUM = 10
ITEMS = 0
SQL_TRACE_MASK = 7:14:15:22:24:25:26:27:28
MIN_EXEC_TIME = 0
USER_MODE = 0
USERS =
备注:SQL_TRACE_MASK请按实际需求配置。如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过SQL> SP_REFRESH_SVR_LOG_CONFIG();就会生效。
2.7启动集群
(1)启动守护进程
dmdba 用户切换到数据库安装目录的 bin 下执行以下命令(主备库都执行):
[dmdba@ZB1 bin]$ ./DmWatcherService start
[dmdba@ZB2 bin]$ ./DmWatcherService start
守护进程启动后,会将 Mount 的实例 Open。
(2)启动监视器进程
建议配置在第三台独立的服务器上(需安装和主备相同 版本的DM 数据库软件(不必初始化实例),且与主备心跳网络端口开放),守护进程配置为自动切换时,必须配置确认监视器。
使用执行以下命令,启动监视器。
[dmdba@ZB2 bin]$ ./DmMonitorService start
启动后到 /dmdbms/log查找监视器日志,其中守护进程状态 WSTATUS 为 OPEN,实例状态 ISTATUS 为 OPEN,归档类型 RTYPE 为 TIMELY,归档状态 RSTAT 为VALID。
注意:数据库日常运行情况下,监视器保持后台运行,一旦数据库有异常,可打印出监视器日志,帮助工程师分析。如果需要实时监测,可以临时关掉后台进程,改成前台启动或者重新配置一个监视器前台启动(总共可以配置8个非确认监视器):
用dmdba用户执行以下命令,前台启动监视器:
[dmdba@ZB2 bin]$ ./dmmonitor /home/dmdba/dbdata/dmdata/DAMENG/dmmonitor.ini
输入 show 命令查看集群状态:
其中守护进程状态 WSTATUS 为 OPEN,实例状态 ISTATUS 为 OPEN,归档类型 RTYPE 为 TIMELY,归档状态 RSTAT 为VALID。
(3)disql 客户端验证
使用 disql 客户端登录主库,创建测试表,插入数据,执行以下命令:
[dmdba@ZB1 bin]$./disql SYSDBA/SYSDBA@192.168.11.128:5236
SQL 提示符下执行以下命令:
SQL> create table t1(id int);
操作已执行
已用时间: 160.022(毫秒). 执行号:600.
SQL> insert into t1 values(1);
影响行数 1
已用时间: 37.799(毫秒). 执行号:601.
SQL> commit;
操作已执行
使用 disql 客户端登录备库,查询测试表验证,执行以下命令:
[dmdba@ZB1 bin]$./disql SYSDBA/SYSDBA@192.168.11.129:5236
SQL 提示符下执行以下命令:
SQL>select * from t1;
查看数据是否正常同步。
2.8制定备份策略
备份与单机相同(主库上备份)。
SP_INIT_JOB_SYS(1);
---全备:
call SP_CREATE_JOB('dbbak',1,0,'',0,0,'',0,'bak');
call SP_JOB_CONFIG_START('dbbak');
call SP_ADD_JOB_STEP('dbbak', 'full_bak', 6, '01040000/dbbak/dmbak', 3, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_STEP('dbbak', 'delbak', 0, 'call SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dbbak/dmbak'');
call SF_BAKSET_REMOVE_BATCH(''DISK'',NOW()-7,NULL,NULL);', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('dbbak', 'bak_time', 1, 2, 1, 64, 0, '00:30:00', NULL, '2022-03-28 11:02:45', NULL, '');
call SP_JOB_CONFIG_COMMIT('dbbak');
---增备:
call SP_CREATE_JOB('increbak',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('increbak');
call SP_ADD_JOB_STEP('increbak', 'incre_bak', 6, '11040000/dbbak/dmbak|/dbbak/dmbak', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('increbak', 'incre_time', 1, 2, 1, 63, 0, '00:30:00', NULL, '2022-03-10 11:34:42', NULL, '');
call SP_JOB_CONFIG_COMMIT('increbak');
2.9问题:
2.9.1 code=-6010, oguid or group_name mismatch
[monitor] 2022-10-10 09:25:43: dmmonitor(mid:1665365142) create link to dmwatcher(10.10.1.129:7536) error, code=-9402, please check configuration!!!
[monitor] 2022-10-10 09:25:43: dmmonitor(mid:1665365142) create link to dmwatcher(10.10.1.129:7536) error, code=-6010, oguid or group_name mismatch, please check configuration!!!
分析:配置文件dmwatcher.ini与dmmonitor.ini配置文件中的组名[GRP_DW]不一致造成的。
2.9.2集群状态中主库状态是挂起
解决办法:修改监控配置文件
[dmdba@ZB2 bin]$ vi /home/dmdba/dbdata/dmdata/DAMENG/dmmonitor.ini
将MON_DW_CONFIRM =1 #修改为确认监视器模式(0为普通,1为确认)
3.切换测试
3.1确认数据库守护和监控状态
(1)主库
[dmdba@ZB1 ~]$ ps -ef | grep dms
[dmdba@ZB1 ~]$ ps -ef | grep dmw
(2)备库
[dmdba@ZB2 ~]$ ps -ef | grep dms
[dmdba@ZB2 ~]$ ps -ef | grep dmw
[dmdba@ZB2 bin]$ ps -ef | grep dmm
3.2手动切换主备库
查询监视情况
ZB1为集群主库,ZB2为集群备库,主备集群状态正常。
不用exit退出监视器,直接输入以下命令登录监视器进行切换
login
用户名:SYSDBA
密码:
[monitor] 2022-10-10 19:25:08: 登录监视器成功!
switchover GRP_DW.ZB2
切换之后show可以看见ZB2备库的状态变为了PRIMARY,而主库ZB1则变为了STANDBY。切换成功!
3.3主备集群故障切换测试
3.3.1主库停守护
[dmdba@ZB1 bin]$ ./DmWatcherService stop
Stopping DmWatcherService: [ OK ]
监视器监控到主库ZB1异常,并将ZB2备库切换为主库。
主库ZB1重启守护之后,监视器显示ZB1重新成为主库,ZB2成为备库
3.3.2主库停数据库服务
[dmdba@ZB1 bin]$ ./dmserverd stop
Stopping dmserverd: [ OK ]
停掉主库ZB1数据库服务后,ZB2仍然是备库,但监视器显示主库ZB1已经SHUTDOWN关机。
重启主库服务后,ZB1为主库,ZB2为备库
3.3.3备库停守护
当数据库守护停止时,监视器监控不到备库信息
备库重启守护之后,备库重新加入集群
3.3.4备库停服务
监视器监控到备库异常
重启备库服务,监视器收到备库信息,备库重新加入到集群当中。
达梦在线服务平台: https://eco.dameng.com