数据库运维
记录DBA学习成长历程

DM8-MPP系统动态扩容

文章目录

DM MPP 将多个 DM 数据库实例组织为一个并行计算网络,为用户提供高性价比的海量 数据存储和处理能力。但即使 DM MPP 的成本代价极低,用户也常常不能在最初部署 MPP 时就部署好足够应用持续运行很长时间的系统规模。在应用系统运行几年后,随着应用数据规模的不断增加,需要为运行中的 MPP 系统进一步扩充 MPP 容量是一个常见的需求。为此, DM MPP 提供了系统动态扩容功能,在不影响数据库应用的情况下,可以为 DM MPP 集群动 态增加新的 EP。

环境准备

上个文档搭建的 DM MPP 系统为例,此 MPP 系统已有 EP01 和 EP02 两个节点, 现在要再增加一个节点 EP03。

设当前的两节点 MPP 系统中已有哈希分布表 T1(普通表)和 T2(HUGE 表)、复制分布表 T3 和随机分布表 T4,它们的创建和插入数据的语句如下:

--哈希分布表 T1

[dmdba@ep01 tool]$ disql sysdba/dameng123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 9.392(毫秒)
disql V8
SQL> CREATE TABLE T1(C1 INT,C2 INT,C3 INT,C4 VARCHAR(10)) DISTRIBUTED BY HASH(C1);
操作已执行
已用时间: 536.905(毫秒). 执行号:19.
SQL> DECLARE
i INT;
BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO T1 VALUES (i,i+1,i+2,'adasf');
END LOOP;
END;
/
COMMIT;
2 3 4 5 6 7 8 
DMSQL 过程已成功完成
已用时间: 699.990(毫秒). 执行号:330158.
SQL> 操作已执行
已用时间: 6.933(毫秒). 执行号:330159.
SQL> SQL> select count(*) from t1;

行号 COUNT(*) 
---------- --------------------
1 1000

已用时间: 7.085(毫秒). 执行号:330161.

--哈希分布表 T2

SQL> CREATE HUGE TABLE T2(C1 INT,C2 INT,C3 INT,C4 VARCHAR(10)) DISTRIBUTED BY
HASH(C1);2 
操作已执行
已用时间: 446.429(毫秒). 执行号:23.
SQL> DECLARE
i INT;
BEGIN
FOR i IN 1..10 LOOP
INSERT INTO T2 VALUES (i,i+1,i+2,'adasf');
END LOOP;
END;
/
COMMIT;2 3 4 5 6 7 8 DMSQL 过程已成功完成
已用时间: 38.859(毫秒). 执行号:330234.
SQL> select count(*) from t2;

行号 COUNT(*) 
---------- --------------------
1 10

已用时间: 12.694(毫秒). 执行号:330236.

--复制分布表 T3

SQL> CREATE TABLE T3(C1 INT,C2 INT,C3 INT,C4 VARCHAR(10)) DISTRIBUTED FULLY;
操作已执行
已用时间: 11.708(毫秒). 执行号:26.
SQL> DECLARE
i INT;
BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO T3 VALUES (i,i+1,i+2,'adasf');
END LOOP;
END;
/
COMMIT;
2 3 4 5 6 7 8 
DMSQL 过程已成功完成
已用时间: 00:00:01.203. 执行号:331247.
SQL> 操作已执行
已用时间: 3.970(毫秒). 执行号:331248.
SQL> SQL> select count(*) from t3;

行号 COUNT(*) 
---------- --------------------
1 1000

已用时间: 0.841(毫秒). 执行号:331250.

--随机分布表 T4

SQL> CREATE TABLE T4(C1 INT,C2 INT,C3 INT,C4 VARCHAR(10)) DISTRIBUTED RANDOMLY;
操作已执行
已用时间: 11.426(毫秒). 执行号:30.
SQL> DECLARE
i INT;2 BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO T4 VALUES (i,i+1,i+2,'adasf');
END LOOP;
END;
/
COMMIT;
3 4 5 6 7 
DMSQL 过程已成功完成
已用时间: 605.096(毫秒). 执行号:332261.
SQL> 操作已执行
已用时间: 4.723(毫秒). 执行号:332262.
SQL> SQL> select count(*) from t4;

行号 COUNT(*) 
---------- --------------------
1 1000

已用时间: 6.265(毫秒). 执行号:332264.

动态增加节点

禁止系统 DDL 操作

SQL> SP_DDL_FORBIDEN(1);
DMSQL 过程已成功完成
已用时间: 11.495(毫秒). 执行号:332265.

克隆数据库

数据库克隆的目的是把系统中的对象定义信息进行备份,用于恢复到新加的节点上,生成的备份集位于指定的目录备份集中。

