达梦 DMDPC 集群部署学习文档
一个完整的 DMDPC 架构由计划生成节点 SP、数据存储节点 BP 和元数据服务器节点MP三部分组成。SP 对外提供分布式数据库服务,用户可以登录到任意一个 SP 节点,获得完整的数据库服务;BP 负责存储数据,执行 SP 的调度指令并将执行结果返回给 SP;MP 负责存储元数据并向 SP、BP 提供元数据服务。SP 节点不存储数据,配置成单机即可。MP 和 BP 节点既可以配置成单机,也可以配
DMDPC概述
1、DMDPC简介
一个完整的 DMDPC 架构由计划生成节点 SP、数据存储节点 BP 和元数据服务器节点MP三部分组成。
SP 对外提供分布式数据库服务,用户可以登录到任意一个 SP 节点,获得完整的数据库服务;
BP 负责存储数据,执行 SP 的调度指令并将执行结果返回给 SP;
MP 负责存储元数据并向 SP、BP 提供元数据服务。
SP 节点不存储数据,配置成单机即可。MP 和 BP 节点既可以配置成单机,也可以配置成多副本系统。其中每一个多副本系统中只有一个作为主节点,其余节点均作为备份节点。
2、DMDPC架构
一个最小的 DMDPC 集群包含一个 BP、一个 SP 和一个 MP。可以在部署完毕后随时增添新的 BP、SP 节点。至少需要两台 BP 才方便看出子任务的各种计划形态和调度。
下图是一个典型的 DMDPC 架构图。
1.1. 计划生成节点(SQL Processor,SP)
对外响应数据库请求,生成并调度计划。
1.2. 数据存储节点(Backend Processor,BP)
存储实际的数据,接收并执行发来的子计划。
1.3. 元数据节点(Metadata Processor,MP)
提供元数据服务。
SP 节点不存储数据,配置成单副本即可。MP 和 BP 节点既可以配置成单副本,也可以配置成多副本系统。其中每一个多副本系统中只有一个作为主节点,其余节点均作为备份节点。
DM 多副本系统由 N 个节点实例组成,N 必须是大于 1 的奇数。只有配置了 RAFT 归档的实例才能加入多副本系统。
多副本实例之间通过 XMAL 模块进行 TCP 消息通讯。各个节点实例之间基于RAFT协议选举出一个领导者作为主库,其他实例作为备库(也就是副本)角色运行,与传统的数据守护集群架构相比,此方案不再依赖守护进程和监视器。主库会自动向备库同步日志,备库接收并重新应用日志,从而达到主备库之间数据保持一致的目的。
在 BP 多副本系统中,可通过V A R C H S T A T U S 和 V ARCH_STATUS和 V ARCHSTATUS和VRLOG_RAFT_INFO来查看整个系统中主备环境的运行状况。
在 MP 多副本系统中,可通过V A R C H S T A T U S 和 V ARCH_STATUS 和 V ARCHSTATUS和VRLOG_RAFT_INFO 来查看整个系统中主备环境的运行状况。
RAFT 组:
拥有相同数据的一个或多个节点共同构成一个 RAFT 组。RAFT 组中的节点个数为奇数。多副本系统基于 RAFT 算法,管理组内的节点,并始终维护一个主节点,保持 RAFT 组内的数据一致性。
BP 域:
一个实例或一组实例所在的位置。
表空间组
表空间组是一组位于相同 RAFT 或者不同 RAFT 上的表空间集合,用于用户建表或者指定用户默认的存储位置。
在 DMDPC 中,MP 包含 SYSTEM、MAIN、ROLL、RLOG 和 TEMP 表空间;SP 包含 TEMP 表空间;BP 包含 SYSTEM、ROLL、RLOG、TEMP 和用户表空间。
主要技术指标
- 最大的 RAFT 组数(包括 MP/SP/BP)为 1024;
- 最大的实例数(包括 MP/SP/BP)为 4096;
- 最大副本数为 9;
3、DML操作流程
DML 流程分为两种情况:一般流程和优化流程。优化流程是指在实际执行时,优化器会综合多种条件,对符合优化的细节进行优化之后形成的流程。EXPLAIN 查看执行计划时,包含 mpp_opt_flag(1)的即为优化流程下的执行计划,包含 mpp_opt_flag(0)的即为一般流程下的执行计划。
数据查询操作
- 客户端发送请求给 SP;
- SP 生成执行计划,同时 SP 向 MP 申请获取字典信息;
- MP 返回字典信息给 SP;
- 相关 BP 在子计划执行完成时将成功与否信息和/或请求调度信息返回 SP;
- SP 向客户端返回最终查询结果。
数据插入操作
SP 端的插入操作符计算出待插入数据所属的 BP 站点;
然后以站点为单位逐一发送插入操作符和待插入数据给 BP。
BP 端负责插入。
数据更新操作
一般流程:SP 上查询得到了待更新的记录,计算每条记录所属的 BP 站点,而后以站点为单位发送更新前后的记录。
优化流程:查询得到的待更新记录按照更新对象的分布方式进行分发,各个 BP 站点直接进行更新,节省一次 SP 中转。可优化的情况下,支持并发更新数据行时冲突自动重试,一般流程不支持,直接报错处理。
删除更新操作
一般流程:SP 上计算待删除记录的所属 BP 站点,以站点为单位发送待删除记录。
4、高性能
查询的执行计划被拆分为一系列子任务,这些子计划被分散到多个 BP,有效利用硬件资源;
通过将业务的不同表、或者同一表的不同分区拆分到多个 BP,甚至于多个主机,在面对高并发的 OLTP 型应用,集群可以极大地提升 IO 能力,分摊并发压力。
在多副本系统中,主库同步日志时不需要等待备库刷盘或重演完成,备库也以异步消息通知主库自己的日志刷盘进度,消除了主备库之间的消息同步等待时间。
5、分布式事务一致性
DMDPC 通过两阶段提交技术来保证多个 BP 之间的分布式事务一致性。
SP 作为全局事务的协调者,统一处理全局事务。BP 作为参与者,是被 SP 调度并执行事务的节点。SP 根据 BP 的响应来决定是否真正的执行并提交事务。
所有参与者 BP 要么一起提交要么一起回滚,始终保持事务一致性状态。
第一阶段 预提交: SP 向所有参与者 BP 广播预提交命令,BP 接收到预提交命令之后,将相关操作生成回滚日志写入回滚段并响应 SP
第二阶段 提交:SP 向所有参与者 BP 广播 COMMIT 命令,SP 收到所有参与者 BP 的 COMMIT 成功消息之后,直接响应客户端事务提交成功。二阶段提交时若遇到 BP 与 SP 通信中断,SP 会将提交任务交由异步任务进行处理并立即响应客户端事务提交成功。待故障 BP 与 SP 重新建立连接后,异步任务会自动重新执行二阶段提交,直到提交成功。客户端收到事务提交成功的消息,表示事务执行成功完成。
6、分布式事务的数据可见性
分布式集群中,事务常跨多个 BP 节点,各节点提交时序不一致,会破坏事务隔离性。为此达梦引入全局时钟 GTS,供 BP 节点判定数据可见性,保障集群事务隔离。
全局时钟由MP 节点统一管控,BP 节点执行事务语句、预提交及正式提交时,均向 MP 申请全局时钟值。
CA
CA 是BP 节点全局事务信息数组。BP 事务做预提交、提交时,向 MP 申请全局时钟值,同时在 CA 登记事务 TID、事务状态、全局时钟值。事务状态分预提交、提交,对应一阶段、二阶段提交;TID 全局唯一固定,事务状态流转时,CA 同步更新状态与时钟值。
MCA
MCA 是MP 节点维护的事务信息数组。事务提交向 MP 申请全局时钟时,MP 将事务TID、提交时钟值登记到 MCA,MCA 仅记录已完成提交的事务。
事务信息登记流程
- 事务修改数据,日志记录改该数据的事务号 TID;
- 事务一阶段预提交:CA 登记 TID、预提交状态及预提交时钟;
- 事务二阶段提交:MCA 登记 TID 与提交时钟,同时 CA 更新为提交状态及对应时钟。
数据可见性判断
- 只要是当前事务操作时钟值 cur_seq 之前的已提交事务修改的数据,对当前事务都是可见的。
- 在 CA 中判断:如果 ca_seq≤cur_seq,且 ca_flag 为“提交”,说明生成该数据的事务在 cur_seq 之前就已提交,则该数据对当前事务可见。
- 如果 ca_seq≤cur_seq,但 ca_flag 为“预提交”,说明生成该数据的事务在 cur_seq 之前已经成功预提交。那么需要结合 MCA 来进一步判断该事务是否已提交,进入下一步 MCA 中继续判断。如果 MCA 中找到了对应的 TID 和时钟值 mca_seq,且 mca_seg≤cur_seq,则该数据对当前事务可见。
- 其他情况均为不可见。
7、限制
集群中 SP、BP、MP 都有自己的实例名,这些实例名要求全局唯一,每个组件都是一个实例;
非分区表只落在一个 BP 上,分区表可以落在一个或多个 BP 上DMDPC 下,分区列同时也是分布列;
不支持空间索引、位图索引、位图连接索引、全局函数索引;
不支持表级备份;
不支持表空间级备份还原。
DMDPC 集群仅支持联机库级备份与联机归档备份。
二、集群部署规划
| RAFT组名 | 角色 | 实例名称 | IP | PORT_NUM | AP_PORT_NUM | 路径 |
|---|---|---|---|---|---|---|
| RAFT_1 | SP | SP1 | 192.168.6.100 | 5236 | 6000 | /dmdata/sp1 |
| RAFT_1 | BP | BP1 | 192.168.6.101 | 5237 | 6001 | /dpcdata/bp1 |
| RAFT_2 | BP | BP2 | 192.168.6.102 | 5238 | 6002 | /dmdata/bp2 |
| MP_RAFT | MP | MP | 192.168.6.103 | 5239 | 6003 | /dmdata/mp |
DPC集群部署步骤
1、部署DM8软件
- 前置操作:关闭防火墙、设置内核参数、limit参数、创建用户、挂载光盘等
./DMInstall.bin -i <<EOF
1
n
y
21
1
/dm
y
y
EOF
2、初始化实例
DM8软件部署完毕之后,根据集群部署规划初始化MP、BP、SP实例。
./dminit path=/dpcdata/bp1 instance_name=BP1 port_num=5237 ap_port_num=6000 dpc_mode=BP LOG_SIZE=256 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
./dminit path=/dpcdata/bp2 instance_name=BP2 port_num=5238 ap_port_num=6000 dpc_mode=BP LOG_SIZE=256 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
./dminit path=/dpcdata/sp1 instance_name=SP1 port_num=5236 ap_port_num=6000 dpc_mode=SP LOG_SIZE=256 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
./dminit path=/dpcdata/mp instance_name=MP port_num=5239 ap_port_num=6000 dpc_mode=MP LOG_SIZE=256 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
3、配置 MP.INI 文件
为 SP、BP 和 MP 实例配置 MP.INI 文件。
MP.INI 文件内容如下:
mp_host = 192.168.6.103
mp_port = 9000

