6.1 DM分布式集群概念(DMMPP)
DMMPP大规模分布式集群,采用的完全对等无共享体系架构,结合了完全无共享体系的优点,在此基础上又前进一步,不采用增加主控制节点来协调所有并行处理的主从式方法,而是各个节点完全对等,更进一步简化了体系的实现,也消除了系统可能存在的主节点瓶颈问题。
DMMPP中的每一个DM数据库服务器实例作为一个执行节点,简称EP。
客户端可连接任意一个EP节点进行操作,所有EP对客户来说都是对等的,数据根据用户指定的分布规则分布在不同的EP上。
MPP的核心在于对用户请求的并行执行,其执行流程可简单描述如下:
①、用户选择一个EP登录,此时该EP就是此用户的主EP,集群中的其余EP都是此用户的从EP;
②、主EP接受用户的SQL请求,并生成并行执行计划;
③、主EP将计划打包后分发给其他从EP;
④、各EP并行执行;
⑤、主EP收集各EP(包括自己)的执行结果;
⑥、主EP将执行结果汇总后返回给用户。
6.2 DM分布式集群安装前规划
01.环境:
192.168.1.81,10.10.10.81,mppdb1,rhel7.6
192.168.1.82,10.10.10.82,mppdb2,rhel7.6
192.168.1.83,10.10.10.83,mppdb3,rhel7.6
02.端口规划:
实例名 PORT_NUM MAL_INST_HOST MAL_INST_PORT MAL_HOST MAL_PORT MPP_SEQNO
mppdb1 5236 192.168.1.81 5236 10.10.10.81 5269 0
mppdb2 5236 192.168.1.82 5236 10.10.10.82 5269 1
mppdb3 5236 192.168.1.83 5236 10.10.10.83 5269 2
端口号相关说明
PORT_NUM 数据库实例监听端口
MAL_INST_HOST 实例的对外服务IP地址
MAL_INST_PORT 实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_INST_DW_PORT 实例监听守护进程TCP连接的端口
MAL_HOST MAL系统监听TCP连接的IP地址
MAL_PORT MAL系统监听TCP连接的端口
03.数据库初始化参数
页大小:32K
簇大小:32页
字符集:UTF-8
字符串比较大小写敏感:是
长度以字符为单位:否
数据库名:mppdb1,mppdb2,mppdb3
实例名:mppdb1,mppdb2,mppdb3
端口:5236,5269
日志文件大小:共 2 个(每个 2048MB);
是否启用归档:不启用
04.安装部署路径规划
实例名 IP地址 安装路径 数据目录路径
mppdb1 192.168.1.81 /home/dmdba/dmdbms /data/dmdata/
mppdb2 192.168.1.82 /home/dmdba/dmdbms /data/dmdata/
mppdb3 192.168.1.83 /home/dmdba/dmdbms /data/dmdata/
6.3 DM分布式集群安装配置
01.上传安装程序
root:
umount /mnt
mount -o loop /home/dmdba/dmdbms_setup_rh7_64_enmpp_8.1.1.48_20191129.iso /mnt
02.DM数据库安装
192.168.1.81/82/83:
使用命令行完成安装3个节点
先挂载镜像到对应目录,然后切到目录执行以下脚本即可完成安装
cd /mnt
./DMInstall.bin -i
root:
/home/dmdba/dmdbms/script/root/roompp_installer.sh
03.DM数据库初始化
192.168.1.81/82/83:
su - dmdba
dminit path=/data/dmdata db_name=mppdb1 instance_name=mppdb1 LOG_SIZE=2048 EXTENT_SIZE=32 PAGE_SIZE=32 charset=1
dminit path=/data/dmdata db_name=mppdb2 instance_name=mppdb2 LOG_SIZE=2048 EXTENT_SIZE=32 PAGE_SIZE=32 charset=1
dminit path=/data/dmdata db_name=mppdb3 instance_name=mppdb3 LOG_SIZE=2048 EXTENT_SIZE=32 PAGE_SIZE=32 charset=1
3个节点各启动一次实例:
dmserver /data/dmdata/mppdb1/dm.ini
dmserver /data/dmdata/mppdb2/dm.ini
dmserver /data/dmdata/mppdb3/dm.ini
显示"SYSTEM IS READY",然后exit,以后台启动
注册服务:
su - root:
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /data/dmdata/mppdb1/dm.ini -p mppdb1
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /data/dmdata/mppdb2/dm.ini -p mppdb2
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmserver -dm_ini /data/dmdata/mppdb3/dm.ini -p mppdb3
04.配置相关参数文件
A.修改dm.ini参数
su - dmdba
vi /data/dmdata/mppdb1/dm.ini
vi /data/dmdata/mppdb2/dm.ini
vi /data/dmdata/mppdb3/dm.ini
#INSTANCE_NAME = MPPDB1
#INSTANCE_NAME = MPPDB2
#INSTANCE_NAME = MPPDB3
#PORT_NUM = 5236
MAL_INI = 1
MPP_INI = 1
B.配置dmmal.ini参数
三台主机完全一样
192.168.1.81:
vi /data/dmdata/mppdb1/dmmal.ini
[MAL_INST1]
MAL_INST_NAME = mppdb1 #实例名,和dm.ini中INSTANCE_NAME一致
MAL_HOST = 10.10.10.81 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5269 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.1.81 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
[MAL_INST2]
MAL_INST_NAME = mppdb2
MAL_HOST = 10.10.10.82
MAL_PORT = 5269
MAL_INST_HOST = 192.168.1.82
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
[MAL_INST3]
MAL_INST_NAME = mppdb3
MAL_HOST = 10.10.10.83
MAL_PORT = 5269
MAL_INST_HOST = 192.168.1.83
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
scp /data/dmdata/mppdb1/dmmal.ini 192.168.1.82:/data/dmdata/mppdb2/
scp /data/dmdata/mppdb1/dmmal.ini 192.168.1.83:/data/dmdata/mppdb3/
C.配置dmmpp.ctl参数文件
dmmpp.ctl是一个二进制文件,用户不能直接配置,需要先配置dmmpp.ini。
192.168.1.81:
vi /data/dmdata/mppdb1/dmmpp.ini
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = mppdb1
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = mppdb2
[SERVICE_NAME3]
MPP_SEQ_NO = 2
MPP_INST_NAME = mppdb3
使用DM提供的工具dmctlcvt将dmmpp.ini转换成dmmpp.ctl
dmctlcvt type=2 SRC=/data/dmdata/mppdb1/dmmpp.ini DEST=/data/dmdata/mppdb1/dmmpp.ctl
将生成的dmmpp.ctl拷贝至其它2个EP,保证MPP系统总所有的EP的dmmpp.ctl完全相同。
scp /data/dmdata/mppdb1/dmmpp.ctl 192.168.1.82:/data/dmdata/mppdb2/
scp /data/dmdata/mppdb1/dmmpp.ctl 192.168.1.83:/data/dmdata/mppdb3/
05.MPP启动与停止
分别启动EP0、EP1和EP2数据库实例,MPP系统即能正常运行,用户就可以登录任一EP进行数据库操作。
DmServicemppdb1 start
DmServicemppdb2 start
DmServicemppdb3 start
disql sysdba/SYSDBA
select * from v$mpp_cfg_item;
select sf_get_self_ep_seqno();
关于停止MPP:
考虑安全性,再对MPP每一个节点做主备保护
DM MPP系统的运行过程中,某一EP发生故障停机,则整个MPP系统将处于不能正常服务的状态。强烈建议采用DM MPP与数据守护相结合的部署方案
6.4 DMMPP分布式使用与测试
01.业务测试
disql sysdba/SYSDBA
create tablespace mpp datafile ‘/data/dmdata/mppdb/mpp01.dbf’ size 100 autoextend off;
create tablespace mpp_idx datafile ‘/data/dmdata/mppdb/mpp_idx01.dbf’ size 100 autoextend off;
create user “mpp” identified by “mpp123456789” default tablespace mpp default index tablespace mpp_idx;
grant dba to mpp;
conn mpp/mpp123456789;
create table mpp (id int,name varchar(50),create_date date);
insert into mpp values(1,‘法外狂徒张三’,‘2021-04-01’);
insert into mpp values(2,‘邓老师’,‘2021-04-02’);
insert into mpp values(3,‘李老师’,‘2021-04-03’);
insert into mpp values(4,‘mpp.net.cn’,‘2021-04-04’);
insert into mpp values(5,‘wx’,‘2021-04-05’);
insert into mpp values(6,‘支付宝’,‘2021-04-06’);
insert into mpp values(7,‘wx-gzh’,‘2021-04-07’);
insert into mpp values(8,‘itpux_com’,‘2021-04-08’);
insert into mpp values(9,‘oracle’,‘2021-04-09’);
insert into mpp values(10,‘mysql’,‘2021-03-01’);
insert into mpp values(11,‘nosql’,‘2021-03-02’);
insert into mpp values(12,‘中国制造’,‘2021-03-03’);
insert into mpp values(13,‘上海虹桥’,‘2021-03-04’);
insert into mpp values(14,‘东方明珠’,‘2021-03-05’);
insert into mpp values(15,‘mongodb’,‘2021-03-06’);
insert into mpp values(16,‘redis’,‘2021-03-07’);
insert into mpp values(17,‘greenplum’,‘2021-03-08’);
insert into mpp values(18,‘postgresql’,‘2021-03-09’);
insert into mpp values(19,‘es’,‘2021-05-01’);
insert into mpp values(20,‘tidb’,‘2021-05-02’);
insert into mpp values(21,‘db2’,‘2021-05-03’);
insert into mpp values(22,‘sqlserver’,‘2021-05-04’);
insert into mpp values(23,‘etl’,‘2021-05-05’);
insert into mpp values(24,‘clickhouse’,‘2021-05-06’);
insert into mpp values(25,‘hadoop’,‘2021-06-01’);
insert into mpp values(26,‘hive’,‘2021-06-02’);
insert into mpp values(27,‘hbase’,‘2021-06-03’);
insert into mpp values(28,‘bigdata’,‘2021-06-04’);
insert into mpp values(29,‘NBA’,‘2021-06-05’);
insert into mpp values(30,‘linux’,‘2021-06-06’);
commit;
select count(*) from mpp.mpp;
–查看各个节点的数据
CALL SP_GET_EP_COUNT (‘MPP’,‘MPP’); --用户名与表名,要大写
SQL> CALL SP_GET_EP_COUNT (‘MPP’,‘MPP’);
行号 SEQNO N_ROWS
1 0 11
2 1 11
3 2 8
02.创建dmdpp分布式表
DM MPP支持表数据的哈希分布、随机分布、复制分布、范围分布、LIST分布类型,用户可根据实际情况选择合适的分布类型。
conn mpp/mpp123456789;
#创建哈希分布表mpp_hash,分布列为id。
create table mpp_hash (id int,name varchar(50),create_date date)distributed by hash (id);
#创建随机分布表mpp_random。
create table mpp_random (id int,name varchar(50),create_date date)distributed randomly;
#创建复制分布表mpp_fully。
create table mpp_fully (id int,name varchar(50),create_date date)distributed fully;
#创建范围分布表mpp_range,分布列为id。
create table mpp_range (id int,name varchar(50),create_date date)distributed by range(id)
(
values equ or less than (10) on mppdb1,
values equ or less than (20) on mppdb2,
values less than(maxvalue) on mppdb3
);
#创建LIST分布表mpp_list,分布列为id
create table mpp_list (id int,name varchar(50),create_date date)
distributed by list (id)
(
values(1,2,3,4,5,6,7,8,9,10) on mppdb1,
values(11,12,13,14,15,16,17,18,19,20) on mppdb2,
values(21,22,23,24,25,26,27,28,29,30) on mppdb3
);
#创建哈希分布表的范围水平分区表。
create table mpp_hash_range_partition
(id int,name varchar(50),create_date date)
partition by range(id)
(
partition par_1 values less than(10) ,
partition par_2 values less than(20) ,
partition par_3 values less than(maxvalue)
)
distributed by hash (id);
插入几个数据测试:
insert into mpp_range values(1,‘法外狂徒张三’,‘2021-04-01’);
insert into mpp_range values(2,‘邓老师’,‘2021-04-02’);
insert into mpp_range values(3,‘李老师’,‘2021-04-03’);
insert into mpp_range values(4,‘mpp.net.cn’,‘2021-04-04’);
insert into mpp_range values(5,‘wx’,‘2021-04-05’);
insert into mpp_range values(6,‘支付宝’,‘2021-04-06’);
insert into mpp_range values(7,‘wx-gzh’,‘2021-04-07’);
insert into mpp_range values(8,‘itpux_com’,‘2021-04-08’);
insert into mpp_range values(9,‘oracle’,‘2021-04-09’);
insert into mpp_range values(10,‘mysql’,‘2021-03-01’);
insert into mpp_range values(11,‘nosql’,‘2021-03-02’);
insert into mpp_range values(12,‘中国制造’,‘2021-03-03’);
insert into mpp_range values(13,‘上海虹桥’,‘2021-03-04’);
insert into mpp_range values(14,‘东方明珠’,‘2021-03-05’);
insert into mpp_range values(15,‘mongodb’,‘2021-03-06’);
insert into mpp_range values(16,‘redis’,‘2021-03-07’);
insert into mpp_range values(17,‘greenplum’,‘2021-03-08’);
insert into mpp_range values(18,‘postgresql’,‘2021-03-09’);
insert into mpp_range values(19,‘es’,‘2021-05-01’);
insert into mpp_range values(20,‘tidb’,‘2021-05-02’);
insert into mpp_range values(21,‘db2’,‘2021-05-03’);
insert into mpp_range values(22,‘sqlserver’,‘2021-05-04’);
insert into mpp_range values(23,‘etl’,‘2021-05-05’);
insert into mpp_range values(24,‘clickhouse’,‘2021-05-06’);
insert into mpp_range values(25,‘hadoop’,‘2021-06-01’);
insert into mpp_range values(26,‘hive’,‘2021-06-02’);
insert into mpp_range values(27,‘hbase’,‘2021-06-03’);
insert into mpp_range values(28,‘bigdata’,‘2021-06-04’);
insert into mpp_range values(29,‘NBA’,‘2021-06-05’);
insert into mpp_range values(30,‘linux’,‘2021-06-06’);
commit;
select count(*) from mpp.mpp_range;
conn mpp/mpp123456789;
CALL SP_GET_EP_COUNT (‘MPP’,‘MPP_RANGE’); --用户名与表名,要大写
mpp_random --随机表
insert into mpp_random values(1,‘法外狂徒张三’,‘2021-04-01’);
insert into mpp_random values(2,‘邓老师’,‘2021-04-02’);
insert into mpp_random values(3,‘李老师’,‘2021-04-03’);
insert into mpp_random values(4,‘mpp.net.cn’,‘2021-04-04’);
insert into mpp_random values(5,‘wx’,‘2021-04-05’);
insert into mpp_random values(6,‘支付宝’,‘2021-04-06’);
insert into mpp_random values(7,‘wx-gzh’,‘2021-04-07’);
insert into mpp_random values(8,‘itpux_com’,‘2021-04-08’);
insert into mpp_random values(9,‘oracle’,‘2021-04-09’);
insert into mpp_random values(10,‘mysql’,‘2021-03-01’);
insert into mpp_random values(11,‘nosql’,‘2021-03-02’);
insert into mpp_random values(12,‘中国制造’,‘2021-03-03’);
insert into mpp_random values(13,‘上海虹桥’,‘2021-03-04’);
insert into mpp_random values(14,‘东方明珠’,‘2021-03-05’);
insert into mpp_random values(15,‘mongodb’,‘2021-03-06’);
insert into mpp_random values(16,‘redis’,‘2021-03-07’);
insert into mpp_random values(17,‘greenplum’,‘2021-03-08’);
insert into mpp_random values(18,‘postgresql’,‘2021-03-09’);
insert into mpp_random values(19,‘es’,‘2021-05-01’);
insert into mpp_random values(20,‘tidb’,‘2021-05-02’);
insert into mpp_random values(21,‘db2’,‘2021-05-03’);
insert into mpp_random values(22,‘sqlserver’,‘2021-05-04’);
insert into mpp_random values(23,‘etl’,‘2021-05-05’);
insert into mpp_random values(24,‘clickhouse’,‘2021-05-06’);
insert into mpp_random values(25,‘hadoop’,‘2021-06-01’);
insert into mpp_random values(26,‘hive’,‘2021-06-02’);
insert into mpp_random values(27,‘hbase’,‘2021-06-03’);
insert into mpp_random values(28,‘bigdata’,‘2021-06-04’);
insert into mpp_random values(29,‘NBA’,‘2021-06-05’);
insert into mpp_random values(30,‘linux’,‘2021-06-06’);
commit;
select count(*) from mpp.mpp_random;
CALL SP_GET_EP_COUNT (‘MPP’,‘MPP_RANDOM’); --用户名与表名,要大写
03.配置dm_svc.conf
mppdb=(192.168.1.81:5236,192.168.1.82:5236,192.168.1.83:5236)
TIME_ZONE=(480)
LANGUAGE=(cn)