前言
DMDPC(达梦分布式计算集群)是达梦数据库推出的分布式数据库解决方案,同时支持在线分析处理和在线事务处理。它既具备传统单机数据库的功能,又提供了分布式集群才拥有的高可用、高扩展、高性能等特性。
本文通过命令行方式部署DPC最小集群,帮助理解DPC各组件的角色能力,并验证多种数据分布方式。同时学习带副本和带影子副本的扩展思路。
一、DPC核心组件
| 组件 | 全称 | 功能 | 是否存数据 |
| MP | 元数据节点 | 管理集群元数据、字典信息 | 是 |
| SP | 计算节点 | 接收SQL、生成执行计划、调度任务 | 否 |
| BP | 数据存储节点 | 存储数据、执行子任务 | 是 |
二、环境准备
本文基于三台银河麒麟V10虚拟机部署DPC集群,各节点信息如下:
| 机器 | 主机名 | IP地址 | 角色 |
| DPC-1 | dpc1 | 192.168.74.141 | MP + SP |
| DPC-2 | dpc2 | 192.168.74.142 | BP |
| DPC-3 | dpc3 | 192.168.74.143 | BP |
各节点需提前完成达梦数据库软件安装,并确保网络互通、防火墙已关闭。克隆虚拟机后需分别修改IP和主机名,避免冲突。
三、节点规划
| 节点 | 实例名 | 端口 | AP端口 | 数据目录 |
| MP | MP | 5220 | 6000 | /home/dmdba/dpc/mp |
| SP | SP1 | 5236 | 6001 | /home/dmdba/dpc/sp1 |
| BP | BP1 | 5240 | 6010 | /dm8_data/dpc/bp1 |
| BP | BP2 | 5240 | 6020 | /dm8_data/dpc/bp2 |
四、初始化实例
4.1 初始化MP(DPC-1)
su - dmdba
mkdir -p /home/dmdba/dpc/mp
cd /dm8/bin
./dminit path=/home/dmdba/dpc/mp instance_name=MP port_num=5220 ap_port_num=6000 dpc_mode=MP SYSDBA_PWD=Dameng@2026 SYSAUDITOR_PWD=Dameng@2026
4.2 初始化SP(DPC-1)
mkdir -p /home/dmdba/dpc/sp1
./dminit path=/home/dmdba/dpc/sp1 instance_name=SP1 port_num=5236 ap_port_num=6001 dpc_mode=SP SYSDBA_PWD=Dameng@2026 SYSAUDITOR_PWD=Dameng@2026
4.3 初始化BP1(DPC-2)
mkdir -p /dm8_data/dpc/bp1
./dminit path=/dm8_data/dpc/bp1 instance_name=BP1 port_num=5240 ap_port_num=6010 dpc_mode=BP SYSDBA_PWD=Dameng@2026 SYSAUDITOR_PWD=Dameng@2026
4.4 初始化BP2(DPC-3)
mkdir -p /dm8_data/dpc/bp2
./dminit path=/dm8_data/dpc/bp2 instance_name=BP2 port_num=5240 ap_port_num=6020 dpc_mode=BP SYSDBA_PWD=Dameng@2026 SYSAUDITOR_PWD=Dameng@2026
五、配置mp.ini
在 DPC-1 上配置 MP 自己的 mp.ini
cd /home/dmdba/dpc/mp/DAMENG
echo “mp_host = 192.168.74.141” > mp.ini
echo “mp_port = 9000” >> mp.ini
cat mp.ini
在 DPC-1 上配置 SP1 的 mp.ini
cd /home/dmdba/dpc/sp1/DAMENG
echo “mp_host = 192.168.74.141” > mp.ini
echo “mp_port = 9000” >> mp.ini
cat mp.ini
在 DPC-2 上配置 BP1 的 mp.ini
cd /dm8_data/dpc/bp1/DAMENG
echo “mp_host = 192.168.74.141” > mp.ini
echo “mp_port = 9000” >> mp.ini
cat mp.ini
在 DPC-3 上配置 BP2 的 mp.ini
cd /dm8_data/dpc/bp2/DAMENG
echo “mp_host = 192.168.74.141” > mp.ini
echo “mp_port = 9000” >> mp.ini
cat mp.ini
各节点配置路径:
| 节点 | mp.ini 路径 |
| MP | /home/dmdba/dpc/mp/DAMENG/mp.ini |
| SP1 | /home/dmdba/dpc/sp1/DAMENG/mp.ini |
| BP1 | /dm8_data/dpc/bp1/DAMENG/mp.ini |
| BP2 | /dm8_data/dpc/bp2/DAMENG/mp.ini |
六、启动MP并注册节点
6.1 启动MP(DPC-1)
cd /dm8/bin
./dmserver /home/dmdba/dpc/mp/DAMENG/dm.ini dpc_mode=MP
保持这个终端运行,不要关闭
6.2 登录MP注册节点
./disql SYSDBA@192.168.74.141:5220
密码:Dameng@2026
– 注册MP
SP_CREATE_DPC_INSTANCE(NULL, ‘MP’, ‘MP’, 6000, 5220, ‘192.168.74.141’, ‘192.168.74.141’, ‘NORMAL’, 1, ‘MP instance’);
– 注册BP1
SP_CREATE_DPC_RAFT(‘BP’, ‘RAFT_BP1’);
SP_CREATE_DPC_INSTANCE(‘RAFT_BP1’, ‘BP1’, ‘BP’, 6010, 5240, ‘192.168.74.142’, ‘192.168.74.142’, ‘NORMAL’, 1, ‘BP instance’);
– 注册BP2
SP_CREATE_DPC_RAFT(‘BP’, ‘RAFT_BP2’);
SP_CREATE_DPC_INSTANCE(‘RAFT_BP2’, ‘BP2’, ‘BP’, 6020, 5240, ‘192.168.74.143’, ‘192.168.74.143’, ‘NORMAL’, 1, ‘BP instance’);
– 注册SP
SP_CREATE_DPC_RAFT(‘SP’, ‘RAFT_SP1’);
SP_CREATE_DPC_INSTANCE(‘RAFT_SP1’, ‘SP1’, ‘SP’, 6001, 5236, ‘192.168.74.141’, ‘192.168.74.141’, ‘NORMAL’, 2, ‘SP instance’);
COMMIT;
SELECT * FROM DPC_INSTANCE;
七、启动SP和BP
启动SP1(DPC-1):
cd /dm8/bin
./dmserver /home/dmdba/dpc/sp1/DAMENG/dm.ini dpc_mode=SP
保持这个终端运行!
启动BP1(DPC-2):
cd /dm8/bin
./dmserver /dm8_data/dpc/bp1/DAMENG/dm.ini dpc_mode=BP
保持这个终端运行!
启动BP2(DPC-3):
cd /dm8/bin
./dmserver /dm8_data/dpc/bp2/DAMENG/dm.ini dpc_mode=BP
保持这个终端运行!
八、验证集群
在 DPC-1 上连接 SP1:
su - dmdba
cd /dm8/bin
./disql SYSDBA@192.168.74.141:5236
密码:Dameng@2026
连接成功后执行:
SELECT * FROM V$INSTANCE;
九、数据分布方式测试
9.1 准备工作:创建表空间和表空间组
在测试各种分区方式前,需要先创建表空间和表空间组,这是数据跨节点分布的基础。
在各RAFT组上创建表空间
– RAFT_BP1上创建表空间
CREATE TABLESPACE TS_1 DATAFILE ‘TS_1.DBF’ SIZE 128 STORAGE(ON RAFT_BP1);
– RAFT_BP2上创建表空间
CREATE TABLESPACE TS_2 DATAFILE ‘TS_2.DBF’ SIZE 128 STORAGE(ON RAFT_BP2);
创建表空间组
SP_TS_GROUP_CREATE(‘TSG_ALL’, ‘覆盖所有RAFT组’);
SP_TS_GROUP_ADD_TS(‘TSG_ALL’, ‘TS_1’);
SP_TS_GROUP_ADD_TS(‘TSG_ALL’, ‘TS_2’);
9.2 Hash分区
特点:数据均匀分布,适合不确定分布列范围的场景,通过哈希算法确保相同键值始终分配到固定分区。
CREATE TABLE test_hash (
id INT PRIMARY KEY,
name VARCHAR(50),
create_time DATE
)
PARTITION BY HASH(id)
PARTITIONS 4
STORAGE(ON TSG_ALL);
插入测试数据
INSERT INTO test_hash VALUES (1, ‘Hash测试1’, SYSDATE);
INSERT INTO test_hash VALUES (2, ‘Hash测试2’, SYSDATE);
INSERT INTO test_hash VALUES (3, ‘Hash测试3’, SYSDATE);
COMMIT;
查看数据
SELECT * FROM test_hash;
查看数据分布
SELECT PARTITION_NAME, TABLESPACE_NAME,
(SELECT RAFT_ID FROM DPC_TABLESPACE WHERE NAME = a.TABLESPACE_NAME) AS RAFT_ID
FROM DBA_TAB_PARTITIONS a
WHERE TABLE_NAME = ‘TEST_HASH’
ORDER BY PARTITION_POSITION;
9.3 范围分区
特点:适合按时间、数值区间等有序维度分布的场景。
创建范围分区表
CREATE TABLE test_range (
sale_id INT,
sale_date DATE,
product VARCHAR(50),
amount DECIMAL(10,2)
)
PARTITION BY RANGE(sale_date) (
PARTITION p2024 VALUES LESS THAN (TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’))
STORAGE(ON TS_1),
PARTITION p2025 VALUES LESS THAN (TO_DATE(‘2026-01-01’, ‘YYYY-MM-DD’))
STORAGE(ON TS_2),
PARTITION pmax VALUES LESS THAN (MAXVALUE)
STORAGE(ON TS_1)
);
插入测试数据
INSERT INTO test_range VALUES (1, TO_DATE(‘2024-06-01’, ‘YYYY-MM-DD’), ‘产品A’, 100);
INSERT INTO test_range VALUES (2, TO_DATE(‘2025-06-01’, ‘YYYY-MM-DD’), ‘产品B’, 200);
INSERT INTO test_range VALUES (3, TO_DATE(‘2026-06-01’, ‘YYYY-MM-DD’), ‘产品C’, 300);
COMMIT;
查看数据分布
SELECT PARTITION_NAME, TABLESPACE_NAME
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = ‘TEST_RANGE’
ORDER BY PARTITION_POSITION;
9.4 List分区
特点:适合取值较固定的字符类型字段,支持对特定值集进行精准的数据归类和管理。
创建List分区表
CREATE TABLE test_list (
sale_id INT,
region VARCHAR(20),
product VARCHAR(50),
amount DECIMAL(10,2)
)
PARTITION BY LIST(region) (
PARTITION p_east VALUES (‘Beijing’, ‘Shanghai’, ‘Tianjin’)
STORAGE(ON TS_1),
PARTITION p_south VALUES (‘Guangzhou’, ‘Shenzhen’, ‘Fujian’)
STORAGE(ON TS_2),
PARTITION p_other VALUES (DEFAULT)
STORAGE(ON TS_1)
);
插入测试数据
INSERT INTO test_list VALUES (1, ‘Beijing’, ‘产品A’, 100);
INSERT INTO test_list VALUES (2, ‘Guangzhou’, ‘产品B’, 200);
INSERT INTO test_list VALUES (3, ‘Chengdu’, ‘产品C’, 300);
COMMIT;
查看数据分布
SELECT PARTITION_NAME, TABLESPACE_NAME
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = ‘TEST_LIST’
ORDER BY PARTITION_POSITION;
9.5 二级分区
特点:三种分区方式的任意组合,适用于多维度数据管理场景。
创建二级分区表
CREATE TABLE test_composite (
sale_id INT,
sale_date DATE,
region VARCHAR(20),
amount DECIMAL(10,2)
)
PARTITION BY RANGE(sale_date)
SUBPARTITION BY LIST(region)
SUBPARTITION TEMPLATE (
SUBPARTITION p_east VALUES (‘Beijing’, ‘Shanghai’),
SUBPARTITION p_south VALUES (‘Guangzhou’, ‘Shenzhen’),
SUBPARTITION p_other VALUES (DEFAULT)
)
(
PARTITION p2024 VALUES LESS THAN (TO_DATE(‘2025-01-01’, ‘YYYY-MM-DD’))
STORAGE(ON TS_1),
PARTITION p2025 VALUES LESS THAN (TO_DATE(‘2026-01-01’, ‘YYYY-MM-DD’))
STORAGE(ON TS_2)
);
插入测试数据
INSERT INTO test_composite VALUES (1, TO_DATE(‘2024-06-01’, ‘YYYY-MM-DD’), ‘Beijing’, 100);
INSERT INTO test_composite VALUES (2, TO_DATE(‘2024-06-01’, ‘YYYY-MM-DD’), ‘Guangzhou’, 150);
INSERT INTO test_composite VALUES (3, TO_DATE(‘2025-06-01’, ‘YYYY-MM-DD’), ‘Shanghai’, 200);
INSERT INTO test_composite VALUES (4, TO_DATE(‘2025-06-01’, ‘YYYY-MM-DD’), ‘Chengdu’, 250);
COMMIT;
查看一级分区分布
SELECT PARTITION_NAME, TABLESPACE_NAME
FROM DBA_TAB_PARTITIONS
WHERE TABLE_NAME = ‘TEST_COMPOSITE’
ORDER BY PARTITION_NAME;
查看二级分区分布
SELECT PARTITION_NAME, SUBPARTITION_NAME, TABLESPACE_NAME
FROM DBA_TAB_SUBPARTITIONS
WHERE TABLE_NAME = ‘TEST_COMPOSITE’
ORDER BY PARTITION_NAME, SUBPARTITION_NAME;
查询数据
SELECT * FROM test_composite;
9.6 分区策略对比总结
| 分区方式 | 适用场景 | 数据分布特点 |
| Hash分区 | 主键查询、高并发随机访问 | 均匀分布 |
| 范围分区 | 时间范围、数值区间查询 | 按有序维度分 |
| List分区 | 地区、状态等离散值 | 按固定值归类 |
| 二级分区 | 多维度组合查询 | 复合分布 |
十、带副本的DPC集群
在生产环境中,为避免单点故障,需要为BP节点配置副本。其核心思路是将同一个RAFT组从1个节点扩展为3个节点,以实现数据冗余和高可用。
初始化副本实例:在目标机器上,用 dminit 初始化 BP1_B 和 BP1_C 实例。
配置副本的 mp.ini:内容与主节点一致,指向 MP。
注册副本节点:在 MP 上执行以下命令,将副本加入对应的 RAFT 组:
SP_CREATE_DPC_INSTANCE(‘RAFT_BP1’, ‘BP1_B’, ‘BP’, 6011, 5241, ‘192.168.74.142’, ‘192.168.74.142’, ‘NORMAL’, 1, ‘BP1 replica’);
SP_CREATE_DPC_INSTANCE(‘RAFT_BP1’, ‘BP1_C’, ‘BP’, 6012, 5242, ‘192.168.74.143’, ‘192.168.74.143’, ‘NORMAL’, 1, ‘BP1 replica’);
启动副本实例:在对应机器上启动 dmserver,并在 SP 上通过 V$INSTANCE 验证集群节点。
十一、带影子副本的DPC集群
影子副本是一种特殊节点,不存储数据,但参与选举和事务提交,适用于存储资源有限但希望提升可用性的场景。
在现有 RAFT 组中添加影子节点,关键在于 DPC_MODE 参数要指定为 SHADOW:
SP_CREATE_DPC_INSTANCE(‘RAFT_BP1’, ‘BP1_SHADOW’, ‘BP’, 6013, 5243, ‘192.168.74.141’, ‘192.168.74.141’, ‘SHADOW’, 1, ‘BP shadow’);
注册后,通过 SELECT * FROM DPC_INSTANCE; 即可看到新节点类型为 SHADOW。
十二、总结
本文基于三台银河麒麟V10虚拟机,通过命令行完成了DMDPC分布式集群的部署,涵盖1个MP、1个SP和2个BP的完整搭建流程,并验证了Hash、范围、List及二级分区四种数据分布方式,展示了数据在不同BP节点间的分布机制。同时了解了带副本和带影子副本的扩展方式。
各组件核心职责如下:
• MP:管理集群元数据与字典信息,是集群的“大脑”。
• SP:接收 SQL 请求并调度任务,是集群的“入口”。
• BP:存储数据并执行计算,是集群的“手脚”。
文章
阅读量
获赞
