1、概述
达梦大规模并行处理 MPP(DM Massively Parallel Processing,缩写 DM MPP)是基于达梦数据库管理系统研发的完全对等无共享式集群组件,支持将多个 DM 数据库实例组织为一个并行计算网络,对外提供统一的数据库服务。使用 DM MPP 可获得以下功能特性支持:
- 支TB/PB 级数据分析:持数据的并行装载和操作的并行执行,数据分布式存储在各 EP 中,能支持 TB/PB 级数据分析。
- 功能完善:支持绝大部分的 DM 单机版功能,同时支持行、列存储,支持存储过程、触发器、索引、分区表、多媒体数据类型等。
- 高性价比:无需额外配置特殊软、硬件,性价比超高。
- 高可靠性:DM MPP 与 DM 数据守护相结合,为 MPP 系统中的每个 EP 配置一个或多个实时备库,在 EP 发生故障时其对应备库能迅速切换为主库继续提供服务,确保系统的高可用性。
- 超大型集群:支持最多 1024 个 EP,轻松组建超大型集群。
2、环境规划
2.1、IP及端口规划
配置一个两节点 MPP。两个节点都配置两块网卡,一块接入内部网络交换模块,一
块接入到外部交换机。两节点实例名分别为 EP01 和 EP02,相关的 IP、端口等规划见下表。
实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL_PORT | MPP_SEQNO |
EP01 | 192.168.188.61 | 5236 | 192.168.228.61 | 5269 | 0 |
EP02 | 192.168.188.62 | 5237 | 192.168.228.61 | 5270 | 1 |
2.2、目录规划
数据库软件安装目录 | /home/dmdba/dmdbms |
实例安装目录 | /dmdata/ |
备份文件存放目录 | /dmdata/dmbak |
注意:DM MPP各EP使用的DM服务器版本应一致,同时还应注意各EP所在主机的操作系统位数、大小端模式、时区及时间设置都应一致,否则可能造成意想不到的错误。
3、操作系统配置
3.1、关闭防火墙
关闭防火墙并禁用开机自启
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
3.2、关闭selinux
setenforce 0
sed -i s:^SELINUX=.*$:SELINUX=disabled:g /etc/selinux/config
cat /etc/selinux/config
3.3、修改主机名
hostnamectl set-hostname ep01
hostnamectl set-hostname ep02
3.4、配置hosts文件
192.168.188.61 ep01
192.168.188.62 ep02
3.5、配置用户资源限制
vim /etc/security/limits.conf
dmdba soft nice 0
dmdba hard nice 0
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft data unlimited
dmdba hard data unlimited
3.6、修改内核参数
vim /etc/sysctl.conf
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
kernel.core_pattern = /dmdata/core.%p
vm.swappiness=10
vm.dirty_background_ratio = 0
vm.min_free_kbytes = 2097152
sysctl -p
3.7、检查系统信息
[root@ep01 ~]# getconf LONG_BIT
64
3.8、检查系统版本
[root@ep01 ~]# cat /etc/system-release
CentOS Linux release 7.7.1908 (Core)
4、安装数据库
在EP01 和 EP02 上分别创建数据库,详细步骤此处省略。
5、MPP环境搭建
5.1、配置 dm.ini
分别对两个实例的 dm.ini 进行配置。
修改 EP01 的 dm.ini 的以下几个参数如下:
MAL_INI = 1
MPP_INI = 1
修改 EP02 的 dm.ini 的以下几个参数如下:
MAL_INI = 1
MPP_INI = 1
5.2、配置dmmal.ini
为两个 EP 配置 dmmal.ini 如下,配置完全一样,EP 间可互相拷贝。dmmal.ini 与 dm.ini 放在相同的目录下。
[dmdba@ep01 dmmpp]$ cat dmmal.ini
[MAL_INST1]
MAL_INST_NAME = ep01 #与实例名保持一致
MAL_HOST = 192.168.228.61 #私网IP
MAL_PORT = 5269 #MAL内部通讯端口
MAL_INST_HOST = 192.168.188.61 #公网IP
MAL_INST_PORT = 5236 #与dm.ini里面的NUM_PORT端口保持一致
[MAL_INST2]
MAL_INST_NAME = ep02
MAL_HOST = 192.168.228.62
MAL_PORT = 5270
MAL_INST_HOST = 192.168.188.62
MAL_INST_PORT = 5237
5.3、配置dmmpp.ctl
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 dmmpp.ini。
配置 dmmpp.ini 如下:
[dmdba@ep01 dmmpp]$ cat dmmpp.ini
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = ep01
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = ep02
使用 DM 提供的工具 dmctlcvt 将 dmmpp.ini 转换成 dmmpp.ctl,dmctlcvt 工具在 DM 安装目录的“bin”子目录中。
转换生成的 dmmpp.ctl 需要放在与 dm.ini 同一个目录。
下面的命令将 dmmpp.ini 转换为 dmmpp.ctl,命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。
[dmdba@ep01 dmmpp]$ dmctlcvt TYPE=2 SRC=/dmdata/dmmpp/dmmpp.ini DEST=/dmdata/dmmpp/dmmpp.ctl
DMCTLCVT V8
convert txt to ctl success!
将生成的 dmmpp.ctl 拷贝至另一 EP,保证 MPP 系统中所有 EP 的 dmmpp.ctl 完全相同。
[dmdba@ep01 dmmpp]$ scp dmmpp.ctl dmdba@192.168.228.62:/dmdata/dmmpp/
5.4、运行MPP
经过前面四个步骤,DM MPP 环境已经配置完成了。分别启动 EP01 和 EP02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据库操作了。
[root@ep01 ~]# systemctl start DmServiceep01.service
[root@ep02 ~]# systemctl start DmServiceep02.service
[root@ep01 ~]# su - dmdba
[dmdba@ep01 ~]$ disql sysdba/Dameng123
SQL> select NAME,INSTANCE_NAME,INSTANCE_NUMBER,HOST_NAME,STATUS$,MODE$ from v$instance;
5.5、停止MPP
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。
若在 DM MPP 系统的运行过程中,某一 EP 发生故障停机,则整个 MPP 系统将处于不能正常服务的状态。当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。
6、创建分布表
DM MPP支持表数据的哈希分布、随机分布、复制分布、范围分布、LIST分布类型,用户可根据实际情况选择合适的分布类型。MPP的数据分布类型和具体设置在建表时指定,语法如下,建表的其他语法分支可参见《DM8_SQL语言使用手册》。
CREATE [[GLOBAL] TEMPORARY] TABLE <表名定义> <表结构定义>;
<表结构定义>::=<表结构定义1> | <表结构定义2>
<表结构定义1>::= (<列定义> {,<列定义>}[,<表级约束定义>{,<表级约束定义>}]) [ON COMMIT <DELETE | PRESERVE> ROWS] [<PARTITION子句>] [<空间限制子句>] [<STORAGE子句>] [<压缩子句>] [<ROW MOVEMENT子句>] [<DISTRIBUTE子句>]
<表结构定义2>::= [ON COMMIT <DELETE | PRESERVE> ROWS] [<空间限制子句>]
[<STORAGE子句>] [<压缩子句>]AS <不带INTO的SELECT语句>[<DISTRIBUTE子句>];
<DISTRIBUTE子句>::=DISTRIBUTED[<RANDOMLY>|<FULLY>]
|DISTRIBUTED BY [<HASH>] (<列名> {,<列名>})
|DISTRIBUTED BY RANGE (<列名> {,<列名>})(<范围分布项> {,<范围分布项>})
|DISTRIBUTED BY LIST (<<列名> {,<列名>}>)(<LIST分布项>
{,<LIST分布项>})
<范围分布项>::= VALUES LESS THAN (<表达式>{,<表达式>}) ON <实例名>
|VALUES EQU OR LESS THAN (<表达式>{,<表达式>}) ON <实例名>
<LIST分布项>::= VALUES (<表达式>{,<表达式>}) ON<实例名>
创建哈希分布表T_HASH,分布列为C1。
[dmdba@ep01 ~]$ disql sysdba/Dameng123:5236
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 16.757(ms)
disql V8
SQL> create table t_hash(c1 int,c2 varchar(50)) distributed by hash(c1);
操作已执行
已用时间: 154.646(毫秒). 执行号:500.
SQL> begin
for i in 1 .. 100000 loop
insert into t_hash values(i,'a'||i);
end loop;
commit;
end;
/
获取表 T_HASH 在每个实例上的数据行数
7、MPP系统过程与系统视图常见用法
(1)获取会话连接的 EP 的节点序号
SQL> SELECT SF_GET_SELF_EP_SEQNO(); 行号 SF_GET_SELF_EP_SEQNO() ---------- ---------------------- 1 0 已用时间: 0.455(毫秒). 执行号:572543. |
(2)根据 ROWID 获取本行数据来自哪个 EP
SELECT SF_GET_EP_SEQNO(ROWID); |
(3)获取 EP 节点配置信息
SQL> SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO(); 行号 SERVICE_NAME INST_NAME EP_SEQNO STATE ---------- ------------- --------- ----------- ----- 1 SERVICE_NAME1 EP01 0 OK 2 SERVICE_NAME2 EP02 1 OK 已用时间: 5.044(毫秒). 执行号:572547. SQL> |
(4)获取当前会话连接的实例名
SQL> SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO(); 行号 NAME ---------- ---- 1 EP01 已用时间: 6.177(毫秒). 执行号:572549. SQL> |
(5)获取 MPP 系统内所有 EP 的所有会话
SELECT * FROM V$SESSIONS; |
(6)获取当前连接的实例上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO(); |
(7)获取实例 EP01 上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = (SELECT DISTINCT EP_SEQNO FROM V$MPP_CFG_ITEM WHERE INST_NAME ='EP01'); |
(8)获取表 TEST 在每个实例上的数据行数
CALL SP_GET_EP_COUNT('SYSDBA','TEST'); |
(9)获取所接实例上的表 TEST 的使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST'); |
(10)获取每个实例上的表 TEST 使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST'), NAME FROM V$INSTANCE; |
(11)获取所有实例上表 TEST 的总使用空间
SELECT SUM(TOTAL_SIZE) FROM (SELECT TABLE_USED_PAGES('SYSDBA','TEST') TOTAL_SIZE, NAME FROM V$INSTANCE); |
更多学习资料请访问:https://eco.dameng.com