若 MPP 系统处于运行状态,采用联机 DDL 克隆方式(需要配置本地归档)。全局登录 MPP 系统任一节点,执行下面的语句。

[dmdba@ep01 bin]$ disql sysdba/dameng123

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 6.699(毫秒)
disql V8
SQL> BACKUP DATABASE DDL_CLONE BACKUPSET 'CLONE';
操作已执行
已用时间: 00:00:01.009. 执行号:585311.

[dmdba@ep01 DMDB]$ cd bak/
[dmdba@ep01 bak]$ ls
CLONE
[dmdba@ep01 bak]$ ll CLONE/
total 6256
-rw-r--r-- 1 dmdba dinstall 457728 Feb 1 10:44 CLONE_1.bak
-rw-r--r-- 1 dmdba dinstall 5820928 Feb 1 10:44 CLONE.bak
-rw-r--r-- 1 dmdba dinstall 120832 Feb 1 10:44 CLONE.meta

若 MPP 系统处于退出状态,选择 MPP 系统任一节点使用 DMRMAN 工具进行脱机备份。

RMAN>backup database 'c:\dmdbms\data\dameng\dm.ini' ddl_clone backupset 'clone';

新机器信息:

ep03信息:

实例名 MAL_INST_HOST MAL_INST_PORT MAL_HOST MAL端口 MPP_SEQN
EP03 10.0.0.202 5238 10.0.0.202 30001 2
[dmdba@ep03 bin]$ ./dminit path=/dm/data/ db_name=DMDB instance_name=EP03 port_num=5238 SYSDBA_PWD="dameng123" 
initdb V8
db version: 0x7000a
file dm.key not found, use default license!
License will expire in 14 day(s) on 2021-02-15

log file path: /dm/data/DMDB/DMDB01.log


log file path: /dm/data/DMDB/DMDB02.log

write to dir [/dm/data/DMDB].
create dm database success. 2021-02-01 10:56:11

脱机还原

在新增节点上执行脱机还原。手动拷贝克隆的备份集目录 clone 到新增节点 EP03 的bak 目录中,使用 DMRMAN 工具进行脱机还原。

RMAN> RESTORE DATABASE '/dm/data/DMDB/dm.ini' FROM BACKUPSET '/dm/data/DMDB/bak/CLONE';
RESTORE DATABASE '/dm/data/DMDB/dm.ini' FROM BACKUPSET '/dm/data/DMDB/bak/CLONE';
RESTORE DATABASE CHECK......
RESTORE DATABASE,dbf collect......
RESTORE DATABASE,dbf refresh ......
RESTORE BACKUPSET [/dm/data/DMDB/bak/CLONE] START......
total 1 packages processed...
total 3 packages processed...
RESTORE DATABASE,UPDATE ctl file......
RESTORE DATABASE,REBUILD key file......
RESTORE DATABASE,CHECK db info......
RESTORE DATABASE,UPDATE db info......
total 3 packages processed...
total 3 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 402.275(ms)


RECOVER DATABASE '/dm/data/DMDB/dm.ini' FROM BACKUPSET '/dm/data/DMDB/bak/CLONE';
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[51606]
RESTORE RLOG CHECK......
RESTORE RLOG, gen tmp file......
RESTORE RLOG FROM BACKUPSET [/dm/data/DMDB/bak/CLONE] START......
total 3 packages processed...
total 3 packages processed...
total 3 packages processed!
CMD END.CODE:[0]
EP:0 total 1 pkgs applied, percent: 25%
EP:0 total 2 pkgs applied, percent: 50%
EP:0 total 3 pkgs applied, percent: 75%
EP:0 total 4 pkgs applied, percent: 100%
Recover from archive log finished, time used:0.014s.
recover successfully!
time used: 368.715(ms)

