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.
克隆数据库
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.
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.