注册
达梦 DM8 DPC 分布式计算集群规范部署:单副本四实例实战与验收
专栏/技术分享/ 文章详情 /

达梦 DM8 DPC 分布式计算集群规范部署:单副本四实例实战与验收

waytoofar 2026/09/04 89 0 0
摘要

达梦 DM8 DPC 分布式计算集群

产品概述与技术架构

达梦分布式处理集群 DMDPC 是武汉达梦数据库股份有限公司在 DM 数据库管理系统基础上提供的新一代分布式数据库集群产品。官方资料将其定位为同时支持 OLTP 与 OLAP 的分布式数据库,可通过数据分布、分布式执行和横向扩展提高容量与处理能力;在 MP、BP 采用多副本时,可使用 RAFT 机制形成相应的副本可用性能力。

完整 DMDPC 由 SP、BP、MP 三类节点组成。三类角色的职责不得混写:

角色 官方职责边界 数据边界 连接原则
SP(SQL Processor) 对外提供数据库服务,接收 SQL,生成分布式执行计划,拆分、调度子任务并汇总结果 不存放普通用户表数据和 MP 元数据 正常业务连接 SP
BP(Business Processor) 存储实际用户数据,接收 SP 下发的子计划,执行子任务并返回结果 存放用户数据 BP 模式不作为普通业务入口
MP(Metadata Processor) 保存元数据、处理 DDL、维护 DPC 注册目录 保存元数据,不保存普通用户表数据 用于集群管理与必要维护,不承载大 SQL

DM8 分布式计算集群(DPC)技术架构

应用/客户端 SP 计划生成节点<br>接收请求、拆分和调度 ⇄ 元数据服务 MP 元数据服务器<br>存储字典并处理 DDL
↓ 子任务调度 ↓ 向 SP/BP 提供元数据
BP 节点1<br>存储并执行子任务 ← 调度 BP 节点2<br>存储并执行子任务 调度 → BP 扩展节点<br>按项目规划增配

图 1 DM8 分布式计算集群(DPC)技术架构。完整 DMDPC 由 SP、BP、MP 三类节点组成;MP 与 BP 可按项目要求配置多副本,具体组网与端口以所安装版本手册和部署规划为准。

RAFT、BP 组与副本模型

  • RAFT 是 DMDPC 中 MP、BP 多副本管理和选举的基础单位;单副本部署也需要在 MP 中建立相应 RAFT 逻辑对象。

  • BP 组是 BP RAFT 的逻辑集合,可被分布式存储规划引用。

  • 一个 DMDPC 可有多个 SP 和多个 BP,逻辑上只有一个 MP;该 MP 可由一个或多个 MP 实例构成一个 MP RAFT。

  • SP 为单副本;MP 与 BP 可部署为单副本或多副本。

  • 多副本 RAFT 的实例数应为大于 1 的奇数,官方上限为 9,并需要配置 dmarch.ini、XMAL/RAFT 通信和选举参数。

部署规划与实施基线

单主机四实例实操基线

项目 实操值 说明
主机名 dpc-host 四个实例位于同一 Linux 主机
主机地址 10.36.25.** 内外通信地址在实验中相同
安装用户/组 dmdba / dinstall 数据库进程不以 root 运行
数据库执行码 /dmdata/dsp/dmdpc_test/bin 四实例共用,生产是否独立执行码需评审
数据根目录 /dmdata/dpc_single/dpc_single 实验专用目录
SP1 DB 2****,AP 2**** /dmdata/dpc_single/dpc_single/sp1
BP1 DB 2****,AP 2**** /dmdata/dpc_single/dpc_single/bp1
BP2 DB 2****,AP 2**** /dmdata/dpc_single/dpc_single/bp2
MP DB 2****,AP 2**** /dmdata/dpc_single/dpc_single/mp
MP 服务 10.36****:***** 写入所有实例的 mp.ini
BP 组 BG_1 包含 RAFT_1、RAFT_2
RAFT MP_RAFT、RAFT_1、RAFT_2、RAFT_SP1 本实操均为单副本

端口与网络矩阵

节点 数据库端口 PORT_NUM AP 端口 AP_PORT_NUM MP 服务端口 用途
SP1 27*** 27*** 访问 279** 业务连接、计划生成与任务调度
BP1 27*** 27*** 访问 279** 数据存储与子任务执行
BP2 27*** 27*** 访问 279** 数据存储与子任务执行
MP 27*** 27*** 监听 279** 元数据与集群注册

PORT_NUM 和 AP_PORT_NUM 的有效范围为 1024~65534。同一主机上的端口必须唯一;MP_PORT 不得与任一 AP 端口冲突。跨主机部署时还必须按源地址、目的地址和端口建立双向放行矩阵,不能用关闭防火墙替代访问控制。

目录与存储规划

命令(text)

