目录
DM MPP主要针对海量数据的 OLAP 应用而研发,对普通的、并发量不大的一般 OLTP 或混合类型应用也适用,但不适合于高并发操作的 OLTP 类型应用。
MPP 系统需要通过网络在各 EP 间传递数据,因此网络的带宽对于 MPP 系统的效率非常重要,建议配置千兆或万兆内部网络。
1、DM MPP 环境搭建
系统规划
两个节点都配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机。两节点实例名分别为 EP01 和 EP02。
MPP系统规划
实例名 | MAL_INST_HOST | MAL_INST_PORT | MAL_HOST | MAL 端口 | MPP_SEQNO |
EP01 | 192.168.64.131 | 5236 | 192.168.169.141 | 5337 | 0 |
EP02 | 192.168.64.132 | 5236 | 192.168.169.142 | 5337 | 1 |
系统检查
防火墙关闭:
##防止 Linux 防火墙影响数据库的运行,设置开机禁用防火墙并关闭防火墙。
[root@localhost dmdba]#systemctl disable firewalld
[root@localhost dmdba]#systemctl stop firewalld
selinux 检查:
[root@localhost dmdba]#setenforce 0
[root@localhost dmdba]#vim /etc/selinux/config ##设置 selinux 状态为关闭
SELINUX=disabled
##修改后,保存退出
软件安装
两节点进行数据库软件安装,安装目录/dm,步骤略。
配置 dm.ini
在两个机器上分别初始化数据库,分别对两个实例的dm.ini进行配置。
A 机器上初始化库至目录/dm/data/EP01:
dminit path=/dm/data/EP01
B 机器上初始化库至目录/dm/data/EP02:
dminit path=/dm/data/EP02
修改 EP01 的 dm.ini :
INSTANCE_NAME = EP01
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
修改 EP02 的 dm.ini:
INSTANCE_NAME = EP02
PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
配置 dmmal.ini
两节点配置完全一样,EP 间可互相拷贝。dmmal.ini 与 dm.ini 放在相同的目录下。
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 192.168.169.141
MAL_PORT = 5337
MAL_INST_HOST = 192.168.64.131
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 192.168.169.142
MAL_PORT = 5337
MAL_INST_HOST = 192.168.64.132
MAL_INST_PORT = 5236
配置 dmmpp.ctl
dmmpp.ctl 是一个二进制文件,用户不能直接配置,需要先配置 dmmpp.ini。
配置 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。命令中的“TYPE=2”参数表示将文本文件转换成控制文件,也可以使用“TYPE=1”参数进行逆向转换。
转换生成的 dmmpp.ctl 需要放在与 dm.ini 同一个目录。
dmctlcvt TYPE=2 SRC=/dm/data/EP01/DAMENG/dmmpp.ini DEST=/dm/data/EP01/DAMENG/dmmpp.ctl
将生成的 dmmpp.ctl 拷贝至另一 EP,保证 MPP 系统中所有 EP 的 dmmpp.ctl 完全相同。
运行 MPP
分别启动 EP01 和 EP02 的 DM 数据库实例(顺序不分先后),DM MPP 系统即能正常运行,用户就可以登录任一 EP 进行数据库操作了。
dmserver /dm/data/EP01/DAMENG/dm.ini
dmserver /dm/data/EP02/DAMENG/dm.ini
2、建立分布表
DM MPP 支持表数据的LIST 分布、范围分布、哈希分布、随机分布、复制分布类型。
单机模式下建的分布表和普通表一样,但是不能创建指定实例名的分布表。
例
创建哈希分布表 T_HASH,分布列为 C1。
CREATE TABLE T_HASH(C1 INT, C2 CHAR(10))DISTRIBUTED BY HASH (C1);
创建随机分布表 T_RANDOM。
CREATE TABLE T_RANDOM(C1 INT, C2 CHAR(10))DISTRIBUTED RANDOMLY;
创建复制分布表 T_FULLY。
CREATE TABLE T_FULLY(C1 INT, C2 CHAR(10))DISTRIBUTED FULLY;
创建范围分布表 T_RANGE,分布列为 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);
创建 LIST 分布表 T_LIST,分布列为 C1。
CREATE TABLE T_LIST(C1 INT, C2 CHAR(10))
DISTRIBUTED BY LIST (C1) (VALUES(3) ON EP01,VALUES(4) ON EP02);
如果没有分区,会报错:
[-2731]:没有找到合适的分区.
创建哈希分布的RANGE分区表。
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);
3、停止 MPP 系统
需要停止 DM MPP 系统的运行时,只需要停止每个 EP 的 DM 实例即可,没有特别的顺序要求。
注意:如果MPP有其中一个节点没有正常启动,disql连接会报错:
[-6024]:全局登录时远程节点连接失败.
4、MPP 相关系统过程与函数
1.设置当前会话是否只查询本节点数据。默认表示可以查询全部节点数据:
SP_SET_SESSION_MPP_SELECT_LOCAL(1);
设为1时,事务会变为只读事务,插入会报错:
[-6506]:试图在只读事务中修改数据.
2.设置本会话上是否允许 DDL 操作。本地登录默认不允许 DDL 操作:
SP_SET_SESSION_LOCAL_TYPE (1);
CREATE TABLE TEST(C1 INT);
SP_SET_SESSION_LOCAL_TYPE (0);
3.根据查询出的行数据的 ROWID 获取本条数据来自哪个 EP:
SELECT SF_GET_EP_SEQNO(ROWID);
4.获取本会话连接的 EP 序号:
SELECT SF_GET_SELF_EP_SEQNO();
5.统计 MPP 环境下表在各个节点的数据行数:
SP_GET_EP_COUNT('SYSDBA','T');
5、MPP 下系统过程与系统视图
- 获取 EP 节点配置信息
SELECT * FROM V$MPP_CFG_ITEM WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
2.获取当前会话连接的实例名
SELECT NAME FROM V$INSTANCE WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
3.获取 MPP 系统内所有 EP 的所有会话
SELECT * FROM V$SESSIONS;
4.获取当前连接的实例上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = SF_GET_SELF_EP_SEQNO();
5.获取实例 EP01 上的所有会话
SELECT * FROM V$SESSIONS WHERE SF_GET_EP_SEQNO(ROWID) = (SELECT DISTINCT
EP_SEQNO FROM V$MPP_CFG_ITEM WHERE INST_NAME ='EP01');
6.获取所接实例上的表 TEST 的使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST');
7.获取每个实例上的表 TEST 使用空间
SELECT TABLE_USED_PAGES('SYSDBA','TEST'), NAME FROM V$INSTANCE;