上篇我们看了MPP的基本概念和原理,如下:
DM7 达梦数据库 大规模并行处理 MPP (1) — 基本概念和原理
https://www.cndba.cn/dave/article/3657
本篇我们来看下MPP环境的搭建。
1 准备环境
本测试搭建一个两节点的MPP。两个节点都配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机。两节点实例名分别为 EP01 和 EP02,相关的 IP、端口等规划见下表。
| 实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL端口 | MPP_SEQNO |
|---|---|---|---|---|---|
| dave01 | 192.168.20.191 | 5236 | 192.168.56.191 | 5269 | 0 |
| dave02 | 192.168.20.192 | 5237 | 192.168.56.192 | 5270 | 1 |
DM MPP 各 EP 使用的 DM 服务器版本应一致,同时还应注意各 EP 所在主机的操作系统位数、大小端模式、时区及时间设置都应一致,否则可能造成意想不到的错误。
2 配置参数文件
2.1 配置 dm.ini
首先,在 EP01 和 EP02 上分别创建数据库,用户可以使用 DM7 的图形化客户端工具“数据库配置助手”或命令行工具 dminit 创建数据库。
具体方法参考我的博客:
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
在各 EP 上创建数据库时,要求有些初始化参数必须所有 EP 都相同。我们建议各 EP 的数据库初始化参数都保持一致,以免产生错误。
分别对两个实例的 dm.ini 进行配置。
修改 dave01 的 dm.ini 的以下几个参数如下:
INSTANCE_NAME = DAVE01
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
修改 dave02 的 dm.ini 的以下几个参数如下:
INSTANCE_NAME = DAVE02
PORT_NUM = 5237
MAL_INI = 1
MPP_INI = 1
2.2 配置 dmmal.ini
为两个 EP 配置 dmmal.ini 如下,配置完全一样,EP 间可互相拷贝。dmmal.ini 与dm.ini 放在相同的目录下。
[MAL_INST1]
MAL_INST_NAME = DAVE01
MAL_HOST = 192.168.56.191
MAL_PORT = 5269
MAL_INST_HOST = 192.168.20.191
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = DAVE02
MAL_HOST = 192.168.56.192
MAL_PORT = 5270
MAL_INST_HOST = 192.168.20.192
MAL_INST_PORT = 5237
2.3 配置 dmmpp.ctl
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 dmmpp.ini。
配置 dmmpp.ini 如下:
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = DAVE01
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = DAVE02
使用dmctlcvt 工具将 dmmpp.ini 转换成 dmmpp.ctl,dmctlcvt 工具在 DM 安装目录的“bin”子目录中。转换生成的 dmmpp.ctl 需要放在与 dm.ini 同一个目录。
[dave@www.cndba.cn dave01]$ cd /dm/dmdbms/bin/
[dave@www.cndba.cn bin]$
[dave@www.cndba.cn bin]$ dmctlcvt -help
DMCTLCVT V7.6.0.95-Build(2018.09.13-97108)ENT
Format: ./dmctlcvt KEYWORD=value
Note: ctl file name must be dm.ctl or dmmpp.ctl or dmwatcher.ctl
Keyword Explanation
--------------------------------------------------------------------------------
TYPE 1 convert ctl file(dm.ctl or dmmpp.ctl) to txt file
2 convert txt file to ctl file(dm.ctl or dmmpp.ctl)
3 convert txt file to ctl file(dmwatcher.ctl), the dest_file_path not include file name
4 convert ctl file(dmwatcher.ctl) to txt file
SRC Source file
DEST Destination file
DCR_INI the path of dmdcr.ini
HELP Show this help info
Example:
./dmctlcvt TYPE=1 SRC=/opt/dmdbms/data/dameng/dm.ctl DEST=/opt/dmdbms/data/dameng/dmctl.txt
./dmctlcvt TYPE=2 SRC=/opt/dmdbms/data/dameng/dmctl.txt DEST=/opt/dmdbms/data/dameng/dm.ctl
./dmctlcvt TYPE=3 SRC=/opt/dmdbms/data/dameng/dmwatcher.txt DEST=/opt/dmdbms/data/dameng
./dmctlcvt TYPE=4 SRC=/opt/dmdbms/data/dameng/dmwatcher.ctl DEST=/opt/dmdbms/data/dameng/dmwatcher_ctl.txt
[dave@www.cndba.cn bin]$ dmctlcvt TYPE=2 SRC=/dm/dmdbms/data/dave01/dmmpp.ini DEST=/dm/dmdbms/data/dave01/dmmpp.ctl
DMCTLCVT V7.6.0.95-Build(2018.09.13-97108)ENT
Can not open ini file !
convert txt to ctl success!
[dave@www.cndba.cn bin]$
将生成的 dmmpp.ctl 拷贝至另一台EP,保证 MPP 系统中所有 EP 的 dmmpp.ctl 完全相同。
3 运行 MPP
经过前面的步骤,DM MPP 环境已经配置完成了。分别启动 DAVE01 和 DAVE02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据库操作了。
[dave@www.cndba.cn dave01]$ service DmServicedave01 start
Starting DmServicedave01: [ OK ]
[dave@www.cndba.cn dave01]$
[dave@www.cndba.cn dave02]$ service DmServicedave02 start
Starting DmServicedave02: [ OK ]
[dave@www.cndba.cn dave02]$
4 建立分布表
DM MPP 支持表数据的哈希分布、随机分布、复制分布、范围分布、LIST 分布类型,用户可根据实际情况选择合适的分布类型。
MPP 的数据分布类型和具体设置在建表时指定,语法如下:
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 <实例名>
测试:
#创建用户和表空间:
#以下操作在任意EP节点执行,所有EP节点都可见:
SQL> create tablespace cndba datafile '/dm/dmdbms/data/dave01/cndba01.DBF' size 64;
executed successfully
used time: 73.144(ms). Execute id is 835.
SQL>
SQL> create user cndba identified by "www.cndba.cn" default tablespace cndba;
executed successfully
used time: 30.780(ms). Execute id is 836.
SQL>
SQL> grant resource to cndba;
executed successfully
used time: 19.003(ms). Execute id is 870.
SQL> conn cndba/"www.cndba.cn"
Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 14.028(ms)
SQL>
#创建哈希分布表 T_HASH,分布列为 C1。
SQL> create table t_hash(c1 int, c2 char(10)) distributed by hash (c1);
executed successfully
used time: 25.693(ms). Execute id is 871.
#创建随机分布表 T_RANDOM。
SQL> create table t_random(c1 int, c2 char(10)) distributed randomly;
executed successfully
used time: 15.876(ms). Execute id is 872.
#创建复制分布表 T_FULLY。
SQL> create table t_fully(c1 int, c2 char(10)) distributed fully;
executed successfully
used time: 23.486(ms). Execute id is 873.
#创建范围分布表 T_RANGE,分布列为 C1。
SQL> create table t_range (c1 int, c2 char(10)) distributed by range(c1) (values equ or less than (100) on dave01, values less than(maxvalue) on dave02);
executed successfully
used time: 29.525(ms). Execute id is 874.
SQL>
#创建 LIST 分布表 T_LIST,分布列为 C1。
SQL> create table t_list(c1 int, c2 char(10)) distributed by list (c1) (values(3) on dave01,values(4) on dave02);
executed successfully
used time: 21.162(ms). Execute id is 875.
#创建哈希分布表的范围水平分区表。
SQL> create table t_hash_range_partition
2 (c1 int, c2 char(10), c3 char(10))
3 partition by range(c1)
4 (
5 partition part_1 values less than(0) ,
6 partition part_2 values less than(10) ,
7 partition part_3 values less than(100) ,
8 partition part_4 values less than(maxvalue)
9 )
10 distributed by hash (c1);
executed successfully
used time: 35.026(ms). Execute id is 876.
SQL>
在创建分布表时,用户应注意以下一些使用限制:
1)单机模式下建的分布表和普通表一样,但是不能创建指定实例名的分布表(如范围分布表和 LIST 分布表);
2)在 MPP 模式下创建分布表,如果未指定列则默认为 RANDOMLY(随机)分布表;
3)分布列类型不支持 BLOB、CLOB、IMAGE、TEXT、LONGVARCHAR、BIT、BINARY、VARBINARY、LONGVARBINARY、时间间隔类型和用户自定义类型;
4)HASH 分布、RANGE 分布、LIST 分布允许更新分布列,并支持包含大字段列的表的分布列更新,但包含 INSTEAD OF 触发器的表、垂直分区表、堆表不允许更新分布列;
5)对于 FULLY(复制)分布表,只支持单表查询的更新和删除操作,并且查询项或者条件表达式中都不能包含 ROWID 伪列表达式;
6)RANGE(范围)分布表和 LIST(列表)分布表,分布列与分布列值列表必须一致,并且指定的实例名不能重复; 引用约束的引用列和被引用列都必需包含分布列,且分布情况完全相同;
7)随机分布表不支持 UNIQUE 索引。
5 快速数据装载
DM MPP 特别适合于海量数据的存储和处理,因此在应用中常常面临将大量数据从某个或某些历史数据库中装载到 MPP 系统的需求。为了满足海量数据的快速装载需求,DM 提供了快速装载工具 dmfldr,能够对 DM 单机版和 MPP 系统进行海量数据的快速装载。
dmfldr 为命令行工具,使用时必须指定必要的执行参数。dmfldr 支持 MPP 环境下的两种数据加载模式:客户端分发模式和本地分发模式,通过参数 MPP_CLIENT 进行设置。
使用客户端分发模式时,数据在 dmfldr 客户端进行分发然后直接向指定 EP 发送数据;
使用本地分发模式时,每个 EP 对应一个 dmfldr 和一份数据,每个 dmfldr 只选择出对应本节点的数据并发送,不管其他节点的数据。默认使用客户端分发模式。
6 停止 MPP 系统
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。若在 DM MPP 系统的运行过程中,某一 EP 发生故障停机,则整个 MPP 系统将处于不能正常服务的状态。
当前所有的用户会话会被系统断开,不能进行全局登录,只能进行本地登录。因此,为了保证 MPP 系统的高可用性,我们强烈建议采用 DM MPP 与数据守护相结合的部署方案。
7 MPP的使用限制
DM MPP 支持绝大多数单机版 DM 的功能,但在某些小的功能点使用上存在一些使用限制,具体如下:
1)MPP 环境下,不支持创建 SET NULL 或 SET DEFAULT 约束检查规则的引用约束;
2)MPP 环境下不支持创建外部表;
3)MPP 环境下不支持修改表的 ADD [COLUMN] <列名>[]子句;
4)MPP 环境下不支持创建函数索引、位图索引、空间索引、数组索引;
5)MPP 环境下不支持索引的 ONLINE 选项;
6)MPP 环境下不支持视图的 WITH CHECK OPTION 操作;
7)MPP 环境下不支持闪回查询;
8)MPP 环境下不支持物化视图日志。
版权声明:本文为博主原创文章,未经博主允许不得转载。