/dmdata/dsp/dmdpc_test/bin                 数据库执行码
/dmdata/dpc_single/dpc_single/
├── sp1/DAMENG                             SP1 库目录
├── bp1/DAMENG                             BP1 库目录
├── bp2/DAMENG                             BP2 库目录
├── mp/DAMENG                              MP 库目录
└── log                                    实验过程日志目录,不作为生产服务标准

生产环境应分别规划软件、MP/SP 数据、BP 数据、联机日志、归档、备份、审计、临时文件和 core 目录。BP 数据文件、联机日志和备份不应全部位于同一故障域。容量必须包含增长量、临时空间、日志、归档、备份和恢复演练空间,不能照搬本实验 128 MB 的功能测试数据文件。

生产多主机与多副本边界

官方允许在测试环境把多种角色部署在同一主机;生产环境应按业务规模和故障域重新设计:

  • MP/SP 与 BP 的 CPU、内存、磁盘和网络资源应隔离,避免相互争用。

  • MP、BP 如需高可用,应跨主机或跨故障域部署奇数个副本,并单独规划 RAFT/XMAL 网络和归档。

  • 多 MP 使用分节形式的 mp.ini;配置节名必须与 MP 实例名一致,扩缩容后需同步更新所有节点。

  • 多副本启动、选主、切换、扩缩容和退出方式与单副本不同,必须执行官方对应章节,不能直接套用本文命令。

  • 若项目要求滚动升级,官方 FAQ 要求实例使用独立执行码。本实验共用执行码,只适合作为学习和功能验证基线。

  • 生产主机数、副本数、网络地址、端口、归档路径、服务名和资源规格均为 【待项目确认】。

官方实施顺序

  • 初始化 MP、BP、SP 实例。

  • 在全部实例的库目录中配置一致的 mp.ini。

  • 先启动 MP,并保持 MP 在线。

  • 登录 MP,先注册当前 MP,再注册 BP、BP 组与 SP;BP、SP 必须在第一次启动前完成注册。

  • 查询 DPC 系统表核对注册关系。

  • 启动 BP 和 SP;两者之间没有强制先后顺序。

  • 连接 SP 验证所有实例 OPEN/NORMAL,并执行分布式功能验收。

  • 退出时严格按 SP→BP→MP 的顺序正常关闭。

部署前检查

检查操作系统、时间与资源

执行用户:root 或具备只读检查权限的系统管理员。

命令(bash)

hostnamectl cat /etc/os-release uname -a timedatectl free -h df -hT /dmdata lsblk -f sysctl vm.overcommit_memory

通过标准:操作系统、CPU 架构与安装介质一致;所有节点时间同步;内存和磁盘满足项目容量;数据卷可写且空间充足;vm.overcommit_memory=0。官方给出的 2 GB 只是最低环境要求,不能作为生产容量结论。

生产数据盘应按设备类型和官方运维建议检查调度器,设备名必须替换为现场值:

命令模板(执行前替换占位符)(bash)

cat /sys/block/【数据盘设备名待确认】/queue/scheduler

检查用户、资源限制与目录权限

命令(bash)

id dmdba getent group dinstall su - dmdba -c 'umask; ulimit -a'

通过标准:dmdba 存在且主组为 dinstall;文件句柄、进程数、文件大小和虚拟内存限制符合当前版本安装手册和项目基线。修改 /etc/security/limits.conf 后必须重新登录再验证。

检查程序、版本和授权

命令(bash)

test -x /dmdata/dsp/dmdpc_test/bin/dminit && echo '[OK] dminit' test -x /dmdata/dsp/dmdpc_test/bin/dmserver && echo '[OK] dmserver' test -x /dmdata/dsp/dmdpc_test/bin/disql && echo '[OK] disql' ls -l /dmdata/dsp/dmdpc_test/bin/dminit \ /dmdata/dsp/dmdpc_test/bin/dmserver \ /dmdata/dsp/dmdpc_test/bin/disql find /dmdata/dsp/dmdpc_test -maxdepth 2 -type f -name 'dm.key' -ls

必须记录完整版本、补丁、构建时间、介质 SHA-256、授权文件位置、有效期和功能项。实操日志曾提示未找到 dm.key 并使用默认短期授权,该状态只能用于实验;正式部署不得把默认或试用授权作为生产许可。

检查端口占用

执行用户:dmdba。

命令(bash)

for p in 2**** 2**** 2**** 2**** 2**** 2**** 2**** 2**** 2**** do if ss -lntH | awk '{print $4}' | grep -Eq ":${p}$"; then echo "[BUSY] $p" else echo "[FREE] $p" fi done

通过标准:初始化前九个端口全部为 [FREE]。如出现 BUSY,先识别占用进程和业务归属,再修改端口规划;不得直接终止未知进程。

图 2  DPC 实验端口组在初始化前均为空闲

图 2 DPC 实验端口组在初始化前均为空闲

图 2 DPC 实验端口组在初始化前均为空闲

检查防火墙与网络

命令(bash)

systemctl is-active firewalld firewall-cmd --list-all 2>/dev/null ip address show ip route show getent hosts dpc-host

