MPP(大规模并行处理,Massively Parallel Processing)是分布式并行数据库架构,采用多节点对等无共享(Share-Nothing) 设计。集群内每个节点拥有独立 CPU、内存、磁盘、达梦实例,节点之间相互对等,不存在传统主库、备库角色。
数据按照分布规则打散存储在各个节点本地磁盘,SQL 请求接收节点协调多个节点并行执行计算,各节点独立处理本地数据,节点间通过高速网络完成数据交互,依靠并行能力提升海量数据查询、批量加载性能。
本次部署无主备模式 DM8 MPP 集群,来熟悉MPP原理和搭建过程。
配置一个两节点的MPP集群,实例名为EP01和EP02,相关配置信息如下。
VMware Workstation 搭建两台 CentOS 7/8 虚拟机,每台虚拟机配置两块虚拟网卡:
| 实例名 | MAL_INST_HOST(业务 IP) | PORT_NUM | MAL_HOST(集群通信 IP) | MAL_PORT | MPP_SEQNO |
|---|---|---|---|---|---|
| EP01 | 192.168.137.137 | 5236 | 192.168.137.137 | 5231 | 0 |
| EP02 | 192.168.137.138 | 5236 | 192.168.137.138 | 5231 | 1 |
创建实例EP01
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=Y DB_NAME=DM INSTANCE_NAME=EP01 PORT_NUM=5236 LOG_SIZE=2048 SYSDBA_PWD=Tristan4304 SYSAUDITOR_PWD=Tristan4304
创建实例EP02
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=Y DB_NAME=DM INSTANCE_NAME=EP02 PORT_NUM=5236 LOG_SIZE=2048 SYSDBA_PWD=Tristan4304 SYSAUDITOR_PWD=Tristan4304
注意:两台机器关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1 修改dm.ini
cd /dmdata/data/DM
vi dm.ini
INSTANCE_NAME = EP01
PORT_NUM = 5230
MAL_INI = 1
MPP_INI = 1
2 创建dmmal.ini
cd /dmdata/data/DM
vi dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.137.137
MAL_PORT = 5231
MAL_INST_HOST = 192.168.137.137
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 192.168.137.138
MAL_PORT = 5231
MAL_INST_HOST = 192.168.137.138
MAL_INST_PORT = 5236
3 配置dmmpp.ini
vi /dmdata/data/DM/dmmpp.ini
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = EP01
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = EP02
4 生成二进制 dmmpp.ctl
使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl,dmctlcvt工具在DM安装目录的“bin”子目录中。转换生成的dmmpp.ctl需要放在与dm.ini同一个目录。下面的命令将dmmpp.ini转换为dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。
su - dmdba
cd /home/dmdba/dmdbms/bin
# TYPE=2 文本ini → 二进制ctl
./dmctlcvt TYPE=2 SRC=/dmdata/data/DM/dmmpp.ini DEST=/dmdata/data/DM/dmmpp.ctl
1 修改dm.ini
cd /dmdata/data/DM
vi dm.ini
INSTANCE_NAME = EP02
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
2 创建dmmal.ini
cd /dmdata/data/DM
vi dmmal.ini
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.137.137
MAL_PORT = 5231
MAL_INST_HOST = 192.168.137.137
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 192.168.137.138
MAL_PORT = 5231
MAL_INST_HOST = 192.168.137.138
MAL_INST_PORT = 5236
3 生成二进制 dmmpp.ctl
将生成后的dmmpp.ctl文件拷贝到另一个MPP节点,确保所有的MPP节点的dmmpp.ctl文件一致
# EP01节点执行
su - dmdba
scp /dmdata/data/DM/dmmpp.ctl dmdba@192.168.137.138:/dmdata/data/DM/
EP01:
/home/dmdba/dmdbms/bin/dmserver /dmdata/data/DM/dm.ini
EP02:
/home/dmdba/dmdbms/bin/dmserver /dmdata/data/DM/dm.ini
环境验证:
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
建立不同的分布式表验证是否根据分布列进行自动分发
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');
-- 验证数据分布(正确方法)
-- MPP系统下设置当前会话是否只查询本节点数据。如果不设置,表示可以查询全部节点数据,0表示全部,1表示当前节点
SP_SET_SESSION_MPP_SELECT_LOCAL(0);
-- 查询MPP系统下当前会话是否只查询本节点数据。0表示查询全部节点数据,1表示只查询本节点数据
SELECT SF_GET_SESSION_MPP_SELECT_LOCAL();
-- 统计 MPP 环境下表在各个节点的数据行数
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');
-- 验证数据分布(正确方法)
--统计 MPP 环境下表在各个节点的数据行数
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');
--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_FULLY');
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');
--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_RANGE');
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');
--统计 MPP 环境下表在各个节点的数据行数
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');
--统计 MPP 环境下表在各个节点的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','T_HASH_RANGE_PARTITION');
哈希分布:数据均匀分布,相同键值总在同一节点,适合JOIN操作频繁的表
随机分布:数据完全随机分布,适合没有明显JOIN需求的表
复制分布:每个节点有完整数据副本,适合小表、维度表
范围分布:按范围值分布数据,适合范围查询频繁的场景
LIST分布:按离散值分布,适合有明显分类属性的数据
组合分布:可以结合分区和分布策略实现更复杂的数据分布
文章
阅读量
获赞
