达梦分布式处理集群 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 是 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 实验端口组在初始化前均为空闲
命令(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 实验数据根目录属主、属组和权限检查
执行用户: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 口令在受控终端交互输入。
命令(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;两类管理口令交互输入。
命令(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;两类管理口令交互输入。
命令(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。
图 5-1 四个 DPC 实例 dm.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 并通过哈希核对
官方单副本流程要求先启动 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-2 MP 前台启动并进入 SYSTEM IS READY 状态
为避免数据库口令进入 shell history,先进入无连接模式:
命令(bash)
/dmdata/dsp/dmdpc_test/bin/disql /nolog
在 DIsql 中交互登录:
命令(sql)
LOGIN
-- 服务地址:10.36****:2****
-- 用户名:SYSDBA
-- 密码:按安全规范交互输入
命令(sql)
SP_CREATE_DPC_INSTANCE( NULL, 'MP', 'MP', 2****, 2****, '10.36****', '10.36****', 'NORMAL', 1, 'MP instance' );
当前 MP 必须先注册。MP 注册完成后再创建 BP、BP 组和 SP 的注册信息。
图5-3 当前 MP 实例注册结果
命令(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' );
图5-4 BP1 对应 RAFT_1 的创建与实例注册结果
图5-5 BP2 对应 RAFT_2 的创建与实例注册结果
命令(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,不得只凭被遮挡截图抄写。
图5-6 BP 组 BG_1 创建及 RAFT 成员加入结果
命令(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 的注册关系核对
图 7 MP、BP1、BP2、SP1 的实例注册信息核对
截图中的 RAFT ID 和实例 ID 是本次系统分配结果,不能写成其他环境的固定值。正式验收以名称、角色、端口、地址、状态和组成员关系为准。
注册核对通过后,新开三个独立终端。官方说明 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 持续在线,并使用统一、可审计的进程或服务管理方式。
正常业务入口是 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 状态
命令(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 表空间创建分区表并完成七行数据验证
图6-1 分区表 P1、P2、P3 数据分布查询结果(一)
图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 本地计划对比
图 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
首次注册和功能验证完成后,先按 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 和服务配置登记为 【待项目确认】。
命令(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'
命令(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
官方单副本退出顺序必须为 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 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 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
文章
阅读量
获赞