跨主机生产环境应在端口监听后从每个允许的源节点逐项验证连接:

命令(bash)

nc -zvw3 10.36**** 2**** nc -zvw3 10.36**** 2**** nc -zvw3 10.36**** 2****

本实操同机测试只能证明本机连通,不能替代跨机网络、丢包、时延和故障域验证。

创建数据根目录

执行用户:dmdba。

命令(bash)

mkdir -p /dmdata/dpc_single/dpc_single chmod 0750 /dmdata/dpc_single/dpc_single stat -c 'OWNER=%U GROUP=%G MODE=%a PATH=%n' /dmdata/dpc_single/dpc_single

通过标准:属主 dmdba、属组 dinstall、权限 750。若不一致,由授权管理员按项目规范修正,不以 root 身份长期运行数据库。

图 3  DPC 实验数据根目录属主、属组和权限检查

图 3 DPC 实验数据根目录属主、属组和权限检查

详细部署过程

初始化 SP1

执行用户:dmdba。

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dminit

在引导中按已审批参数设置:PATH=/dmdata/dpc_single/dpc_single/sp1、INSTANCE_NAME=SP1、PORT_NUM=2****、AP_PORT_NUM=2****、DPC_MODE=SP;SYSDBA、SYSAUDITOR 口令在受控终端交互输入。

初始化 BP1

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dminit

在引导中按已审批参数设置:PATH=/dmdata/dpc_single/dpc_single/bp1、INSTANCE_NAME=BP1、PORT_NUM=2****、AP_PORT_NUM=2****、DPC_MODE=BP;两类管理口令交互输入。

初始化 BP2

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dminit

在引导中按已审批参数设置:PATH=/dmdata/dpc_single/dpc_single/bp2、INSTANCE_NAME=BP2、PORT_NUM=2****、AP_PORT_NUM=2****、DPC_MODE=BP;两类管理口令交互输入。

初始化 MP

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dminit

在引导中按已审批参数设置:PATH=/dmdata/dpc_single/dpc_single/mp、INSTANCE_NAME=MP、PORT_NUM=2****、AP_PORT_NUM=2****、DPC_MODE=MP;两类管理口令交互输入。

DPC_MODE 在初始化时确定,启动时必须使用一致的 dpc_mode。空库角色初始化错误时应停止并按变更流程重新初始化;已有数据环境不得直接删除重建。

核对四套实例配置

命令(bash)

for ini in \ /dmdata/dpc_single/dpc_single/sp1/DAMENG/dm.ini \ /dmdata/dpc_single/dpc_single/bp1/DAMENG/dm.ini \ /dmdata/dpc_single/dpc_single/bp2/DAMENG/dm.ini \ /dmdata/dpc_single/dpc_single/mp/DAMENG/dm.ini do echo "===== $ini =====" grep -E '^[[:space:]]*(INSTANCE_NAME|PORT_NUM|AP_PORT_NUM|DPC_MODE)[[:space:]]*=' "$ini" done ps -ef | grep '[d]mserver'

通过标准:四个 dm.ini 的实例名、两类端口与规划一致;此时尚未启动任何 dmserver。

DPC 部署截图 3

图 5-1 四个 DPC 实例 dm.ini 关键参数与未启动状态核对

配置全部节点的 mp.ini

单副本 MP 环境中,四个节点的 mp.ini 内容必须一致:

配置模板(ini)

mp_host = 10.36.**** mp_port = 2****

只允许在已确认的全新部署中写入。先检查四个目标均不存在;任一文件已存在就停止,改走“备份—差异审阅—变更审批—修改—验证”流程,不得无条件覆盖:

命令(bash)

for f in \ /dmdata/dpc_single/dpc_single/sp1/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/bp1/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/bp2/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/mp/DAMENG/mp.ini do test ! -e "$f" || { echo "ABORT: existing file $f"; exit 1; } done

确认上一步全部通过后,写入四套库目录:

命令(bash)

printf 'mp_host = 10.36****\nmp_port = 2****\n' > /dmdata/dpc_single/dpc_single/sp1/DAMENG/mp.ini printf 'mp_host = 10.36****\nmp_port = 2****\n' > /dmdata/dpc_single/dpc_single/bp1/DAMENG/mp.ini printf 'mp_host = 10.36****\nmp_port = 2****\n' > /dmdata/dpc_single/dpc_single/bp2/DAMENG/mp.ini printf 'mp_host = 10.36****\nmp_port = 2****\n' > /dmdata/dpc_single/dpc_single/mp/DAMENG/mp.ini

核对内容和哈希:

命令(bash)

for f in \ /dmdata/dpc_single/dpc_single/sp1/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/bp1/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/bp2/DAMENG/mp.ini \ /dmdata/dpc_single/dpc_single/mp/DAMENG/mp.ini do echo "===== $f =====" cat "$f" sha256sum "$f" done

通过标准:四个文件内容和 SHA-256 完全一致;2**** 未与数据库端口或 AP 端口冲突。

