DM7一主两备数据库搭建以及故障演练

背景:
DM7常见的数据守护是一主一备2台数据库,某些特殊场景需要用到一主两备3台数据库来提升数据安全。该篇文章主要介绍一主两备数据库的搭建方法以及故障切换测试。

一、环境
服务器ip 数据库状态 内存
10.111.77.79 主库 31G
10.111.77.80 备库 31G
10.111.77.81 备库 31G

数据库安装包DMInstall.bin

二、部署一主两备(79/80/81):
2.1、分别在3台服务器上安装数据库软件
cd /opt
[dmdba@YNKJ-XZZHGLXT7779 opt]$ ./DMInstall.bin -i

2.2、在10.111.77.79上初始化数据库实例
[dmdba@YNKJ-XZZHGLXT7779 bin]$ pwd
/dmdata1/dmdbms/bin
[dmdba@YNKJ-XZZHGLXT7779 bin]$ ./dminit path=/dmdata1 db_name=TEST instance_name=YNZHTEST page_size=16 extent_size=16
initdb V7.6.1.38-Build(2019.12.05-116618)ENT
db version: 0x7000a
file dm.key not found, use default license!
License will expire on 2020-12-05
log file path: /dmdata1/TEST/TEST01.log
log file path: /dmdata1/TEST/TEST02.log
write to dir [/dmdata1/TEST].
create dm database success. 2020-08-07 15:04:58

2.3、前台启动数据库
[dmdba@YNKJ-XZZHGLXT7779 bin]$ ./dmserver /dmdata1/TEST/dm.ini
file dm.key not found, use default license!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.1.38-Build(2019.12.05-116618)ENT startup…
License will expire on 2020-12-05
ckpt lsn: 0
ndct db load finished
ndct fill fast pool finished
set EP[0]'s pseg state to inactive
iid page’s trxid = 1
NEXT TRX ID = 2
pseg recv finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
trx: 2 purged 1 pages
trx: 21 purged 1 pages
trx: 22 purged 1 pages
trx: 23 purged 1 pages
trx: 24 purged 1 pages
trx: 35 purged 1 pages
trx: 155 purged 1 pages
trx: 172 purged 1 pages
trx: 173 purged 1 pages
trx: 174 purged 1 pages
trx: 175 purged 1 pages
trx: 176 purged 1 pages
trx: 177 purged 1 pages
trx: 179 purged 1 pages
trx: 181 purged 1 pages
trx: 184 purged 1 pages
trx: 190 purged 1 pages
trx: 200 purged 1 pages
trx: 208 purged 16 pages
trx: 213 purged 1 pages
trx: 214 purged 1 pages
trx: 215 purged 1 pages
trx: 216 purged 1 pages
trx: 217 purged 1 pages
trx: 218 purged 1 pages
trx: 219 purged 1 pages
trx: 220 purged 1 pages
trx: 221 purged 1 pages
trx: 222 purged 1 pages
trx: 223 purged 1 pages
trx: 224 purged 1 pages
trx: 225 purged 1 pages
trx: 226 purged 1 pages
trx: 227 purged 1 pages
trx: 262 purged 1 pages
trx: 264 purged 1 pages
trx: 265 purged 1 pages
trx: 266 purged 1 pages
trx: 271 purged 10 pages
trx: 298 purged 1 pages
trx: 299 purged 1 pages
trx: 300 purged 1 pages
trx: 301 purged 1 pages
trx: 307 purged 1 pages
trx: 309 purged 1 pages
trx: 311 purged 1 pages
trx: 316 purged 1 pages
trx: 321 purged 1 pages
trx: 326 purged 1 pages
trx: 328 purged 1 pages
trx: 331 purged 1 pages
trx: 333 purged 1 pages
trx: 339 purged 1 pages
trx: 340 purged 1 pages
trx: 351 purged 4 pages
trx: 360 purged 1 pages
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
SYSTEM IS READY.

2.4、后台启动脚本制作

