注册
从零搭建达梦DPC分布式集群:一场与防火墙的“斗智斗勇”
专栏/技术分享/ 文章详情 /

从零搭建达梦DPC分布式集群:一场与防火墙的“斗智斗勇”

chinuppp 2026/08/28 97 0 0
摘要

写在前面

这篇文章记录了我从零开始搭建DMDPC集群的全过程,包括架构理解、环境准备、部署步骤,以及踩过的坑和填坑的方法。希望能给正在学习达梦分布式数据库的朋友一些参考。

一、什么是DMDPC?

在动手之前,先搞清楚我们要搭的是什么。

DMDPC(DM Distributed Processing Cluster)是达梦数据库的分布式计算集群方案。你可以把它理解成一个“分工明确的团队”:

角色 全称 通俗理解 核心职责
SP SQL Processor 大堂经理 接收SQL请求,生成执行计划,调度任务
BP Backend Processor 仓库管理员 真正存储数据,执行具体计算任务
MP Metadata Processor 资料管理员 管理集群的元数据(表结构、分区策略等)

三者的协作流程大致是:客户端把SQL发给SP → SP去MP查元数据 → SP把任务分给多个BP并行执行 → BP把结果汇总给SP → SP返回给客户端。

这次我搭建的是单副本模式(每个角色只有一个节点,没有备份),适合学习和功能验证。

二、实验环境

我的笔记本电脑是联想拯救者Y7000P(16GB内存),用VMware Workstation虚拟了三台CentOS 7虚拟机:

虚拟机 IP地址 内存 角色
dpc-master 192.168.233.101 3GB MP + SP
dpc-node1 192.168.233.102 2GB BP1
dpc-node2 192.168.233.103 2GB BP2

注:官方手册通常建议4台物理机各司其职,但在测试环境中,将MP和SP部署在同一台机器上是完全可行的。

三、部署过程实录

3.1 初始化数据库实例

达梦提供了 dminit 命令行工具来初始化实例。关键参数是 dpc_mode,它决定了这个节点在集群中的角色(MP/SP/BP)。

在 dpc-master 上初始化 MP 和 SP:

# 初始化 MP(元数据节点)
./dminit path=/home/dmdba/dpc_data/mp \
         instance_name=MP \
         port_num=5239 \
         ap_port_num=6003 \
         dpc_mode=MP \
         SYSDBA_PWD=DMsys_123 \
         SYSAUDITOR_PWD=DMauditor_123

# 初始化 SP(计算节点)
./dminit path=/home/dmdba/dpc_data/sp1 \
         instance_name=SP1 \
         port_num=5238 \
         ap_port_num=6000 \
         dpc_mode=SP \
         SYSDBA_PWD=DMsys_123 \
         SYSAUDITOR_PWD=DMauditor_123

在 dpc-node1 上初始化 BP1:

./dminit path=/home/dmdba/dpc_data/bp1 \
         instance_name=BP1 \
         port_num=5237 \
         ap_port_num=6001 \
         dpc_mode=BP \
         SYSDBA_PWD=DMsys_123 \
         SYSAUDITOR_PWD=DMauditor_123

在 dpc-node2 上初始化 BP2:

./dminit path=/home/dmdba/dpc_data/bp2 \
         instance_name=BP2 \
         port_num=5236 \
         ap_port_num=6002 \
         dpc_mode=BP \
         SYSDBA_PWD=DMsys_123 \
         SYSAUDITOR_PWD=DMauditor_123

3.2 配置 mp.ini——让所有节点找到“组织”

mp.ini 是集群的“通讯录”,它告诉每个节点:MP 在哪里。因为MP部署在 192.168.233.101 上,所以所有节点的 mp.ini 都指向这个地址:

image.png