图 4  四个单副本节点使用一致的 mp.ini 并通过哈希核对

图 4 四个单副本节点使用一致的 mp.ini 并通过哈希核对

先启动 MP

官方单副本流程要求先启动 MP,并在后续注册和 BP/SP 启动过程中保持 MP 在线。新开一个独立终端,以 dmdba 前台启动:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dmserver \ /dmdata/dpc_single/dpc_single/mp/DAMENG/dm.ini \ dpc_mode=MP

观察到 SYSTEM IS READY 后,在另一个终端核对:

命令(bash)

ps -ef | grep '[d]mserver.*dpc_single/mp/DAMENG/dm.ini' ss -lntp | grep -E ':(2****|2****|2****)\b'

通过标准:MP 数据库端口 2****、AP 端口 2****、MP 服务端口 2**** 均监听,SP1、BP1、BP2 尚未启动。

图 5  MP 先启动并监听数据库、AP 和 MP 服务端口

图 5 MP 先启动并监听数据库、AP 和 MP 服务端口

DPC 部署截图 6

图5-2 MP 前台启动并进入 SYSTEM IS READY 状态

登录 MP

为避免数据库口令进入 shell history,先进入无连接模式:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/disql /nolog

在 DIsql 中交互登录:

命令(sql)

LOGIN -- 服务地址:10.36****:2**** -- 用户名:SYSDBA -- 密码:按安全规范交互输入

先注册当前 MP

命令(sql)

SP_CREATE_DPC_INSTANCE( NULL, 'MP', 'MP', 2****, 2****, '10.36****', '10.36****', 'NORMAL', 1, 'MP instance' );

当前 MP 必须先注册。MP 注册完成后再创建 BP、BP 组和 SP 的注册信息。

DPC 部署截图 7

图5-3 当前 MP 实例注册结果

注册 BP1 与 BP2

命令(sql)

SP_CREATE_DPC_RAFT('BP', 'RAFT_1'); SP_CREATE_DPC_INSTANCE( 'RAFT_1', 'BP1', 'BP', 2****, 2****, '10.36****', '10.36****', 'NORMAL', 1, 'BP instance' ); SP_CREATE_DPC_RAFT('BP', 'RAFT_2'); SP_CREATE_DPC_INSTANCE( 'RAFT_2', 'BP2', 'BP', 2****, 2****, '10.36****', '10.36****', 'NORMAL', 1, 'BP instance' );

DPC 部署截图 8

图5-4 BP1 对应 RAFT_1 的创建与实例注册结果

DPC 部署截图 9

图5-5 BP2 对应 RAFT_2 的创建与实例注册结果

创建 BP 组并加入两个 RAFT

命令(sql)

SP_CREATE_DPC_BP_GROUP('BG_1', 'bp group1'); SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_1'); SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_2');

源截图中第二条加入命令曾被界面浮层遮挡;根据官方流程和查询结果,完整命令应明确加入 RAFT_2,不得只凭被遮挡截图抄写。

DPC 部署截图 10

图5-6 BP 组 BG_1 创建及 RAFT 成员加入结果

注册 SP1

命令(sql)

SP_CREATE_DPC_RAFT('SP', 'RAFT_SP1'); SP_CREATE_DPC_INSTANCE( 'RAFT_SP1', 'SP1', 'SP', 2****, 2****, '10.36****', '10.36****', 'NORMAL', 2, 'SP instance' );

BP 和 SP 在 MP 之后的注册先后没有强制要求,但都必须在各自第一次启动前完成注册。注册的实例名、角色、IP、数据库端口和 AP 端口必须与初始化规划一致。

核对注册目录

仍在 MP 会话执行:

命令(sql)

SELECT * FROM DPC_BP_GROUP; SELECT * FROM DPC_BP_RAFT; SELECT * FROM DPC_INSTANCE;

通过标准:BG_1 含两个 BP RAFT;存在 MP_RAFT、RAFT_1、RAFT_2、RAFT_SP1;存在 MP、BP1、BP2、SP1 四条实例注册记录;名称、角色、IP、两类端口和有效状态正确。

图 6  BP 组与四个 RAFT 的注册关系核对

图 6 BP 组与四个 RAFT 的注册关系核对

图 7  MP、BP1、BP2、SP1 的实例注册信息核对

图 7 MP、BP1、BP2、SP1 的实例注册信息核对

截图中的 RAFT ID 和实例 ID 是本次系统分配结果,不能写成其他环境的固定值。正式验收以名称、角色、端口、地址、状态和组成员关系为准。

启动 BP1、BP2 和 SP1

注册核对通过后,新开三个独立终端。官方说明 BP 与 SP 之间无强制先后顺序;本实操为便于审计,依次启动 BP1、BP2、SP1。

BP1:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dmserver \ /dmdata/dpc_single/dpc_single/bp1/DAMENG/dm.ini \ dpc_mode=BP