[dmdba@YNKJ-XZZHGLXT7779 root]$ ./dm_service_installer.sh help
必须以 root 身份执行此脚本!
[dmdba@YNKJ-XZZHGLXT7779 root]$ su - root
Password:
[root@YNKJ-XZZHGLXT7779 ~]# cd /dmdata1/dmdbms/script/root/
[root@YNKJ-XZZHGLXT7779 root]# ls
dm_service_installer.sh dm_service_uninstaller.sh root_installer.sh
[root@YNKJ-XZZHGLXT7779 root]# ./dm_service_installer.sh help
请设置参数-t或-s
[root@YNKJ-XZZHGLXT7779 root]# ./dm_service_installer.sh -t dmserver -i /dmdata1/TEST/dm.ini -p d
移动服务脚本文件(/dmdata1/dmdbms/bin/DmServiced 到 /etc/rc.d/init.d/DmServiced)
创建服务(DmServiced)完成
[root@YNKJ-XZZHGLXT7779 root]# exit
logout
[dmdba@YNKJ-XZZHGLXT7779 root]$ service DmServiced start
DmServiced service is not running.
Starting DmServiced: [ OK ]

[dmdba@YNKJ-XZZHGLXT7779 bin]$ ./disql SYSDBA/SYSDBA:5237
服务器[LOCALHOST:5237]:处于普通打开状态
登录使用时间: 6.867(毫秒)
disql V7.6.1.38-Build(2019.12.05-116618)ENT
SQL>
2.5、拷贝79数据库文件到80/81
5.1 关闭10.111.77.79
service DmServiced stop
5.2拷贝10.111.77.79的数据库文件到80
Scp -r /dmdata1/TEST dmdba@10.111.77.80:/dmdata1
Scp -r /dmdata1/TEST dmdba@10.111.77.81:/dmdata1

2.6、修改配置文件dm.ini
Vi /dmdata1/TEST dm.ini
10.111.77.79
实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = YNZH01
PORT_NUM = 5236 #数据库实例监听端口
DW_PORT = 33141 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
10.111.77.80
实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = YNZH02
PORT_NUM = 5236 #数据库实例监听端口
DW_PORT = 33141 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
10.111.77.81
实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过 16
INSTANCE_NAME = YNZH03
PORT_NUM = 5236 #数据库实例监听端口
DW_PORT = 33141 #守护环境下,监听守护进程连接端口
DW_ERROR_TIME = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
HA_INST_CHECK_FLAG = 1 #检测是否多个实例进程同时启动
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息

2.7、修改配置文件dmarch.ini
Vi /dmdata1/TEST/dmarch.ini
10.111.77.79
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = YNZH02 #实时归档目标实例名
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = YNZH03 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 150000 #单位 Mb, 0 表示无限制,范围 1024~4294967294M
ARCH_WAIT_APPLY=0
10.111.77.80
[root@YNKJ-XZ-ZHGLXT7780 bin]# cat /dmdata/YNZH/dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = YNZH01
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME
ARCH_DEST = YNZH03
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 150000
ARCH_WAIT_APPLY=0
10.111.77.81
[dmdba@YNKJ-XZ-ZHGLXT7781 YNZH]$ cat dmarch.ini
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = YNZH02 #实时归档目标实例名
[ARCHIVE_REALTIME2]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = YNZH01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/dmarch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 150000 #单位 Mb, 0 表示无限制,范围 1024~4294967294M

2.8、修改配置文件dmmal.ini
Vi /dmdata1/TEST/dmmal.ini
10.111.77.79
[dmdba@YNKJ-XZZHGLXT7779 YNZH]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = YNZH01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.111.77.79 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.111.77.79 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = YNZH02
MAL_HOST = 10.111.77.80
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.80
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
[MAL_INST3]
MAL_INST_NAME = YNZH03
MAL_HOST = 10.111.77.81
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.81
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
10.111.77.80
[dmdba@YNKJ-XZZHGLXT7779 YNZH]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = YNZH01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.111.77.79 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.111.77.79 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = YNZH02
MAL_HOST = 10.111.77.80
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.80
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
[MAL_INST3]
MAL_INST_NAME = YNZH03
MAL_HOST = 10.111.77.81
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.81
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
10.111.77.81
[dmdba@YNKJ-XZZHGLXT7779 YNZH]$ cat dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = YNZH01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.111.77.79 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.111.77.79 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = YNZH02
MAL_HOST = 10.111.77.80
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.80
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141
[MAL_INST3]
MAL_INST_NAME = YNZH03
MAL_HOST = 10.111.77.81
MAL_PORT = 61141
MAL_INST_HOST = 10.111.77.81
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141