[dmdba@ep03 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DMDB/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/dm/data/DMDB/dm.ini' UPDATE DB_MAGIC
file dm.key not found, use default license!
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[56335]
EP[0]'s apply_lsn[56335] >= end_lsn[56335]
ndct db load finished
ndct db load finished
recover successfully!
time used: 00:00:01.795

若要增加多个节点,则依次执行拷贝、脱机还原步骤。

配置新增节点的 dmmal.ini

[dmdba@ep03 DMDB]$ cat dmmal.ini 
[MAL_INST1]
MAL_INST_NAME = EP01
MAL_HOST = 10.0.0.200
MAL_PORT = 10001
MAL_INST_HOST = 10.0.0.200
MAL_INST_PORT = 5236
[MAL_INST2]
MAL_INST_NAME = EP02
MAL_HOST = 10.0.0.201
MAL_PORT = 20001
MAL_INST_HOST = 10.0.0.201
MAL_INST_PORT = 5237
[MAL_INST3]
MAL_INST_NAME = EP03
MAL_HOST = 10.0.0.202
MAL_PORT = 30001
MAL_INST_HOST = 10.0.0.202
MAL_INST_PORT = 5238

修改新增节点的 dm.ini 文件中的如下配置项:

INSTANCE_NAME = EP03
PORT_NUM = 5238
MAL_INI = 1
MPP_INI = 1

MOUNT 方式启动新增节点

[dmdba@ep03 bin]$ ./DmServiceDMDB start mount
Starting DmServiceDMDB: [ OK ]
[dmdba@ep03 bin]$ disql sysdba/dameng123:5238

服务器[LOCALHOST:5238]:处于普通配置状态
登录使用时间: 4.920(毫秒)
disql V8
SQL> SP_DDL_FORBIDEN(1);
DMSQL 过程已成功完成
已用时间: 3.596(毫秒). 执行号:1.
SQL> ALTER DATABASE OPEN FORCE;
操作已执行
已用时间: 00:00:01.798. 执行号:0.

以 MOUNT 方式启动的目的是防止启动后有用户执行 DDL 操作,因此先禁止 DDL 后再OPEN。

动态增加 MAL

分别本地登录 MPP 系统中原有的每个节点,执行下列语句为每个原有节点的 MAL 配置增加新增节点信息。

--设置本地 MAL 配置状态
SF_MAL_CONFIG(1,0);
--增加 MAL 配置
SF_MAL_INST_ADD('MAL_INST3','EP03','10.0.0.202',30001,'10.0.0.202',5238);
--应用 MAL 配置
SF_MAL_CONFIG_APPLY();
--重置本地 MAL 配置状态
SF_MAL_CONFIG(0,0);
[dmdba@ep01 DMDB]$ disql sysdba/dameng123*local

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 7.433(毫秒)
disql V8
SQL> SF_MAL_CONFIG(1,0);
DMSQL 过程已成功完成
已用时间: 39.929(毫秒). 执行号:5.
SQL> SF_MAL_INST_ADD('MAL_INST3','EP03','10.0.0.202',30001,'10.0.0.202',5238);
DMSQL 过程已成功完成
已用时间: 1.251(毫秒). 执行号:7.
SQL> SF_MAL_CONFIG_APPLY();
DMSQL 过程已成功完成
已用时间: 0.712(毫秒). 执行号:8.
SQL> SF_MAL_CONFIG(0,0);
DMSQL 过程已成功完成
已用时间: 0.931(毫秒). 执行号:9.

增加 MPP 节点,设置表的标记

全局登录 MPP 系统原有节点中的任一个,执行下列语句。

--广播方式设置 MAL 配置状态
SF_MAL_CONFIG(1,1);
--保存老的 HASHMAP
SF_MPP_SAVE_HASHMAP();
--增加 MPP 实例 EP03
SF_MPP_INST_ADD('service_name3', 'EP03'); 


disql V8
SQL> SF_MAL_CONFIG(1,1);
DMSQL 过程已成功完成
已用时间: 4.760(毫秒). 执行号:686837.
SQL> SF_MPP_SAVE_HASHMAP();
DMSQL 过程已成功完成
已用时间: 7.608(毫秒). 执行号:686838.
SQL> SF_MPP_INST_ADD('service_name3', 'EP03');
DMSQL 过程已成功完成
已用时间: 00:00:01.890. 执行号:686839.

增加节点配置后,之前的连接失效,需要断开连接,重新全局登录,然后执行下列语句。

--设置分布表的重分发状态
SF_MPP_REDIS_STATE_SET_ALL();
--广播方式重置 MAL 配置状态
SF_MAL_CONFIG(0,1);
--增加节点之后,可以放开 DDL 限制
SP_DDL_FORBIDEN(0); 

disql V8
SQL> SF_MPP_REDIS_STATE_SET_ALL();
DMSQL 过程已成功完成
已用时间: 151.993(毫秒). 执行号:334526.
SQL> SF_MAL_CONFIG(0,1);
DMSQL 过程已成功完成
已用时间: 3.625(毫秒). 执行号:334527.
SQL> SP_DDL_FORBIDEN(0);
DMSQL 过程已成功完成
已用时间: 4.641(毫秒). 执行号:334528.
SQL>

至此,节点 EP03 已经顺利地加入 MPP 系统中。但是,MPP 系统动态扩容并没有完成,在原有 MPP 系统中建立的哈希分布表、复制分布表和随机分布表需要在增加节点后的 MPP系统中进行数据重分发。

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
3 service_name3 EP03 2 OK

已用时间: 19.185(毫秒). 执行号:334530.
赞(0)
MySQL学习笔记 » DM8-MPP系统动态扩容