BP2:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dmserver \ /dmdata/dpc_single/dpc_single/bp2/DAMENG/dm.ini \ dpc_mode=BP

SP1:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/dmserver \ /dmdata/dpc_single/dpc_single/sp1/DAMENG/dm.ini \ dpc_mode=SP

每个终端均应观察到系统就绪。另开检查终端:

命令(bash)

ps -ef | grep '[d]mserver' ss -lntp | grep -E ':(2****|2****|2****|2****|2****|2****|2****|2****|2****)\b'

源材料中使用临时后台方式启动部分实例,并出现 MP 前台进程被退出后 BP1 等待重连的过程。上述截图不作为正式部署证据;规范流程应让 MP 持续在线,并使用统一、可审计的进程或服务管理方式。

启动验证与功能验收

从 SP 登录

正常业务入口是 SP1,不是 BP 或 MP。为避免口令进入命令历史:

命令(bash)

/dmdata/dsp/dmdpc_test/bin/disql /nolog

在 DIsql 中交互登录:

命令(sql)

LOGIN -- 服务地址:10.36****:2**** -- 用户名:SYSDBA -- 密码:按安全规范交互输入

验证四实例状态

命令(sql)

SELECT NAME, INSTANCE_NAME, HOST_NAME, STATUS$, MODE$ FROM V$INSTANCE ORDER BY INSTANCE_NAME; SELECT RAFT_ID, DPC_MODE, NAME, IS_VALID FROM DPC_BP_RAFT ORDER BY RAFT_ID;

通过标准:BP1、BP2、MP、SP1 均为 OPEN/NORMAL;四个 RAFT 均有效。若没有可用 BP,DPC 可能返回无效系统状态,不能只看 SP 端口判断集群可用。

创建分布式表空间

在 SP 会话执行:

命令(sql)

CREATE TABLESPACE TS_DPC_R1 DATAFILE '/dmdata/dpc_single/dpc_single/bp1/DAMENG/TS_DPC_R1.DBF' SIZE 128 STORAGE (ON RAFT_1); CREATE TABLESPACE TS_DPC_R2 DATAFILE '/dmdata/dpc_single/dpc_single/bp2/DAMENG/TS_DPC_R2.DBF' SIZE 128 STORAGE (ON RAFT_2); SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('TS_DPC_R1', 'TS_DPC_R2') ORDER BY TABLESPACE_NAME;

通过标准:两个表空间均为 ONLINE;数据文件分别落在 BP1 和 BP2。本例 128 MB 只用于功能验证,生产大小必须按容量规划确定。

图 9  在两个 BP RAFT 上创建分布式表空间并核对 ONLINE 状态

图 9 在两个 BP RAFT 上创建分布式表空间并核对 ONLINE 状态

图 9 在两个 BP RAFT 上创建分布式表空间并核对 ONLINE 状态

创建跨 BP 分区表并验证数据

命令(sql)

CREATE TABLE DPC_FUNC_TEST ( C1 INT, C2 INT, C3 INT ) PARTITION BY HASH(C1) ( PARTITION P1 STORAGE(ON TS_DPC_R1, CLUSTERBTR), PARTITION P2 STORAGE(ON TS_DPC_R2, CLUSTERBTR), PARTITION P3 STORAGE(ON TS_DPC_R1, CLUSTERBTR) ) STORAGE(HASHPARTMAP(2), ON TS_DPC_R2, CLUSTERBTR); INSERT INTO DPC_FUNC_TEST SELECT LEVEL, LEVEL * 10, LEVEL * 100 FROM DUAL CONNECT BY LEVEL < 8; COMMIT; SELECT * FROM DPC_FUNC_TEST ORDER BY C1; SELECT COUNT(*) AS TOTAL_ROWS FROM DPC_FUNC_TEST; SELECT * FROM DPC_FUNC_TEST PARTITION (P1) ORDER BY C1; SELECT * FROM DPC_FUNC_TEST PARTITION (P2) ORDER BY C1; SELECT * FROM DPC_FUNC_TEST PARTITION (P3) ORDER BY C1;

本次实操总计 7 行;P1 为 C1=4,P2 为 C1=1、3、5、7,P3 为 C1=2、6。该分布是当前版本和当前建表参数下的实测结果,不能写成所有版本恒定的哈希规则。

图 10  跨两个 BP 表空间创建分区表并完成七行数据验证

图 10 跨两个 BP 表空间创建分区表并完成七行数据验证

图 10 跨两个 BP 表空间创建分区表并完成七行数据验证

DPC 部署截图 17

图6-1 分区表 P1、P2、P3 数据分布查询结果(一)

DPC 部署截图 18

图6-2 分区表 P1、P2、P3 数据分布查询结果(二)

验证分布式计划与本地提示

命令(sql)

