一、安装计划
达梦大规模并行处理集群组件(DM Massively Paralleling Processing Cluster Component,缩写 DMMPP),采用完全对等无共享架构,且各节点完全对等,不需要专用硬件,不存在主控节点,消除了潜在瓶颈以及单节点故障问题。最多可支持1024个节点,支持TB到PB级的数据存储与分析,并提供高可用性和动态扩展能力,是超大型数据应用的高性价比通用解决方案。
实验目的:通过本次实验,熟悉DMMPP的完全对等不共享架构,了解集群数据的随机分布和复制分布等方式,以及对SQL性能带来的影响。通过部署实验环境,加深高速邮件通信系统(dmmal)的理解。
系统环境:两台虚拟服务器(CentOS_7 + Docker)
数据库版本:dm8_20210712_x86_rh6_64_ent_8.1.2.38_pack1
DMMPP主备集群架构如图:
网络规划:
dbserver1 eth1 192.168.50.150
eth2 172.20.10.150
dbserver2 eth1 192.168.50.200
eth2 172.20.10.200
二、部署ep1与ep4节点的主备守护集群
1、创建DM8镜像
--加载Docker镜像
docker load -i openjdk-8u265.tar
--创建docker镜像
/home/config/dem/mkdocker
docker build -t dm8:v02 .
备注:/home/config/dem/mkdocker目录下包含以下文件:
附件一 99-dmdba-limits.conf
附件二 dminstall.xml
附件三 Dockerfile
安装包 DMInstall.bin
2、在dbserver1服务器初始化ep1节点
#本次实验docker使用共享本机网络模式
docker run -it --net=host --name ep1 --hostname db1_pri -v /ep1/config:/dm8/config -v /ep1/data:/dm8/data -v /ep1/archlog:/dm8/archlog -v /ep1/backup:/dm8/backup -d dm8:v02 /bin/bash
docker exec -it ep1 bash
cd /dm8/config
#运行ep1初始化脚本
./init_ep1.sh
3、在dbserver2节点初始化ep4
docker run -it --net=host --name ep4 --hostname db4_stdy -v /ep4/config:/dm8/config -v /ep4/data:/dm8/data -v /ep4/archlog:/dm8/archlog -v /ep4/backup:/dm8/backup -d dm8:v02 /bin/bash
docker exec -it ep4 bash
cd /dm8/config
#运行ep4初始化脚本
./init_ep4.sh
备注:初始化脚本见附件
附件四 init_ep1.sh
附件五 init_ep4.sh
三、部署ep2与ep3节点的主备守护集群
1、在dbserver2节点初始化ep2
docker run -it --net=host --name ep2 --hostname db2_pri -v /ep2/config:/dm8/config -v /ep2/data:/dm8/data -v /ep2/archlog:/dm8/archlog -v /ep2/backup:/dm8/backup -d dm8:v02 /bin/bash
docker exec -it ep2 bash
cd /dm8/config
#运行ep2初始化脚本
./init_ep2.sh
2、在dbserver1节点初始化ep3
docker run -it --net=host --name ep3 --hostname db3_stdy -v /ep3/config:/dm8/config -v /ep3/data:/dm8/data -v /ep3/archlog:/dm8/archlog -v /ep3/backup:/dm8/backup -d dm8:v02 /bin/bash
docker exec -it ep3 bash
cd /dm8/config
#运行ep3初始化脚本
./init_ep3.sh
备注:初始化脚本见附件
附件四 init_ep2.sh
附件五 init_ep3.sh
四、配置MPP相关配置项
上述ep1与ep4节点的主备守护集群和ep2与ep3节点的主备守护集群部署完毕后,关闭所有服务(重启docker镜像即可)。
1、修改MPP_INI参数,并生成dmmpp.ctl文件
#dbserver1节点:
docker exec -it ep1 bash
find /dm8/data/crm1/ -type f -name "dm.ini" | xargs sed -i 's/MPP_INI = 0/MPP_INI = 1/g'
#使用dmctlcvt工具将dmmpp.ini文件转化为dmmpp.ctl,在数据库安装的bin目录下执行以下命令:
su - dmdba
cd /dm8/bin
./dmctlcvt TYPE=2 SRC=/dm8/data/crm1/dmmpp.ini DEST=/dm8/data/crm1/dmmpp.ctl
2、其余ep2、ep3、ep4节点依次修改MPP_INI参数
#dbserver2节点:
docker exec -it ep2 bash
find /dm8/data/crm2/ -type f -name "dm.ini" | xargs sed -i 's/MPP_INI = 0/MPP_INI = 1/g'
#dbserver1节点:
docker exec -it ep3 bash
find /dm8/data/crm3/ -type f -name "dm.ini" | xargs sed -i 's/MPP_INI = 0/MPP_INI = 1/g'
#dbserver2节点:
docker exec -it ep4 bash
find /dm8/data/crm4/ -type f -name "dm.ini" | xargs sed -i 's/MPP_INI = 0/MPP_INI = 1/g'
3、复制dmmpp.ctl文件至所有节点
将生成的dmmpp.ctl控制文件复制到另一个节点的实例目录下,注意文件的所属关系。
chown dmdba:dinstall dmmpp.ctl
注意:以上修改MPP_INI参数和复制dmmpp.ctl控制文件需要在所有节点完成,否则集群会报如下错误:
4、注册服务
DMMPP服务只需要在ep1和ep2节点注册即可。
#dbserver1节点:
docker exec -it ep1 bash
cd /dm8/script/root
./dm_service_installer.sh -t dmserver -p DMMPP1 -dm_ini /dm8/data/crm1/dm.ini
#dbserver2节点:
docker exec -it ep2 bash
cd /dm8/script/root
./dm_service_installer.sh -t dmserver -p DMMPP2 -dm_ini /dm8/data/crm2/dm.ini
5、服务启动顺序
#ep1服务启动
docker exec -it ep1 bash
/etc/init.d/DmWatcherServiceCRM1 start #启动守护进程
/dm8/bin/DmAPService start
#ep2服务启动
docker exec -it ep2 bash
/etc/init.d/DmWatcherServiceCRM2 start #启动守护进程
/dm8/bin/DmAPService start
#ep3服务启动
docker exec -it ep3 bash
/etc/init.d/DmWatcherServiceCRM3 start #启动守护进程
#ep4服务启动
docker exec -it ep4 bash
/etc/init.d/DmWatcherServiceCRM4 start #启动守护进程
备注:数据库进程分别由各节点守护进程拉起,具体配置参数在dmwatcher.ini中设置:
INST_INI = /dm8/data/crm[*]/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
五、DMMPP测试
1、观察集群状态
服务全部启动后,分别打开ep1和ep4主备监视器dmmoniter_a和ep2和ep3主备监视器dmmoniter_b,观察集群状态:
#监视器dmmoniter_a
#监视器dmmoniter_b
#disql登录数据库
2、创建测试数据查看数据分布
#1、创建测试用户
create tablespace CRM_DATA datafile 'crm_data_01.dbf' size 128 autoextend on next 32;
create tablespace CRM_INDEX datafile 'crm_index_01.dbf' size 128 autoextend on next 32;
create user crm identified by "*" default TABLESPACE "CRM_DATA" default INDEX TABLESPACE "CRM_INDEX";
grant PUBLIC to crm;
grant RESOURCE to crm;
#2、创建测试表
create table tab_01 (c1 int, c2 char(10), c3 varchar, c4 numeric(5,2), c5 smallint, c6 bigint, c7 byte,c8 binary,c9 float, c10 double, c11 real,c12 bit,c13 date,c14 time, c15 timestamp, c16 interval year to month, c17 time with time zone, c18 text,c19 image ,c20 blob, c21 clob);
insert into tab_01 values (1, 'abcd', 'testdatatype', '-123.45', '-32768', '-92233720', 123, '1', 5, 7.8, 9.1, null, '2012-12-24', '21:59:59', '2012-12-21 07:59:59', '15-08', '19:59:59 +02:03', 'test text data type','0x123456789','0x987654321','test clob data type');
insert into tab_01 values (2, 'abd', 'testatatype', '-123.45', '-32768', '-92233720', 123, '1', 5, 7.8, 9.1, null, '2012-12-25', '21:59:59', '2012-12-22 07:59:59', '15-08', '19:59:59 +02:03', 'test text data type','0x123456789','0x987654321','test clob data type');
… …
#查看数据分布情况
#登录ep4备节点,查看数据分布情况,备库中存储一半数量的数据。
#3、创建测试表2
#DMMPP集群下创建表不指定DISTRIBUTED关键字,则默认数据分布模式为[RANDOMLY]随机分布。以下创建FULLY复制分布表:
CREATE TABLE tab_02(C1 INT not null primary key, C2 CHAR(10))DISTRIBUTED FULLY;
insert into tab_02 values (1, 'a');
insert into tab_02 values (2, 'ab');
insert into tab_02 values (3, 'abc');
insert into tab_02 values (4, 'abcd');
insert into tab_02 values (5, 'ac');
insert into tab_02 values (6, 'bc');
insert into tab_02 values (7, 'cd');
insert into tab_02 values (8, 'edcba');
#查看FULLY表数据分布情况
#对比查看执行计划
查询FULLY分布方式的表,执行计划中消除了mpp collect操作符。
3、模拟节点故障
关闭ep1节点docker容器,模拟故障
#观察dmmoniter_a监视器,发现ep4由STANDBY状态转为Primary状态,此时集群不可用。
#恢复ep1节点,主备守护集群恢复正常。但需要手动切换主备模式,将ep1切回Primary状态
#待ep1切回Primary后整个DMMPP集群恢复正常。
附件一:
#99-dmdba-limits.conf
dmdba soft nproc 10240
dmdba hard nproc 10240
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba hard data unlimited
dmdba soft data unlimited
dmdba hard fsize unlimited
dmdba soft fsize unlimited
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft stack 65536
dmdba hard stack 65536
附件二:
<?xml version="1.0"?>
<DATABASE>
<!-- 安装数据库的语言配置,安装中文版配置ZH,英文版配置EN,不区分大小写。不允许为空 -->
<LANGUAGE>EN</LANGUAGE>
<!-- 安装程序的时区配置,默认值为+08:00,范围:-12:59 ~ +14:00 -->
<TIME_ZONE>+08:00</TIME_ZONE>
<!-- key 文件路径 -->
<KEY></KEY>
<!-- 安装程序组件类型,取值0、1、2,0 表示安装全部,1 表示安装服务器,2 表示安装客户端 。默认为0 -->
<INSTALL_TYPE>0</INSTALL_TYPE>
<!-- 安装路径,不允许为空 -->
<INSTALL_PATH>/dm8</INSTALL_PATH>
<!-- 是否初始化库,取值Y/N、y/n,不允许为空 -->
<INIT_DB>N</INIT_DB>
</DATABASE>
附件三:
FROM openjdk:8u265-jdk
ADD ./DMInstall.bin /opt/
ADD ./dminstall.xml /opt/
ADD ./99-dmdba-limits.conf /etc/security/limits.d/
RUN rm -rf /etc/localtime \
&& ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& groupadd dinstall \
&& useradd -g dinstall -ms /bin/bash dmdba \
&& mkdir /dm8 \
&& chown dmdba:dinstall /dm8
USER dmdba
ENV DM_HOME=/dm8
ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$DM_HOME/bin
RUN /opt/DMInstall.bin -q /opt/dminstall.xml
USER root
RUN rm -rf /opt/*
WORKDIR /
附件四:
##init_ep1.sh脚本
#!/bin/bash
chown dmdba:dinstall -R /dm8/data /dm8/archlog /dm8/backup
su - dmdba<<EOF
cd /dm8/bin
./dminit CONTROL=/dm8/config/ep1_dm.ini
cp -if /dm8/config/ep1_dmarch.ini /dm8/data/crm1/dmarch.ini
cp -if /dm8/config/dmmal.ini /dm8/data/crm1/dmmal.ini
cp -if /dm8/config/dmwatcher_1.ini /dm8/data/crm1/dmwatcher.ini
cp -if /dm8/config/dmmpp.ini /dm8/data/crm1/dmmpp.ini
chown dmdba:dinstall /dm8/data/crm1/*.ini
find /dm8/data/crm1/ -type f -name "dm.ini" | xargs sed -i 's/MAL_INI = 0/MAL_INI = 1/g'
find /dm8/data/crm1/ -type f -name "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS = 1/ALTER_MODE_STATUS = 0/g'
find /dm8/data/crm1/ -type f -name "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS = 1/ENABLE_OFFLINE_TS = 2/g'
EOF
cd /dm8/script/root
./dm_service_installer.sh -t dmwatcher -p CRM1 -watcher_ini /dm8/data/crm1/dmwatcher.ini
./dm_service_installer.sh -t dmserver -p CRM1 -dm_ini /dm8/data/crm1/dm.ini
/etc/init.d/DmServiceCRM1 start
/dm8/bin/DmAPService start
/etc/init.d/DmServiceCRM1 stop
su - dmdba<<EOF
/dm8/bin/dmrman CTLSTMT="backup database '/dm8/data/crm1/dm.ini' backupset '/dm8/backup/';"
EOF
nohup /dm8/bin/dmserver /dm8/data/crm1/dm.ini mount > /tmp/dm.out 2>&1 &
for((i=1;i<=10;i++));do
text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`
if [ -n "$text" ] ; then
break
fi
sleep 1
done
su - dmdba<<EOF
/dm8/bin/disql SYSDBA/SYSDBA -e "sp_set_oguid(453331);"
/dm8/bin/disql SYSDBA/SYSDBA -e "alter database primary;"
EOF
ps -ef|grep dmserver|grep -v grep |awk '{print $2}'|xargs kill -9
#rm -rf /tmp/dm.out
sleep 3
exit
附件五:
##init_ep4.sh脚本
#!/bin/bash
chown dmdba:dinstall -R /dm8/data /dm8/archlog /dm8/backup
su - dmdba<<EOF
cd /dm8/bin
./dminit CONTROL=/dm8/config/ep4_dm.ini
cp -if /dm8/config/ep4_dmarch.ini /dm8/data/crm4/dmarch.ini
cp -if /dm8/config/dmmal.ini /dm8/data/crm4/dmmal.ini
cp -if /dm8/config/dmwatcher_4.ini /dm8/data/crm4/dmwatcher.ini
#cp -if /dm8/config/dmmpp.ini /dm8/data/crm4/dmmpp.ini
chown dmdba:dinstall /dm8/data/crm4/*.ini
find /dm8/data/crm4/ -type f -name "dm.ini" | xargs sed -i 's/MAL_INI = 0/MAL_INI = 1/g'
find /dm8/data/crm4/ -type f -name "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS = 1/ALTER_MODE_STATUS = 0/g'
find /dm8/data/crm4/ -type f -name "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS = 1/ENABLE_OFFLINE_TS = 2/g'
EOF
cd /dm8/script/root
./dm_service_installer.sh -t dmwatcher -p CRM4 -watcher_ini /dm8/data/crm4/dmwatcher.ini
./dm_service_installer.sh -t dmserver -p CRM4 -dm_ini /dm8/data/crm4/dm.ini
/etc/init.d/DmServiceCRM4 start
/dm8/bin/DmAPService start
/etc/init.d/DmServiceCRM4 stop
su - dmdba<<EOF
/dm8/bin/dmrman CTLSTMT="restore database '/dm8/data/crm4/dm.ini' from backupset '/dm8/backup/';"
/dm8/bin/dmrman CTLSTMT="recover database '/dm8/data/crm4/dm.ini' update DB_MAGIC;"
EOF
nohup /dm8/bin/dmserver /dm8/data/crm4/dm.ini mount > /tmp/dm.out 2>&1 &
for((i=1;i<=10;i++));do
text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`
if [ -n "$text" ] ; then
break
fi
sleep 1
done
su - dmdba<<EOF
/dm8/bin/disql SYSDBA/SYSDBA@192.168.50.200:5237 -e "sp_set_oguid(453331);"
/dm8/bin/disql SYSDBA/SYSDBA@192.168.50.200:5237 -e "alter database standby;"
EOF
ps -ef|grep dmserver|grep -v grep |awk '{print $2}'|xargs kill -9
#rm -rf /tmp/dm.out
sleep 3
exit
附件六:
#!/bin/bash
chown dmdba:dinstall -R /dm8/data /dm8/archlog /dm8/backup
su - dmdba<<EOF
cd /dm8/bin
./dminit CONTROL=/dm8/config/ep2_dm.ini
cp -if /dm8/config/ep2_dmarch.ini /dm8/data/crm2/dmarch.ini
cp -if /dm8/config/dmmal.ini /dm8/data/crm2/dmmal.ini
cp -if /dm8/config/dmwatcher_2.ini /dm8/data/crm2/dmwatcher.ini
cp -if /dm8/config/dmmpp.ini /dm8/data/crm2/dmmpp.ini
chown dmdba:dinstall /dm8/data/crm2/*.ini
find /dm8/data/crm2/ -type f -name "dm.ini" | xargs sed -i 's/MAL_INI = 0/MAL_INI = 1/g'
find /dm8/data/crm2/ -type f -name "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS = 1/ALTER_MODE_STATUS = 0/g'
find /dm8/data/crm2/ -type f -name "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS = 1/ENABLE_OFFLINE_TS = 2/g'
EOF
cd /dm8/script/root
./dm_service_installer.sh -t dmwatcher -p CRM2 -watcher_ini /dm8/data/crm2/dmwatcher.ini
./dm_service_installer.sh -t dmserver -p CRM2 -dm_ini /dm8/data/crm2/dm.ini
/etc/init.d/DmServiceCRM2 start
/dm8/bin/DmAPService start
/etc/init.d/DmServiceCRM2 stop
su - dmdba<<EOF
/dm8/bin/dmrman CTLSTMT="backup database '/dm8/data/crm2/dm.ini' backupset '/dm8/backup/';"
EOF
nohup /dm8/bin/dmserver /dm8/data/crm2/dm.ini mount > /tmp/dm.out 2>&1 &
for((i=1;i<=10;i++));do
text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`
if [ -n "$text" ] ; then
break
fi
sleep 1
done
su - dmdba<<EOF
/dm8/bin/disql SYSDBA/SYSDBA -e "sp_set_oguid(453332);"
/dm8/bin/disql SYSDBA/SYSDBA -e "alter database primary;"
EOF
ps -ef|grep dmserver|grep -v grep |awk '{print $2}'|xargs kill -9
#rm -rf /tmp/dm.out
sleep 3
exit
附件七:
#!/bin/bash
chown dmdba:dinstall -R /dm8/data /dm8/archlog /dm8/backup
su - dmdba<<EOF
cd /dm8/bin
./dminit CONTROL=/dm8/config/ep3_dm.ini
cp -if /dm8/config/ep3_dmarch.ini /dm8/data/crm3/dmarch.ini
cp -if /dm8/config/dmmal.ini /dm8/data/crm3/dmmal.ini
cp -if /dm8/config/dmwatcher_3.ini /dm8/data/crm3/dmwatcher.ini
#cp -if /dm8/config/dmmpp.ini /dm8/data/crm3/dmmpp.ini
chown dmdba:dinstall /dm8/data/crm3/*.ini
find /dm8/data/crm3/ -type f -name "dm.ini" | xargs sed -i 's/MAL_INI = 0/MAL_INI = 1/g'
find /dm8/data/crm3/ -type f -name "dm.ini" | xargs sed -i 's/ALTER_MODE_STATUS = 1/ALTER_MODE_STATUS = 0/g'
find /dm8/data/crm3/ -type f -name "dm.ini" | xargs sed -i 's/ENABLE_OFFLINE_TS = 1/ENABLE_OFFLINE_TS = 2/g'
EOF
cd /dm8/script/root
./dm_service_installer.sh -t dmwatcher -p CRM3 -watcher_ini /dm8/data/crm3/dmwatcher.ini
./dm_service_installer.sh -t dmserver -p CRM3 -dm_ini /dm8/data/crm3/dm.ini
/etc/init.d/DmServiceCRM3 start
/dm8/bin/DmAPService start
/etc/init.d/DmServiceCRM3 stop
su - dmdba<<EOF
/dm8/bin/dmrman CTLSTMT="restore database '/dm8/data/crm3/dm.ini' from backupset '/dm8/backup/';"
/dm8/bin/dmrman CTLSTMT="recover database '/dm8/data/crm3/dm.ini' update DB_MAGIC;"
EOF
nohup /dm8/bin/dmserver /dm8/data/crm3/dm.ini mount > /tmp/dm.out 2>&1 &
for((i=1;i<=10;i++));do
text=`cat /tmp/dm.out|grep "SYSTEM IS READY"`
if [ -n "$text" ] ; then
break
fi
sleep 1
done
su - dmdba<<EOF
/dm8/bin/disql SYSDBA/SYSDBA@192.168.50.150:5237 -e "sp_set_oguid(453332);"
/dm8/bin/disql SYSDBA/SYSDBA@192.168.50.150:5237 -e "alter database standby;"
EOF
ps -ef|grep dmserver|grep -v grep |awk '{print $2}'|xargs kill -9
#rm -rf /tmp/dm.out
sleep 3
exit
其余配置文件附件
Dmmpp.ini
[SERVICE_NAME1]
MPP_SEQ_NO = 0
MPP_INST_NAME = crm1
[SERVICE_NAME2]
MPP_SEQ_NO = 1
MPP_INST_NAME = crm2
Dmmonitor_a.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP_RW]
MON_INST_OGUID = 453331
MON_DW_IP = 172.20.10.150:52141
MON_DW_IP = 172.20.10.200:52142
Dmmonitor_b.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP_RW]
MON_INST_OGUID = 453332
MON_DW_IP = 172.20.10.200:52141
MON_DW_IP = 172.20.10.150:52142
文章
阅读量
获赞