mp_host = 192.168.233.101
mp_port = 9000
  1. 在 DPC-Master (192.168.233.101) 上为 MP 和 SP 配置:

    # 为 MP 配置 mp.ini echo "mp_host = 192.168.233.101" > /home/dmdba/dpc_data/mp/DAMENG/mp.ini echo "mp_port = 9000" >> /home/dmdba/dpc_data/mp/DAMENG/mp.ini # 为 SP1 配置 mp.ini echo "mp_host = 192.168.233.101" > /home/dmdba/dpc_data/sp1/DAMENG/mp.ini echo "mp_port = 9000" >> /home/dmdba/dpc_data/sp1/DAMENG/mp.ini
  2. 在 DPC-Node1 (192.168.233.102) 上为 BP1 配置

    echo "mp_host = 192.168.233.101" > /home/dmdba/dpc_data/bp1/DAMENG/mp.ini echo "mp_port = 9000" >> /home/dmdba/dpc_data/bp1/DAMENG/mp.ini
  3. 在 DPC-Node2 (192.168.233.103) 上为 BP2 配置

    echo "mp_host = 192.168.233.101" > /home/dmdba/dpc_data/bp2/DAMENG/mp.ini echo "mp_port = 9000" >> /home/dmdba/dpc_data/bp2/DAMENG/mp.ini
  4. 验证配置文件是否生成,在每台机器上执行:

    cat /home/dmdba/dpc_data/*/DAMENG/mp.ini

    每台机器上都会输出:

image.png

3. 启动MP

./dmserver /home/dmdba/dpc_data/mp/DAMENG/dm.ini dpc_mode=MP

image.png

DMDPC运行过程中,MP需要始终处于开启状态。

4. 将MP、SP和BP加入集群

只有在注册当前登录MP节点后,才可以注册 其余节点。后续增加MP、SP节点和BP节点无先后之分。

-- 1. 注册MP实例自身(这是必须的第一步) SP_CREATE_DPC_INSTANCE(NULL, 'MP', 'MP', 6003, 5239, '192.168.233.101', '192.168.233.101', 'NORMAL', 1, 'MP instance'); -- 2. 创建BP的RAFT组 SP_CREATE_DPC_RAFT('BP', 'RAFT_1'); SP_CREATE_DPC_RAFT('BP', 'RAFT_2'); -- 3. 向RAFT组中注册BP实例 SP_CREATE_DPC_INSTANCE('RAFT_1', 'BP1', 'BP', 6001, 5237, '192.168.233.102', '192.168.233.102', 'NORMAL', 1, 'BP1 instance'); SP_CREATE_DPC_INSTANCE('RAFT_2', 'BP2', 'BP', 6002, 5236, '192.168.233.103', '192.168.233.103', 'NORMAL', 1, 'BP2 instance'); -- 4. 创建SP的RAFT组 SP_CREATE_DPC_RAFT('SP', 'RAFT_SP1'); -- 5. 注册SP实例 SP_CREATE_DPC_INSTANCE('RAFT_SP1', 'SP1', 'SP', 6000, 5238, '192.168.233.101', '192.168.233.101', 'NORMAL', 2, 'SP1 instance'); -- 6. 验证是否注册成功 select * from DPC_INSTANCE;

f3489883a47f4d6683d7250e29dc3ba6.png

5. 启动 SP 和 BP 节点

  1. 在 DPC-Master 上启动 SP1

    ./dmserver /home/dmdba/dpc_data/sp1/DAMENG/dm.ini dpc_mode=SP

image.png

  1. 在 DPC-Node1 上启动 BP1

    ./dmserver /home/dmdba/dpc_data/bp1/DAMENG/dm.ini dpc_mode=BP
  2. 在DPC-Node2 上启动 BP2

    ./dmserver /home/dmdba/dpc_data/bp2/DAMENG/dm.ini dpc_mode=BP

    出现问题:

    在启动 DPC 集群的 BP(数据存储节点)节点时,执行启动命令后,终端输出显示 version info: develop,但未出现预期的SYSTEM IS READY提示信息。

image.png

并且在执行 SELECT * FROM V$INSTANCE; 查询集群状态时,只看到 MPSP 节点,而两个 BP 节点未出现在结果中:
image.png
在 DPC 集群搭建过程中,所有节点(MP、SP、BP)均已正常启动,但通过 V$INSTANCE 查询时,BP 节点始终未显示为 OPEN 状态,集群无法正常工作。

排查问题:

  1. 检查进程ps -ef | grep dmserver 确认所有节点进程均在运行。
  2. 检查端口ss -tulnp 确认各节点端口(52365239、60006003、9000)均已正常监听。
  3. 检查网络连通性ping 测试三台虚拟机之间网络互通正常。
  4. 检查防火墙状态:执行 systemctl status firewalld 发现防火墙仍处于 active (running) 状态。

解决方案:

彻底关闭防火墙并禁用其开机自启:

# 停止防火墙服务
systemctl stop firewalld

# 禁用防火墙开机自启
systemctl disable firewalld

# 确认状态为 inactive (dead)
systemctl status firewalld

image.png

验证结果:

​ 防火墙关闭后,重新启动所有 DPC 节点,发现BP节点出现:SYSTEM IS READY提示信息。
image.png

查询 V$INSTANCEMP、SP1、BP1、BP2 四个节点全部出现且状态均为 OPEN,集群正常运行。

dpc-master (192.168.233.101) 上执行:

-- 1. 创建表空间(如果还没创建) CREATE TABLESPACE TBS_TEST DATAFILE 'TBS_TEST.dbf' SIZE 128 AUTOEXTEND ON NEXT 128 MAXSIZE 2048; -- 2. 创建测试表 CREATE TABLE test_table (id INT, name VARCHAR(50)) TABLESPACE TBS_TEST; -- 3. 插入数据 INSERT INTO test_table VALUES (1, 'Cluster Test 1'); INSERT INTO test_table VALUES (2, 'Cluster Test 2'); COMMIT; -- 4. 查询验证 SELECT * FROM test_table;

image.png

  1. ✅ 所有节点在线:在 V$INSTANCE 中,MP、SP1、BP1、BP2 的状态都是 OPEN
  2. ✅ 写入成功INSERT 语句执行成功,数据被分发到了 BP 节点。
  3. ✅ 读取成功SELECT * FROM test_table; 返回插入的数据,集群的读写链路正常。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服