这篇文章记录了我从零开始搭建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部署在同一台机器上是完全可行的。
达梦提供了 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
mp.ini 是集群的“通讯录”,它告诉每个节点:MP 在哪里。因为MP部署在 192.168.233.101 上,所以所有节点的 mp.ini 都指向这个地址:
mp_host = 192.168.233.101
mp_port = 9000
在 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
在 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
在 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
验证配置文件是否生成,在每台机器上执行:
cat /home/dmdba/dpc_data/*/DAMENG/mp.ini
每台机器上都会输出:
./dmserver /home/dmdba/dpc_data/mp/DAMENG/dm.ini dpc_mode=MP
DMDPC运行过程中,MP需要始终处于开启状态。
只有在注册当前登录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;
在 DPC-Master 上启动 SP1
./dmserver /home/dmdba/dpc_data/sp1/DAMENG/dm.ini dpc_mode=SP
在 DPC-Node1 上启动 BP1
./dmserver /home/dmdba/dpc_data/bp1/DAMENG/dm.ini dpc_mode=BP
在DPC-Node2 上启动 BP2
./dmserver /home/dmdba/dpc_data/bp2/DAMENG/dm.ini dpc_mode=BP
在启动 DPC 集群的 BP(数据存储节点)节点时,执行启动命令后,终端输出显示 version info: develop,但未出现预期的SYSTEM IS READY提示信息。
并且在执行 SELECT * FROM V$INSTANCE; 查询集群状态时,只看到 MP 和 SP 节点,而两个 BP 节点未出现在结果中:
在 DPC 集群搭建过程中,所有节点(MP、SP、BP)均已正常启动,但通过 V$INSTANCE 查询时,BP 节点始终未显示为 OPEN 状态,集群无法正常工作。
ps -ef | grep dmserver 确认所有节点进程均在运行。ss -tulnp 确认各节点端口(52365239、60006003、9000)均已正常监听。ping 测试三台虚拟机之间网络互通正常。systemctl status firewalld 发现防火墙仍处于 active (running) 状态。彻底关闭防火墙并禁用其开机自启:
# 停止防火墙服务
systemctl stop firewalld
# 禁用防火墙开机自启
systemctl disable firewalld
# 确认状态为 inactive (dead)
systemctl status firewalld
防火墙关闭后,重新启动所有 DPC 节点,发现BP节点出现:SYSTEM IS READY提示信息。
查询 V$INSTANCE,MP、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;
V$INSTANCE 中,MP、SP1、BP1、BP2 的状态都是 OPEN。INSERT 语句执行成功,数据被分发到了 BP 节点。SELECT * FROM test_table; 返回插入的数据,集群的读写链路正常。文章
阅读量
获赞
