目录
DM的MPP主备,在普通的MPP系统基础上,引入主备守护机制,将MPP节点作为主库节点,增加备库作为备份节点,必要时可切换为主库代替故障节点工作,提高系统的可靠性和可用性。
一、环境说明
本文配置了两节点MPP,每个节点作为主库,与其备库组成一个守护组,因此需要配置两个守护组,取名分别为 GRP1、GRP2,主库名为GRP1_DM01和GRP2_DM22, 对应的备库实例名分别为GRP1_DM11/GRP1_DM02。
准备 3 台机器 A、B、C,A和B用来交叉部署实例,C用来部署监视器。其中A和B 配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机,C接入内部网络。A、B和C都安装了DM。具体规划如下:
机器名 | IP地址 | 初始状态 | 操作系统 |
A | 10.9.13.20 | 主库GRP1_DM01 备库GRP2_DM22 | linux kylin10 |
B | 10.9.13.21 | 主库GRP2_DM02 备库GRP1_DM11 | linux kylin10 |
C | 10.9.13.22 | 监视器 | linux kylin10 |
端口规划
实例名 | PORT_NUM | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT | MPP 实例序号 |
GRP1_DM01 | 5236 | 5243 | 10.9.13.20 | 61141 | 5254 | 1 |
GRP2_DM02 | 5236 | 5243 | 10.9.13.21 | 61141 | 5254 | 2 |
GRP1_DM11 | 5237 | 5244 | 10.9.13.21 | 61142 | 5255 | 对应主库GRP1_DM1 |
GRP2_DM22 | 5237 | 5244 | 10.9.13.20 | 61142 | 5255 | 对应主库GRP1_DM2 |
守护进程规划
组名 | 实例名 | 所在机器 |
GRP1 | GRP1_DM01 | 10.9.13.20 |
GRP1_DM11 | 10.9.13.21 | |
GRP2 | GRP2_DM02 | 10.9.13.21 |
GRP2_DM22 | 10.9.13.20 |
二、数据准备
2.1 GRP1初始化数据库
实例名:GRP1_DM01(A机器)
./dminit path=/home/dmdba/dm8/data DB_NAME=GRP1_DM01 INSTANCE_NAME=GRP1_DM01 PORT_NUM=5236
注册服务
su root
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dm8/data/GRP1_DM01/dm.ini -p GRP1_DM01
启动数据库
按照上述方法继续创建实例GRP1_DM11、GRP2_DM02、GRP2_DM22和相应服务,并启动服务
实例名:GRP1_DM11(B机器)
./dminit path=/home/dmdba/dm8_1/data DB_NAME=GRP1_DM11 INSTANCE_NAME=GRP1_DM11 PORT_NUM=5237
注册服务
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dm8_1/data/GRP1_DM11/dm.ini -p GRP1_DM11
启动数据库服务
2.2 GRP2初始化数据库
实例名:GRP2_DM02(B机器)
dminit PATH=/home/dmdba/dm8_1/data DB_NAME=GRP2_DM02 INSTANCE_NAME=GRP2_DM02 PORT_NUM=5236
注册服务
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dm8_1/data/GRP2_DM02/dm.ini -p GRP2_DM02
启动数据库
实例名:GRP2_DM22(A机器)
./dminit path=/home/dmdba/dm8/data DB_NAME=GRP2_DM22 INSTANCE_NAME=GRP2_DM22 PORT_NUM=5237
注册服务
./dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/dm8/data/GRP2_DM22/dm.ini -p GRP2_DM22
启动数据库
2.3 GRP1和GRP2主库配置归档
GRP1
GRP1_DM01
./disql SYSDBA/SYSDBA@localhost:5236
SQL> alter database mount;
SQL> alter database add archivelog 'DEST=/home/dmdba/dm8/data/GRP1_DM01/arch,TYPE=local,FILE_SIZE=128,space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
GRP1_DM11
./disql SYSDBA/SYSDBA@localhost:5237
SQL> alter database mount;
SQL> alter database add archivelog 'DEST=/home/dmdba/dm8_1/data/GRP1_DM11/arch,TYPE=local,FILE_SIZE=128,space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
GRP2
GRP2_DM02
./disql SYSDBA/SYSDBA@localhost:5236
SQL> alter database mount;
SQL> alter database add archivelog 'DEST=/home/dmdba/dm8_1/data/GRP2_DM02/arch,TYPE=local,FILE_SIZE=128,space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
GRP2_DM22
./disql SYSDBA/SYSDBA@localhost:5237
SQL> alter database mount;
SQL> alter database add archivelog 'DEST=/home/dmdba/dm8/data/GRP1_DM11/arch,TYPE=local,FILE_SIZE=128,space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
2.4 主备库做备份还原
2.4.1 GRP1做主备库备份还原
1. 正常关闭主库
2. 进行脱机备份
./dmrman ctlstmt="backup database '/home/dmdba/dm8/data/GRP1_DM01/dm.ini' full to db_full_bak01 backupset '/home/dmdba/dm8/data/GRP1_DM01/db_full_bak01'"
3. 拷贝备份文件到备库所在机器
scp -r /home/dmdba/dm8/data/GRP1_DM01/db_full_bak01 dmdba@10.9.13.21:/home/dmdba/dm8_1/data/GRP1_DM11/
4. 执行脱机数据库还原与恢复
./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dm8_1/data/GRP1_DM11/dm.ini' FROM BACKUPSET '/home/dmdba/dm8_1/data/GRP1_DM11/db_full_bak01'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dm8_1/data/GRP1_DM11/dm.ini' FROM BACKUPSET '/home/dmdba/dm8_1/data/GRP1_DM11/db_full_bak01'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dm8_1/data/GRP1_DM11/dm.ini' UPDATE DB_MAGIC"
2.4.2 GRP2做主备库备份还原
1. 正常关闭主库
2. 进行脱机备份
./dmrman ctlstmt="backup database '/home/dmdba/dm8_1/data/GRP2_DM02/dm.ini' full to db_full_bak02 backupset '/home/dmdba/dm8_1/data/GRP2_DM02/db_full_bak02'"
3. 拷贝备份文件到备库所在机器
scp -r /home/dmdba/dm8_1/data/GRP2_DM02/db_full_bak02 dmdba@10.9.13.20:/home/dmdba/dm8/data/GRP2_DM22/
4. 执行脱机数据库还原与恢复
./dmrman CTLSTMT="RESTORE DATABASE '/home/dmdba/dm8/data/GRP2_DM22/dm.ini' FROM BACKUPSET '/home/dmdba/dm8/data/GRP2_DM22/db_full_bak02'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dm8/data/GRP2_DM22/dm.ini' FROM BACKUPSET '/home/dmdba/dm8/data/GRP2_DM22/db_full_bak02'"
./dmrman CTLSTMT="RECOVER DATABASE '/home/dmdba/dm8/data/GRP2_DM22/dm.ini' UPDATE DB_MAGIC"
三、环境配置
3.1 修改dm.ini配置
修改GRP1和GRP2的主库与备库的如下参数:
INSTANCE_NAME = GRP1_DM01
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
MPP_INI = 1 #启用 MPP 配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
3.2 配置dmmal.ini
配置 MAL 系统,要注意以下几点:
- 各主备库的 dmmal.ini 配置必须完全一致
- MAL_HOST 使用内部网络IP
- MAL_PORT 与 dm.ini 中 PORT_NUM 使用不同的端口值
- MAL_DW_PORT 是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_DM01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.9.13.20 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.9.13.20 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5254 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5243 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = GRP2_DM02 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.9.13.21 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.9.13.21 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5254 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5243 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = GRP1_DM11 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.9.13.21 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61142 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.9.13.21 #实例的对外服务 IP 地址
MAL_INST_PORT = 5237 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5255 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5244 #实例监听守护进程 TCP 连接的端口
[MAL_INST4]
MAL_INST_NAME = GRP2_DM22 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 10.9.13.20 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61142 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 10.9.13.20 #实例的对外服务 IP 地址
MAL_INST_PORT = 5237 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 5255 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5244 #实例监听守护进程 TCP 连接的端口
3.3 配置dmarch.ini
3.3.1主库GRP1_DM01配置:
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_DM11 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dm8/data/GRP1_DM01/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.3.2 主库GRP2_DM02配置
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP2_DM22 #实时归档目标实vi 例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dm8/data/GRP2_DM02/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.3.3 备库GRP1_DM11配置
当前实例GRP1_DM11是备库,当守护系统出现故障时,GRP1_DM11切换为新的主库,
GRP1_DM01会切换为新的备库,需要向 GRP1_DM01 同步数据 , 因此实时归档的 ARCH_DEST配置为GRP1_MPP_EP01。
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_DM01 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dm8/data/GRP1_DM01/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.3.4 备库GRP2_DM22配置
除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。当前实例GRP2_MPP_EP22是备库,守护系统配置完成后,可能在各种故障处理中,GRP2_MPP_EP22切换为新的主库,正常情况下GRP2_MPP_EP02 会切换为新的备库,需要向GRP2_MPP_EP02同步数据,因此实时归档的ARCH_DEST配置为GRP2_MPP_EP02。
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP2_DM02 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /home/dmdba/dm8_1/data/GRP2_DM02/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~4294967294M
3.4 配置dmmpp.ctl
首先配置dmmpp.ini再利用dmctlcvt工具转换成.ctl文件,各主备库的dmmpp.ini文件配置内容一致,dmmpp.ini文件配置如下:
[service_name1]
mpp_seq_no = 0
mpp_inst_name = GRP1_DM01
[service_name2]
mpp_seq_no = 1
mpp_inst_name = GRP2_DM02
利用dmctlcvt工具将其转化为.ctl文件
./dmctlcvt TYPE=2 SRC=/home/dmdba/dm8/data/GRP1_DM01/dmmpp.ini DEST=/home/dmdba/dm8/data/GRP1_DM01/dmmpp.ctl
3.5 以mount方式启动数据库,修改设置
3.5.1 GRP1
(1)主库GRP1_DM01
./dmserver /home/dmdba/dm8/data/GRP1_DM01/dm.ini mount
设置OGIID
启动命令行工具 DIsql,使用 MPP 类型为 LOCAL 方式,登录主库设置 OGUID 值。
./disql SYSDBA/SYSDBA@localhost:5236#"{mpp_type=local}"
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(45330);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式
SQL>alter database primary;
(2)备库GRP1_DM11
./dmserver /home/dmdba/dm8_1/data/GRP1_DM11/dm.ini mount
./disql SYSDBA/SYSDBA@localhost:5237
设置OGIID
启动命令行工具 DIsql,登录主库设置 OGUID 值。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(45330);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>ALTER DATABASE STANDBY;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
3.5.2 GRP2
(1)主库GRP2_DM02
./dmserver /home/dmdba/dm8_1/data/GRP2_DM02/dm.ini mount
设置OGIID
启动命令行工具disql,使用MPP类型为local方式登录主库设置OGUID值。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(45331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
修改数据库模式
SQL>alter database primary;
(2)备库 GRP2_DM22
./dmserver /dm/data/EP02/DAMENG/dm.ini mount
登录实例设置 OGUID 值。
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(45331);
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
登录实例修改数据库为 Standby 模式:
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>ALTER DATABASE STANDBY;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
3.6 配置 dmwatcher.ini
一般来说,每个单独的实例都是使用一个单独的守护进程守护。比如前面的实时主备和读写分离集群的配置。
本例中,由于同一台机器上有不同组的两个实例,我们可以只配置一个守护进程,同时守护两个实例。
3.6.1 A机器上配置 dmwatcher.ini
配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45330 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP01/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一OGUID值
INST_INI = /dm/data/EP02/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
3.6.2 B机器上配置 dmwatcher.ini
配置为全局守护类型,使用自动切换模式。
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45330 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP01/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dm8_1/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
[GRP2]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dm/data/EP02/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /home/dmdba/dm8_1/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
四、启动守护进程
分别启动 A、B 机器上的守护进程,例如:
./dmwatcher /dm/data/EP01/DAMENG/dmwatcher.ini
守护进程启动后,进入Startup状态,此时实例都处于Mount状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例open,并切换为open状态。
五、启动监视器
启动监视器:
./dmmonitor /dm/data/dmmonitor.ini
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入help命令,查看各种命令说明使用。
至此 MPP 实时主备搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行show命令,可以监控到所有实例都处于open状态,所有守护进程也都处于 open 状态,即为正常运行状态。
更多问题欢迎到达梦云适配社区提问哦!首页 | 达梦云适配中心 (dameng.com)