EXPLAIN SELECT * FROM DPC_FUNC_TEST; EXPLAIN SELECT /*+ DPC_LOCAL */ * FROM DPC_FUNC_TEST; SELECT COUNT(*) AS NORMAL_COUNT FROM DPC_FUNC_TEST; SELECT /*+ DPC_LOCAL */ COUNT(*) AS SP_LOCAL_COUNT FROM DPC_FUNC_TEST;

普通查询计划包含 ERECV、ESEND、GI 等分布式执行算子;DPC_LOCAL 只在当前登录节点执行。SP 不存放 BP 用户数据,因此本实操普通计数为 7,而 SP 本地计数为 0。这是提示语义,不是数据丢失,业务 SQL 不得随意添加该提示。

图 11  普通分布式计划与 DPC_LOCAL 本地计划对比

图 11 普通分布式计划与 DPC_LOCAL 本地计划对比

图 11 普通分布式计划与 DPC_LOCAL 本地计划对比

图 12  SP 上普通计数为七而 DPC_LOCAL 本地计数为零

图 12 SP 上普通计数为七而 DPC_LOCAL 本地计数为零

图 12 SP 上普通计数为七而 DPC_LOCAL 本地计数为零

核对物理数据文件

执行用户:dmdba。

命令(bash)

ls -lh /dmdata/dpc_single/dpc_single/bp1/DAMENG/TS_DPC_R1.DBF ls -lh /dmdata/dpc_single/dpc_single/bp2/DAMENG/TS_DPC_R2.DBF

通过标准:两个 128 MB 实验数据文件分别位于规划的 BP1、BP2 目录,属主属组为 dmdba:dinstall。

图 13  分布式表空间物理数据文件分别落在 BP1 与 BP2

图 13 分布式表空间物理数据文件分别落在 BP1 与 BP2

图 13 分布式表空间物理数据文件分别落在 BP1 与 BP2

从前台验证切换为系统服务

首次注册和功能验证完成后,先按 SP → BP → MP 顺序在对应前台控制台输入 exit,逐个确认进程与端口退出。BP1 与 BP2 之间没有强制先后,但前一个实例未完全退出前不得继续下一个。

命令(bash)

pgrep -af '[d]mserver.*dpc_single' ss -lntp | grep -E ':(2****|2****|2****|2****|2****|2****|2****|2****|2****)\b'

通过标准:上述两条命令均无目标输出。随后以 root 使用当前安装介质自带的 DmService 模板注册服务。官方模板的 INI_PATH、DPC_MODE、START_MODE 分别决定实例配置、MP/BP/SP 角色和启动模式;注册器没有公开的 -dpc_mode 参数,因此必须先修改模板,再用 -s 注册完整服务脚本。

命令(bash)

DM_HOME=/dmdata/dsp/dmdpc_test if test -x "${DM_HOME}/scripts/root/dm_service_installer.sh"; then DM_SERVICE_ROOT="${DM_HOME}/scripts/root" elif test -x "${DM_HOME}/script/root/dm_service_installer.sh"; then DM_SERVICE_ROOT="${DM_HOME}/script/root" else echo "ABORT: dm_service_installer.sh not found under DM_HOME" exit 1 fi test -f "${DM_HOME}/bin/service_template/DmService" || { echo "ABORT: DmService template not found" exit 1 }

注册函数只用于当前安装版本已经核对模板变量的场景。每个服务脚本首次创建时拒绝覆盖已有文件:

命令(bash)

register_dpc_service() { service_suffix="$1" dpc_role="$2" ini_path="$3" service_script="${DM_HOME}/bin/DmService${service_suffix}" test ! -e "${service_script}" || { echo "ABORT: existing service script ${service_script}" return 1 } cp "${DM_HOME}/bin/service_template/DmService" "${service_script}" sed -i -E \ -e "s|^[[:space:]]*INI_PATH=.*|INI_PATH=${ini_path}|" \ -e "s|^[[:space:]]*DPC_MODE=.*|DPC_MODE=${dpc_role}|" \ -e 's|^[[:space:]]*START_MODE=.*|START_MODE=open|' \ "${service_script}" chmod 0755 "${service_script}" grep -E '^[[:space:]]*(INI_PATH|DPC_MODE|START_MODE)=' "${service_script}" "${DM_SERVICE_ROOT}/dm_service_installer.sh" -s "${service_script}" } register_dpc_service MP MP /dmdata/dpc_single/dpc_single/mp/DAMENG/dm.ini register_dpc_service BP1 BP /dmdata/dpc_single/dpc_single/bp1/DAMENG/dm.ini register_dpc_service BP2 BP /dmdata/dpc_single/dpc_single/bp2/DAMENG/dm.ini register_dpc_service SP1 SP /dmdata/dpc_single/dpc_single/sp1/DAMENG/dm.ini systemctl daemon-reload

逐项核对服务脚本、systemd 映射和角色,任何一项不一致都不得启动:

命令(bash)

