概念

达梦大规模并行计算集群(DM MPP)是达梦数据库面向海量数据分析场景推出的无共享(Shared-Nothing)分布式架构:它将数据通过哈希或随机方式水平分片到多台独立主机的本地存储,每个节点拥有完整的CPU、内存与磁盘资源,仅通过高速网络交换中间结果;协调节点接收用户SQL后自动完成语句解析、执行计划拆分与任务调度,各计算节点并行扫描、关联、聚合,最后汇总返回,实现PB级数据秒级响应;系统支持在线扩容、节点故障自动重试及数据多副本冗余,兼顾高性能、高可用与线性扩展能力,满足金融、运营商、政务等领域对超大规模数据仓库的严苛需求。

配置

节点

Ip地址

角色

硬件配置

实例端口

A

192.168.159.101

EP01

1核 CPU /2.8GB 内存 / 30GB 磁盘

5236

B

192.168.159.102

EP02

1核 CPU /2.8GB 内存 / 30GB 磁盘

5236

操作概要

首先,在两台服务器 A(192.168.159.101)和 B(192.168.159.102)上分别使用 dminit 工具创建两个独立的数据库实例 EP01 和 EP02,确保它们具有相同的 DB_NAME(DAMENG)、端口(5236)及初始化参数。随后,在每个节点的 DAMENG 目录下配置 dm.ini 文件,启用 MAL_INI=1 和 MPP_INI=1 以支持 MPP 功能。

接着,统一在两个节点上配置 dmmal.ini 文件,定义彼此的 MAL 通信信息,包括实例名、监听 IP 与端口等;同时编写 dmmpp.ini 文件,指定各实例在 MPP 集群中的序号(MPP_SEQ_NO)。使用 DM 提供的 dmctlcvt 工具将 dmmpp.ini 转换为二进制控制文件 dmmpp.ctl。

完成配置后,分别在两台服务器上启动 dmserver 服务,并通过 disql 登录验证。可通过查询 V $ MPP_CFG_ITEM 视图确认集群配置是否生效。之后可创建多种分布类型的表(如哈希、随机、全复制、范围、LIST 分布),并通过系统过程 SP_GET_EP_COUNT 查看数据在各节点的分布情况。

最后,在客户端或任一节点上配置 /etc/dm_svc.conf 文件,定义 MPP_CLUSTER 服务名及其连接策略,并通过 disql 使用服务名连接测试负载均衡效果,确保请求能自动分发至不同节点,实现 MPP 集群的高可用与并行处理能力。

MPP集群搭建

创建实例EP01

/home/dmdba/dmdbms/bin/dminit \
  PATH='/dmdata/data' INSTANCE_NAME=EP01 DB_NAME=DAMENG PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=512 \
  CHARSET=0 CASE_SENSITIVE=1 PORT_NUM=5236 SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123

创建实例EP02

/home/dmdba/dmdbms/bin/dminit \
  PATH='/dmdata/data' INSTANCE_NAME=EP02 DB_NAME=DAMENG PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=512 \
  CHARSET=0 CASE_SENSITIVE=1 PORT_NUM=5236 SYSDBA_PWD=Dameng@123 SYSAUDITOR_PWD=Dameng@123

AB配置dm.ini

vim /dmdata/data/DAMENG/dm.ini
MAL_INI = 1
MPP_INI = 1

AB配置dmmal.ini

vim /dmdata/data/DAMENG/dmmal.ini
[MAL_INST1]
MAL_INST_NAME            = EP01  #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST                 = 192.168.159.101  #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT                 = 5336  #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST            = 192.168.159.101  #实例的对外服务 IP 地址
MAL_INST_PORT            = 5236  #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致

[MAL_INST2]
MAL_INST_NAME            = EP02
MAL_HOST                 = 192.168.159.102
MAL_PORT                 = 5336
MAL_INST_HOST            = 192.168.159.102
MAL_INST_PORT            = 5236

AB配置dmmpp.ini

vim /dmdata/data/DAMENG/dmmpp.ini
[SERVICE_NAME1] 
MPP_SEQ_NO = 0 
MPP_INST_NAME = EP01
 
[SERVICE_NAME2] 
MPP_SEQ_NO = 1 
MPP_INST_NAME = EP02 