2.9、修改配置文件dmwatcher.ini
Vi /dmdata1/TEST/dmwatcher.ini
10.111.77.79
[dmdba@YNKJ-XZZHGLXT7779 YNZH]$ cat dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/YNZH/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
10.111.77.80
[dmdba@YNKJ-XZ-ZHGLXT7780 YNZH]$ cat dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/YNZH/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
10.111.77.81
[dmdba@YNKJ-XZ-ZHGLXT7781 YNZH]$ cat dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/YNZH/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

2.10、制作dmwatcher.ctl
10.111.77.79
Cd /opt/dmdbms
./dmctlcvt TYPE=3 SRC=/dmdata1/TEST/dmwatcher.ini DEST=/dmdata1/TEST
10.111.77.80
Scp /dmdata1/TEST/GRP1/dmwatcher.ctl dmdba@10.111.77.80:/dmdata1/TEST
10.111.77.81
Scp /dmdata1/TEST/GRP1/dmwatcher.ctl dmdba@10.111.77.81:/dmdata1/TEST

2.11、设置OGUID
10.111.77.79
SQL>sp_set_oguid(453331);
10.111.77.80
SQL>sp_set_oguid(453331);
10.111.77.81
SQL>sp_set_oguid(453331);

2.12、修改数据库模式
10.111.77.79
SQL>ALTER DATABASE PRIMARY;
10.111.77.80
SQL>ALTER DATABASE STANDBY;
10.111.77.81
SQL>ALTER DATABASE STANDBY;

2.13、配置dmmonitor.ini
选择其中一台配置即可
[dmdba@YNKJ-XZZHGLXT7779 bin]$ cat dmmonitor.ini
MON_DW_Confirm = 0 #确认监视器模式
MON_LOG_PATH = /opt/dmdb/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 4096 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组GRP1的唯一OGUID值
#以下配置为监视111.142.80:52141 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.111.77.79:52141
MON_DW_IP = 10.111.77.80:52141
MON_DW_IP = 10.111.77.81:52141
DM7一主两备数据库搭建以及故障演练

六、空闲状态主备之间切换机制验证
6.1手动切换验证
主备切换时间10S左右。可以指定切换到任意一台为主库。

切换前状态如下:
DM7一主两备数据库搭建以及故障演练

手动切换至YNZH02状态如下:
DM7一主两备数据库搭建以及故障演练

手动切换至YNZH03状态如下:
DM7一主两备数据库搭建以及故障演练

手动切换至YNZH01状态如下:
DM7一主两备数据库搭建以及故障演练

6.2故障自动切换
6.2.1、模拟故障,强杀主库进程
DM7一主两备数据库搭建以及故障演练

自动切换消息
DM7一主两备数据库搭建以及故障演练

自动拉起故障实例
DM7一主两备数据库搭建以及故障演练

6.2.2、强杀备库YNZH02
DM7一主两备数据库搭建以及故障演练

自动重启故障实例
DM7一主两备数据库搭建以及故障演练

6.2.3、模拟主机故障,关闭主机服务器
DM7一主两备数据库搭建以及故障演练

49服务器起来后,实例重新加入
DM7一主两备数据库搭建以及故障演练

6.2.4、模拟任一备库故障,关闭备库服务器
DM7一主两备数据库搭建以及故障演练

重启81服务器后,实例自动加入
DM7一主两备数据库搭建以及故障演练

上一篇:MySQL锁等待与死锁问题分析


下一篇:修改MySQL表varchar类型 字段长度锁表情况分析