将MP.INI 文件scp到各个节点
4、启动MP
初始化实例之后就可以启动MP实例,DMDPC 运行过程中,MP 需要始终处于开启状态。
[dmdba@mp bin]$ ./dmserver /dpcdata/mp/DAMENG/dm.ini dpc_mode=MP
file dm.key not found, use default license!
version info: develop
csek2_vm_t = 9672
nsql_vm_t = 336
prjt2_vm_t = 208
ltid_vm_t = 272
nins2_vm_t = 1160
nset2_vm_t = 272
ndlck_vm_t = 192
ndel2_vm_t = 736
slct2_vm_t = 352
nli2_vm_t = 200
aagr2_vm_t = 312
pscn_vm_t = 416
dist_vm_t = 1000
DM Database Server 64 V8 03134284488-20260212-314192-20200 startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2027-02-12
file lsn: 0
ndct db load finished, code:100
ckpt2_exec_immediately begin.
checkpoint begin, used_space[4096], free_space[536858624]...
checkpoint end, 2 pages flushed, used_space[8192], free_space[536854528].
checkpoint begin, used_space[8192], free_space[536854528]...
checkpoint begin, used_space[0], free_space[536862720]...
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct second level fill fast pool finished
ndct third level fill fast pool finished
ndct fill fast pool finished
pseg_set_gtv_trxid_low next_trxid in mem:[2002]
pseg_collect_mgr_items, total collect 0 active_trxs, 0 cmt_trxs, 0 pre_cmt_trxs, 0 to_release_trxs, 0 active_pages, 0 cmt_pages, 0 pre_cmt_pages, 0 to_release_pages, 0 used mgr pages, 0 mgr recs!
next_trxid in mem:[4004]
next_trxid = 6006.
pseg recv finished
nsvr_startup end.
uthr_pipe_create, create pipe[read:10, write:11]
aud sys init success.
aud rt sys init success.
5、将 MP、SP 和 BP 加入集群
增加 1 个 MP、1 个 SP 和 2 个 BP 节点。只有在注册当前登录 MP 节点后,才可以注册其余节点。后续增加 MP、SP 节点和 BP 节点无先后之分。
[root@mp ~]# su - dmdba
上一次登录:三 5月 20 01:01:34 CST 2026pts/3 上
[dmdba@mp ~]$ ll
总用量 0
[dmdba@mp ~]$ cd /dm/bin
[dmdba@mp bin]$ ./disql sysdba/Dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 190.504(ms)
disql V8
SQL>SP_CREATE_DPC_INSTANCE(NULL,'MP','MP',6003,5239, '192.168.6.103', '192.168.6.103','NORMAL',1,'MP instance');
DMSQL 过程已成功完成
已用时间: 203.261(毫秒). 执行号:72001.
SQL> SP_CREATE_DPC_RAFT('BP','RAFT_1');
DMSQL 过程已成功完成
已用时间: 65.556(毫秒). 执行号:72002.
SQL>SP_CREATE_DPC_INSTANCE('RAFT_1','BP1','BP',6001,5237, '192.168.6.101', '192.168.6.101','NORMAL',1,'BP instance');
DMSQL 过程已成功完成
已用时间: 26.073(毫秒). 执行号:72003.
SQL> SP_CREATE_DPC_RAFT('BP', 'RAFT_2');
DMSQL 过程已成功完成
已用时间: 6.710(毫秒). 执行号:72004.
SQL>SP_CREATE_DPC_INSTANCE('RAFT_2','BP2','BP',6002,5238, '192.168.6.102', '192.168.6.102', 'NORMAL', 1, 'BP instance');
DMSQL 过程已成功完成
已用时间: 13.128(毫秒). 执行号:72005.
SQL> SP_CREATE_DPC_BP_GROUP('BG_1', 'bp group1');
DMSQL 过程已成功完成
已用时间: 62.990(毫秒). 执行号:72006.
SQL> SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_1');
DMSQL 过程已成功完成
已用时间: 73.290(毫秒). 执行号:72007.
SQL> SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_2');
DMSQL 过程已成功完成
已用时间: 16.778(毫秒). 执行号:72008.
SQL> SP_CREATE_DPC_RAFT('SP', 'RAFT_SP1');
DMSQL 过程已成功完成
已用时间: 4.025(毫秒). 执行号:72009.
SQL>SP_CREATE_DPC_INSTANCE('RAFT_SP1','SP1','SP',6000,5236, '192.168.6.100', '192.168.6.100','NORMAL', 2, 'SP instance');
DMSQL 过程已成功完成
已用时间: 6.419(毫秒). 执行号:72010.
SQL>
6、检查注册是否成功
注册完以后,登录disql,执行sql检查是否注册成功,执行结果如下
SQL> select * from DPC_BP_GROUP;
行号 ID NAME DESCRIPTION RAFT_NUM RAFT_INFO INFO1 INFO2 INFO3
---------- ----------- ---- ----------- ----------- ---------- ----------- -------------------- ----------
1 0 BG_1 bp group1 2 0x01000200 0 NULL NULL
已用时间: 49.749(毫秒). 执行号:72011.
SQL> select * from DPC_BP_RAFT;
行号 RAFT_ID GROUP_ID DPC_MODE NAME IS_VALID INFO1 INFO2 INFO3
---------- ----------- ----------- -------- -------- ----------- ----------- -------------------- ----------
1 0 -1 MP MP_RAFT 1 NULL NULL NULL
2 1 -1 BP RAFT_1 1 NULL NULL NULL
3 2 -1 BP RAFT_2 1 NULL NULL NULL
4 3 -1 SP RAFT_SP1 1 NULL NULL NULL
已用时间: 24.620(毫秒). 执行号:72012.
SQL> select * from DPC_INSTANCE;
行号 RAFT_ID INST_ID NAME DPC_MODE XMAL_PORT INST_PORT IP_INTERNAL SYS_MODE SYS_STATUS STATUS DESCRIPTION IP_EXTERNAL INFO1
---------- ----------- ----------- ---- -------- ----------- ----------- ------------- -------- ----------- ----------- ----------- ------------- -----------
INFO2 INFO3
-------------------- ----------
1 0 4096 MP MP 6003 5239 192.168.6.103 NORMAL 4 1 MP instance 192.168.6.103 9000
0 NULL
2 1 4097 BP1 BP 6001 5237 192.168.6.101 NORMAL 6 1 BP instance 192.168.6.101 NULL
0 NULL
3 2 4098 BP2 BP 6002 5238 192.168.6.102 NORMAL 6 1 BP instance 192.168.6.102 NULL
0 NULL
行号 RAFT_ID INST_ID NAME DPC_MODE XMAL_PORT INST_PORT IP_INTERNAL SYS_MODE SYS_STATUS STATUS DESCRIPTION IP_EXTERNAL INFO1
---------- ----------- ----------- ---- -------- ----------- ----------- ------------- -------- ----------- ----------- ----------- ------------- -----------
INFO2 INFO3
-------------------- ----------
4 3 4099 SP1 SP 6000 5236 192.168.6.100 NORMAL 6 2 SP instance 192.168.6.100 NULL
0 NULL
已用时间: 4.664(毫秒). 执行号:72013.
SQL>
7、 启动 SP 和 BP
- 根据上一步骤,检查注册没有问题就可以启动SP和BP了
./dmserver /dpcdata/sp1/DAMENG/dm.ini dpc_mode=SP
./dmserver /dpcdata/bp1/DAMENG/dm.ini dpc_mode=BP
./dmserver /dpcdata/bp2/DAMENG/dm.ini dpc_mode=BP
至此,DMDPC 集群搭建完毕。
MP、SP、BP 全部正常启动,且均处于 OPEN 状态,才是一个正常的 DMDPC 系统。
注意事项
当 BP 处于下述情况时,表示无可用 BP,系统异常,报错“无效的系统状态”。无可用 BP 的情况为:
1.BP 处于非 OPEN 状态;
2.BP 尚未成功启动;
3.BP 宕机。
DMDPC 搭建完成后,用户只需要连接对外提供服务的 SP,即可获得完整的数据库服务。
验证环境搭建是否成功,可以在 SP 上执行查询 V$instance,看是否所有 RAFT 组中实例都能够查到。
只有出于监控目的进行 V$视图的查询,或出于维护需要时,才允许直连 MP 和 BP,否则搭建完成后,不允许再连接 MP 和 BP。切勿在 MP 和 BP 上执行大量 SQL 语句,否则可能会导致系统崩溃!
达梦社区地址:https://eco.dameng.com
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)