grep -E '^[[:space:]]*(INI_PATH|DPC_MODE|START_MODE)=' \ /dmdata/dsp/dmdpc_test/bin/DmServiceMP \ /dmdata/dsp/dmdpc_test/bin/DmServiceBP1 \ /dmdata/dsp/dmdpc_test/bin/DmServiceBP2 \ /dmdata/dsp/dmdpc_test/bin/DmServiceSP1 systemctl cat DmServiceMP.service systemctl cat DmServiceBP1.service systemctl cat DmServiceBP2.service systemctl cat DmServiceSP1.service

通过标准:四个脚本的 INI_PATH 与实例目录一一对应,DPC_MODE 分别为 MP、BP、BP、SP,START_MODE=open;systemd 的 ExecStart/ExecStop 指向相同服务脚本。

日志与端口收口

命令(bash)

ps -ef | grep '[d]mserver' ss -lntp | grep -E ':(2****|2****|2****|2****|2****|2****|2****|2****|2****)\b'

应检查每个实例的启动日志、运行日志和服务日志,确认没有未解释的 ERROR、FATAL、网络重连、授权到期或恢复异常。实际日志路径根据当前版本 dm.ini 和服务配置登记为 【待项目确认】。

规范启动与退出

启动顺序

  • 以 root 启动 MP,并确认服务、进程和三个端口正常:

命令(bash)

systemctl start DmServiceMP.service systemctl is-active DmServiceMP.service pgrep -af '[d]mserver.*dpc_single/mp/DAMENG/dm.ini.*dpc_mode=MP' ss -lntp | grep -E ':(2****|2****|2****)\b'
  • MP 为 OPEN 后,启动全部 BP 和 SP;BP 与 SP 之间没有强制顺序,但每个服务都必须单独确认:

命令(bash)

systemctl start DmServiceBP1.service systemctl is-active DmServiceBP1.service systemctl start DmServiceBP2.service systemctl is-active DmServiceBP2.service systemctl start DmServiceSP1.service systemctl is-active DmServiceSP1.service
  • 核对四个进程命令行中的 dm.ini 与 dpc_mode,再从 SP 查询 V$INSTANCE、DPC_BP_RAFT 并完成业务验证。

退出顺序

官方单副本退出顺序必须为 SP → BP → MP。与启动保持同一 systemd 控制面,每停止一个服务都确认 inactive 后再继续:

命令(bash)

systemctl stop DmServiceSP1.service systemctl is-active DmServiceSP1.service systemctl stop DmServiceBP1.service systemctl is-active DmServiceBP1.service systemctl stop DmServiceBP2.service systemctl is-active DmServiceBP2.service systemctl stop DmServiceMP.service systemctl is-active DmServiceMP.service

最后检查进程和端口均已退出:

命令(bash)

ps -ef | grep '[d]mserver' ss -lntp | grep -E ':(2****|2****|2****|2****|2****|2****|2****|2****|2****)\b' || true

通过标准:四个服务均显示 inactive,没有目标进程或监听端口。不得用 kill -9 作为常规关库方式;错误退出顺序可能使剩余节点异常,并在下次启动时产生较长重做恢复。

生产扩缩容、备份与运维边界

单副本横向增加 BP

官方顺序为:初始化新 BP 但不启动→创建 BP RAFT→注册 BP 实例→创建或复用 BP 组并加入 RAFT→复制一致的 mp.ini→启动新 BP→验证。

注册模板:

命令模板(执行前替换占位符)(sql)

SP_CREATE_DPC_RAFT('BP', '【新RAFT名称】'); SP_CREATE_DPC_INSTANCE( '【新RAFT名称】', '【新BP实例名】', 'BP', 【新AP端口】, 【新数据库端口】, '【新BP内部IP】', '【新BP外部IP】', 'NORMAL', 1, 'BP instance' ); SP_CREATE_DPC_BP_GROUP('【新BP组名称】', '【说明】'); SP_BP_GROUP_ADD_RAFT('【新BP组名称】', '【新RAFT名称】');

若复用已有 BP 组,不重复创建;扩容前应确认表空间分布、数据均衡、容量和回退方案。

增加 SP

顺序为:初始化 SP 但不启动→创建 SP RAFT→注册 SP→复制一致的 mp.ini→启动 SP→验证。一个 SP 类型 RAFT 最多加入一个 SP 实例。

多副本扩缩容限制

  • 扩缩容后的 RAFT 实例数必须为奇数。

  • 当前主节点不能直接删除;应先手动切换,使待删除节点成为备库。

  • MP 多副本变更后需更新所有节点的 mp.ini。

  • BP/MP 多副本增加实例还需配置归档、RAFT/XMAL 参数,并按官方对应版本过程执行。

  • DEM 扩容若出现数据还原失败,应核对 dmagent 是否错误地由 root 启动;代理安装路径和服务名必须以现场值为准。