AB中使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中

su - root
chown -R dmdba:2002 /home/dmdba/dmdbms
chmod -R 755 /home/dmdba/dmdbms
cd /home/dmdba/dmdbms/bin
./dmctlcvt TYPE=2 SRC=/dmdata/data/DAMENG/dmmpp.ini  DEST=/dmdata/data/DAMENG/dmmpp.ctl

启动服务

/home/dmdba/dmdbms/bin/dmserver  /dmdata/data/DAMENG/dm.ini

登录SQL

/home/dmdba/dmdbms/bin/disql

检查环境

SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();

验证分布列是否自动分发

创建哈希分布表,分布列为C1

CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);
INSERT INTO T_HASH VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E'), (6, 'F'), (7, 'G');
SP_SET_SESSION_MPP_SELECT_LOCAL(0);
SELECT SF_GET_SESSION_MPP_SELECT_LOCAL();
CALL SP_GET_EP_COUNT('SYSDBA','T_HASH');

创建随机分布表

CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;
INSERT INTO T_RANDOM VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E'), (6, 'F'), (7, 'G');
CALL SP_GET_EP_COUNT('SYSDBA','T_RANDOM');

创建复制分布表

CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
INSERT INTO T_FULLY VALUES (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E'), (6, 'F'), (7, 'G');
CALL SP_GET_EP_COUNT('SYSDBA','T_FULLY');

创建范围分布表,分布列为C1

CREATE TABLE T_RANGE (C1 INT, C2 CHAR(10)) DISTRIBUTED BY RANGE (C1) (VALUES EQU OR LESS THAN (100) ON EP01, VALUES LESS THAN(MAXVALUE) ON EP02);
INSERT INTO T_RANGE VALUES (50, 'A'), (150, 'B'), (25, 'C'), (300, 'D'), (75, 'E');
CALL SP_GET_EP_COUNT('SYSDBA','T_RANGE');

创建LIST分布表,分布列为C1

CREATE TABLE T_LIST(C1 INT, C2 CHAR(10)) DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
INSERT INTO T_LIST VALUES (3, 'A'), (4, 'B'), (4, 'C'), (3, 'D'), (4, 'E');
CALL SP_GET_EP_COUNT('SYSDBA','T_LIST');

创建哈希分布表的范围水平分区表

CREATE TABLE T_HASH_RANGE_PARTITION (C1 INT, C2 CHAR(10), C3 CHAR(10))
PARTITION BY RANGE(C1)
(
PARTITION PART_1 VALUES LESS THAN(0) ,
PARTITION PART_2 VALUES LESS THAN(10) ,
PARTITION PART_3 VALUES LESS THAN(100) ,
PARTITION PART_4 VALUES LESS THAN(MAXVALUE)
)
DISTRIBUTED BY HASH (C1);
INSERT INTO T_HASH_RANGE_PARTITION VALUES (-5, 'A', 'X'), (5, 'B', 'Y'), (50, 'C', 'Z'), (500, 'D', 'W');
CALL SP_GET_EP_COUNT('SYSDBA','T_HASH_RANGE_PARTITION');

测试通过服务名连接MPP,连接可自动负载到不同节点。


AB创建dm_svc.conf

cat > /etc/dm_svc.conf <<'EOF'
TIME_ZONE=(480)
LANGUAGE=(CN)
MPP_CLUSTER=(192.168.159.101:5236,192.168.159.102:5236)
MPP_CLUSTER_LOGIN_MODE=(4)
MPP_CLUSTER_SWITCH_TIME=(3)
MPP_CLUSTER_SWITCH_INTERVAL=(10)
EOF

授权

chmod 644 /etc/dm_svc.conf
chown root:root /etc/dm_svc.conf 

验证服务名是否生效

for i in {1..6}; do
  /home/dmdba/dmdbms/bin/disql 'SYSDBA/"Dameng@123"@MPP_CLUSTER' <<'EOF'
select sf_get_self_ep_seqno();
exit
EOF
  sleep 10
done

顺序是011010,大致是一个交替出现的状态,正常的轮询结果。可以通过服务名登录,并且自动负载到不同节点。

https://eco.dameng.com

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