DM MPP大规模并行交叉主备集群部署
-
简介
MPP 主备就是在 MPP 集群的基础上,为每一个 MPP 节点配置一套实时主备系统,这些实时主备系统一起构成了 MPP 主备系统。MPP 主备系统包含多个守护进程组,每个守护进程组都是一个相对独立的实时主备系统,具备实时主备的基本功能,可以进行主备切换、备库接管等操作。
MPP 主备的主要目的是为 DM MPP 集群提供数据可靠性保障,备库只做数据容灾、备份,MPP 备库并不是 MPP 集群的一部分,只是某个 MPP 节点(主库)的镜像。MPP 备库不参与 MPP 操作,与其他 MPP 备库之间也没有任何关系,MPP 备库只能以单节点方式提供只读服务,但不提供全局的 MPP 只读服务。
MPP 主备系统中,一个守护进程 dmwatcher 可以监控、管理多个守护进程组的数据库实例。一般来说,一台物理机器上,可以部署 1 个 MPP 节点的主库和多个其他 MPP 节点的备库,充分利用硬件资源,节省投资。Global 守护类型的 MPP 主备库需要在 dm.ini 中配置 MPP_INI 为 1,并且 MPP 主备库的本地数据文件目录下都需要有 dmmpp.ctl 文件,如果 Global 守护类型的备库没有上述配置,守护进程和监视器无法正常使用,守护进程会切换到 Shutdown 状态,监视器上无法正常执行命令,会打印配置不一致的提示信息。
下图以三个 MPP 节点,每个节点配备两个备库为例,说明 MPP 主备系统的结构。
图1-1 DM MPP主备图解说明
-
部署环境
表2‑1 部署环境
系统版本 |
Centos7.9 |
CPU型号 |
Intel(R) i5-7200U CPU (2核) |
磁盘空间 |
40G |
内存大小 |
2G |
表2‑2 磁盘规划
数据 |
/dev/mapper/vg_dm-lv_dmdata |
备份 |
/dev/mapper/vg_dm-lv_dmbak |
归档 |
/dev/mapper/vg_dm-lv_arch |
表2‑3 目录规划
数据库软件安装目录 |
/home/dmdba/dmdbms |
实例安装目录 |
/dmdata |
归档存放目录 |
/dmdata/arch |
备份存放目录 |
/dmdata/dmbak/ |
表2‑4 IP端口规划
实例名 |
IP |
MAL端口 |
系统监听端口 |
实例本地的守护进程监听端口 |
实例监听守护进程端口 |
mpp1 |
192.168.254.144 |
5236 |
7336 |
7436 |
7536 |
mpp2 |
192.168.254.147 |
5236 |
7336 |
7436 |
7536 |
mpp11(mpp1备库) |
192.168.254.147 |
5237 |
7337 |
7437 |
7537 |
mpp22(mpp2备库) |
192.168.254.144 |
5237 |
7337 |
7437 |
7537 |
-
DM MPP大规模并行交叉主备集群部署
-
安装DM 8并初始化实例
-
安装过程本文略
//mpp1初始化 ./dminit path=/dmdata DB_NAME=mpp1 INSTANCE_NAME=mpp1 PORT_NUM=5236 //mpp22初始化 ./dminit path=/dmdata DB_NAME=mpp22 INSTANCE_NAME=mpp22 PORT_NUM=5237 //mpp2初始化 ./dminit path=/dmdata DB_NAME=mpp2 INSTANCE_NAME=mpp2 PORT_NUM=5236 //mpp11初始化 ./dminit path=/dmdata DB_NAME=mpp11 INSTANCE_NAME=mpp11 PORT_NUM=5237
//将初始化后的数据库需要先启动一次,出现system is ready后停止数据库 cd /home/dmdba/dmdbms/bin ./dmserver /dmdata/mpp1/dm.ini ./dmserver /dmdata/mpp22/dm.ini ./dmserver /dmdata/mpp2/dm.ini ./dmserver /dmdata/mpp11/dm.ini //查询是否都开启了DmAPService服务,若没有开启则手动开启./DmAPService start ps -ef|grep dmap |
-
数据库归档配置
//mpp1下 SQL> alter database mount; SQL> alter database add archivelog 'dest=/dmdata/arch/mpp1 ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240'; SQL> alter database archivelog; SQL> alter database open;
//mpp22下 SQL> alter database mount; SQL> alter database add archivelog 'dest=/dmdata/arch/mpp22 ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240'; SQL> alter database archivelog; SQL> alter database open;
//mpp2下 SQL> alter database mount; SQL> alter database add archivelog 'dest=/dmdata/arch/mpp2 ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240'; SQL> alter database archivelog; SQL> alter database open;
//mpp11下 SQL> alter database mount; SQL> alter database add archivelog 'dest=/dmdata/arch/mpp11 ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240'; SQL> alter database archivelog; SQL> alter database open; |
-
主备库做备份还原
//主库mpp1下进行备份 cd /home/dmdba/dmdbms/bin ./dmrman RMAN> backup database '/dmdata/mpp1/dm.ini' backupset '/home/dmdba/bakfull';
////主库mpp2下进行备份 RMAN> backup database '/dmdata/mpp2/dm.ini' backupset '/home/dmdba/bakfull2';
//备份成功后退出RMAN模式进行SCP发送备份到备库mpp11与mpp22下 scp -r /home/dmdba/bakfull dmdba@备库ip:/home/dmdba |
图3‑1 主库数据备份成功
图3‑2 通过SCP发送成功
//备库mpp11上进行数据恢复 mkdir -p /home/dmdba/bakfull cd /home/dmdba/dmdbms/bin ./dmrman RMAN> restore database '/dmdata/mpp11/dm.ini' from backupset '/home/dmdba/bakfull'; RMAN> recover database '/dmdata/mpp11/dm.ini' from backupset '/home/dmdba/bakfull'; RMAN> recover database '/dmdata/mpp11/dm.ini' update db_magic;
//备库mpp22上进行数据恢复 mkdir -p /home/dmdba/bakfull cd /home/dmdba/dmdbms/bin ./dmrman RMAN> restore database '/dmdata/mpp22/dm.ini' from backupset '/home/dmdba/bakfull'; RMAN> recover database '/dmdata/mpp22/dm.ini' from backupset '/home/dmdba/bakfull'; RMAN> recover database '/dmdata/mpp22/dm.ini' update db_magic; |
图3‑3 备库数据恢复成功
-
修改dm.ini文件
vi /dmdata/mpp*/dm.ini //mpp1修改以下参数 INSTANCE_NAME = mpp1 PORT_NUM = 5236 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2
//mpp22修改以下参数 INSTANCE_NAME = mpp22 PORT_NUM = 5237 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2
//mpp2修改以下参数 INSTANCE_NAME = mpp2 PORT_NUM = 5236 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 //mpp11修改以下参数 INSTANCE_NAME = mpp11 PORT_NUM = 5237 MAL_INI = 1 ARCH_INI = 1 MPP_INI = 1 ALTER_MODE_STATUS = 0 ENABLE_OFFLINE_TS = 2 |
-
配置归档配置文件dmarch.ini
vi /dmdata/mpp*/dmarch.ini //主库mpp1内容 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = mpp11 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch/mpp1 ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 5120 //备库mpp11内容 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = mpp1 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch/mpp11 ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 5120 //主库mpp2内容 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = mpp22 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch/mpp2 ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 5120 //备库mpp22内容 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = mpp2 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch/mpp22 ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 5120 |
-
配置dmmal参数文件
//根据需求修改对应参数,MAL_DW_PORT参数和dmmonitor.ini文件内相匹配 vi /dmdata/mpp*/dmmal.ini //主备两库都一致
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 [MAL_INST1] MAL_INST_NAME = mpp1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.254.144 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 7336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.254.144 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 7436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 7536 #实例监听守护进程 TCP 连接的端口
[MAL_INST2] MAL_INST_NAME = mpp2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.254.147 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 7336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.254.147 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 7436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 7536 #实例监听守护进程 TCP 连接的端口
[MAL_INST3] MAL_INST_NAME = mpp11 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.254.147 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 7337 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.254.147 #实例的对外服务 IP 地址 MAL_INST_PORT = 5237 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 7437 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 7537 #实例监听守护进程 TCP 连接的端口
[MAL_INST4] MAL_INST_NAME = mpp22 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.254.144 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 7337 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.254.144 #实例的对外服务 IP 地址 MAL_INST_PORT = 5237 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 7437 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 7537 #实例监听守护进程 TCP 连接的端口 |
-
配置dmmpp.ctl
//首先配置dmmpp.ini再利用dmctlcvt工具转换成.ctl文件,在主库mpp1和mpp2中分别配置ini后转换ctl发送至各自备库 [service_name1] mpp_seq_no = 0 mpp_inst_name = mpp1 [service_name2] mpp_seq_no = 1 mpp_inst_name = mpp2
./dmctlcvt TYPE=2 SRC=/dmdata/mpp1/dmmpp.ini DEST=/dmdata/mpp1/dmmpp.ctl
./dmctlcvt TYPE=2 SRC=/dmdata/mpp2/dmmpp.ini DEST=/dmdata/mpp2/dmmpp.ctl |
-
mount方式启动数据库,修改设置
//mpp1需使用 MPP 类型为LOCAL方式登陆,否则报错 //mpp1下配置 ./disql SYSDBA/SYSDBA@localhost:5236#"{mpp_type=local}" SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID (112233); SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); SQL> ALTER DATABASE PRIMARY;
//mpp11下配置 ./disql SYSDBA/SYSDBA@localhost:5237 SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID (112233); 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);
//mpp2下配置 ./disql SYSDBA/SYSDBA@localhost:5236 SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID (445566); SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); SQL> ALTER DATABASE PRIMARY;
//mpp22下配置 ./disql SYSDBA/SYSDBA@localhost:5237 SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); SQL> SP_SET_OGUID (445566); 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‑4 不使用local登陆方式报错
-
配置守护进程dmwatcher.ini
//一般来说,每个单独的实例都是使用一个单独的守护进程守护。比如前面的实时主备和读写分离集群的配置。本例中,由于同一台机器上有不同组的两个实例,我们可以两台机子各自只配置一个守护进程,同时守护两个实例。 vi /dmdata/mpp1/dmwatcher.ini //根据需求修改相关参数,主备两库一致 [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = MANUAL #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 112233 #守护系统唯一 OGUID 值 INST_INI = /dmdata/mpp1/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 [GRP2] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = MANUAL #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 445566 #守护系统唯一OGUID值 INST_INI = /dmdata/mpp22/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
vi /dmdata/mpp2/dmwatcher.ini //根据需求修改相关参数,主备两库一致 [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = MANUAL #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 112233 #守护系统唯一 OGUID 值 INST_INI = /dmdata/mpp11/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 [GRP2] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = MANUAL #自动切换模式 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 445566 #守护系统唯一OGUID值 INST_INI = /dmdata/mpp2/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
//配置完成后,可以进行注册守护进程服务的服务,然后分别启动mpp1,mpp2的守护进程,守护进程启动后,进入Startup状态,此时实例都处于Mount状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例open,并切换为open状态。 ./dm_service_installer.sh -t dmwatcher -p mpp1 -watcher_ini /dmdata/mpp1/dmwatcher.ini ./dm_service_installer.sh -t dmwatcher -p mpp2 -watcher_ini /dmdata/mpp2/dmwatcher.ini ./DmWatcherServicempp1 start ./DmWatcherServicempp2 start |
-
配置监视器文件
//在一个集群中,确认监视器只有唯一一个且在集群外的机器上部署,称为仲裁机器,非确认监视器可以有很多个,dmmonitor.ini为确认监视器,dmmonitor0.ini为非确认监视器 // MON_DW_CONFIRM的值为0时为非确认监视器 // MON_LOG_PATH监视器日志文件存放路径 // MON_LOG_INTERVAL每隔 60 s 定时记录系统信息到日志文件 //MON_LOG_FILE_SIZE每个日志文件最大 32 MB // MON_LOG_SPACE_LIMIT不限定日志文件总占用空间 // MON_INST_OGUID需与dmwatcher.ini一致 // MON_DW_IP与 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT对应 cd /home/dmdba/dmdbms/bin vi /home/dmdba/dmdbms/bin/dmmonitor0.ini
MON_DW_CONFIRM = 0 MON_LOG_PATH = /home/dmdba/dmdbms/log MON_LOG_INTERVAL = 60 MON_LOG_FILE_SIZE = 32 MON_LOG_SPACE_LIMIT = 0 [GRP1] MON_INST_OGUID = 112233 MON_DW_IP = 192.168.254.144:7436 MON_DW_IP = 192.168.254.147:7437 [GRP2] MON_INST_OGUID = 445566 MON_DW_IP = 192.168.254.147:7436 MON_DW_IP = 192.168.254.144:7437 ./dmmonitor /home/dmdba/dmdbms/bin/dmmonitor0.ini //添加后执行此指令启动监控器,并在监控器下输入show查看集群状态
//手动切换主备 login switchover 组名 .切换的实例名 |
图3‑5 监视器启动成功
图3‑6 MPP集群验证
-
配置Sql日志
//所有节点都需要修改,FILE_PATH按需求修改 vi /dmdata/mpp*/sqllog.ini
BUF_TOTAL_SIZE = 10240 BUF_SIZE = 1024 BUF_KEEP_CNT = 6 [SLOG_ALL] FILE_PATH = ../log PART_STOR = 1 SWITCH_MODE = 2 SWITCH_LIMIT = 512 ASYNC_FLUSH = 1 FILE_NUM = 5 ITEMS = 0 SQL_TRACE_MASK = 2:3:25 MIN_EXEC_TIME = 1500 USER_MODE = 0 USERS = |
-
主备集群重启
//优化了dm.ini参数或者需要重启都需要严格按照此顺序 关闭确认监视器:systemctl stop DmMonitorServiceconfirm 关闭备库守护进程:systemctl stop DmWatcherServicerw 关闭主库守护进程:systemctl stop DmWatcherServicerw 关闭主库实例:systemctl stop DmServicerw 关闭备库实例:systemctl stop DmServicerw 启动备库实例:systemctl start DmServicerw 启动主库实例:systemctl start DmServicerw 启动主库守护进程:systemctl start DmWatcherServicerw 启动备库守护进程:systemctl start DmWatcherServicerw 启动确认监视器:systemctl start DmMonitorServiceconfirm |
技术社区地址:https://eco.dameng.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下