备份恢复原则

  • 在线 DPC 备份从 SP 发起,由系统协调集群备份。

  • 单副本离线备份必须包含 MP 与全部单副本 BP,并先按 SP→BP→MP 正常停止。

  • 同一批 DPC 备份集的 BAK_MAGIC 必须一致,恢复前必须核对。

  • 恢复到不同拓扑时,还要处理实例名、端口、DPC 注册信息、DPC_MAGIC、mp.ini 和 RAFT 配置,不能按普通单库恢复。

  • 备份介质、保留期、加密、校验、恢复演练及 RPO/RTO 为 【待项目确认】。

回退与卸载

回退原则

  • 部署失败回退、移除 DPC 节点、删除实例数据和卸载 DM 软件是不同操作。

  • 有业务数据时先完成一致性备份、备份校验和恢复方案审批,必要时联系达梦技术支持。

  • 逻辑移除时先停止 SP 与 BP,保持 MP 在线完成官方注册清理,随后最后停止 MP;完整退出顺序仍为 SP→BP→MP。不得直接更新 DPC 系统表。

  • /dmdata/dsp/dmdpc_test/bin 可能被其他实例共用,未确认依赖前不得删除软件目录。

无数据实验环境的逻辑回退

连接 MP,先移除 SP:

命令(sql)

SP_DROP_DPC_INSTANCE('SP1'); SP_DROP_DPC_BP_RAFT('RAFT_SP1');

再移除两个 BP、两个 BP RAFT,最后移除 BP 组:

命令(sql)

SP_DROP_DPC_INSTANCE('BP1'); SP_DROP_DPC_INSTANCE('BP2'); SP_DROP_DPC_BP_RAFT('RAFT_1'); SP_DROP_DPC_BP_RAFT('RAFT_2'); SP_DROP_DPC_BP_GROUP('BG_1');

执行前先查询 DPC_BP_GROUP、DPC_BP_RAFT、DPC_INSTANCE,确认没有其他对象复用这些名称。官方过程不允许删除仍含实例的 RAFT;最后一个 MP 不能通过普通节点删除过程直接移除。保存注册目录和日志证据后,最后正常退出 MP。

物理目录清理

先确认全部进程退出、实际 OS 服务已注销、备份已验收,再只读核对目标:

命令(bash)

ps -ef | grep '[d]mserver' du -sh \ /dmdata/dpc_single/dpc_single/sp1 \ /dmdata/dpc_single/dpc_single/bp1 \ /dmdata/dpc_single/dpc_single/bp2 \ /dmdata/dpc_single/dpc_single/mp \ /dmdata/dpc_single/dpc_single/log find /dmdata/dpc_single/dpc_single -maxdepth 2 -mindepth 1 -print

警告:数据目录删除不可恢复。只有完成变更审批、备份验收和绝对路径双人复核后,才能按已批准清单逐目录处理;不得对 /dmdata 使用模糊通配符或无边界递归删除。

如执行码仍由其他实例使用,不卸载 DM 软件。确认完全独占后,才按当前安装版本官方卸载程序处理;实际卸载脚本路径为 【待项目确认】。

有数据环境的回退

  • 冻结业务写入并记录 DPC 全局状态。

  • 从 SP 完成一致性备份,或规范停库后备份 MP 与全部 BP。

  • 核对同批备份的 BAK_MAGIC。

  • 归档全部实例、RAFT、BP 组、端口、mp.ini、dmarch.ini 和表空间分布。

  • 在隔离环境验证恢复。

  • 经项目负责人和达梦技术支持确认后再移除节点或回退版本。

官方依据

以下在线资料用于校核产品定位、角色边界、单副本流程、扩缩容、备份和故障处理;实施时优先核对当前安装版本 DM_HOME/doc 中的随附手册。

  • DMDPC 引言与系统架构:1 引言、2.1 系统架构、2.2 系统原理、2.3 系统特性

  • DMDPC 使用须知:4.1 软硬件环境、4.2 系统规范

  • DMDPC 集群部署:7.1 单副本命令行部署、7.2 与 7.3 多副本部署、7.4 图形化部署

  • DMDPC 配置:DM.INI、DMINIT、MP.INI、DMARCH.INI、DMServer 启动参数和配置过程

  • DMDPC 集群的管理与使用:8.1 集群信息、8.2 动态增删、8.3 表空间、8.6 表、8.8 备份还原

  • 新一代分布式集群安装部署:环境规划、安装前系统调整、DEM 搭建

  • 集群配置及健康检查:DPC 集群健康检查

  • 相关系统表和动态视图:DPC_BP_RAFT、DPC_INSTANCE 等

  • SQL 优化与调优:单节点登录提示 DPC_LOCAL

  • DPC 集群 FAQ:滚动升级与扩展节点还原失败

  • DM 集群 FAQ:MP 找不到 mp.ini 自身配置

  • DM 数据库启动与关闭:DMServer 前台启停与 Linux 服务方式

  • DM8 Linux 脚本使用手册:DmService 的 INI_PATH、DPC_MODE、START_MODE 与 -s 服务注册

  • 使用 dminit:无参数时进入引导设置

  • 达梦新一代分布式集群 DMDPC 产品页

达梦社区地址:https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服