签到成功

知道了

CNDBA社区CNDBA社区

DM7 达梦 数据库 大规模并行处理 MPP (4) -- 动态扩容

2019-09-08 01:14 2535 1 原创 DM 达梦
作者: dave

DM MPP 提供了系统动态扩容功能,在不影响数据库应用的情况下,可以为 DM MPP 集群动态增加新的 EP。 在之前的博客,我们搭建了2EP节点的MPP集群,如下:

DM7 达梦数据库 大规模并行处理 MPP (2) — 环境搭建和使用
https://www.cndba.cn/dave/article/3658

下面对该集群添加第三个EP节点。

http://www.cndba.cn/cndba/dave/article/3662

1 环境准备

之前的 MPP环境已有 DAVE01 和 DAVE02 两个节点,现在要再增加一个节点 DAVE03。

实例名 MAL_INST_HOST MAL_INST_PORT MAL_HOST MAL端口 MPP_SEQNO
dave01 192.168.20.191 5236 192.168.56.191 5269 0
dave02 192.168.20.192 5237 192.168.56.192 5270 1
dave03 192.168.20.193 5238 192.168.56.193 5271 2

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

--哈希分布表 T1
DROP TABLE T1;
CREATE TABLE T1(C1 INT,C2 INT,C3 INT,C4 VARCHAR(20)) DISTRIBUTED BY HASH(C1);
DECLARE 
i INT;
BEGIN 
FOR i IN 1..1000 LOOP
INSERT INTO T1 VALUES (i,i+1,i+2,'www.cndba.cn');
END LOOP;
END;
/
COMMIT;

--哈希分布表 T2
DROP TABLE T2;
CREATE HUGE TABLE T2(C1 INT,C2 INT,C3 INT,C4 VARCHAR(20)) DISTRIBUTED BY 
HASH(C1);
DECLARE 
i INT;
BEGIN 
FOR i IN 1..10 LOOP
INSERT INTO T2 VALUES (i,i+1,i+2,'www.cndba.cn');
END LOOP;
END;
/
COMMIT;

--复制分布表 T3
DROP TABLE T3;
CREATE TABLE T3(C1 INT,C2 INT,C3 INT,C4 VARCHAR(20)) DISTRIBUTED FULLY;
DECLARE 
i INT;
BEGIN 
FOR i IN 1..1000 LOOP
INSERT INTO T3 VALUES (i,i+1,i+2,'www.cndba.cn');
END LOOP;
END;
/
COMMIT;

--随机分布表 T4
DROP TABLE T4;
CREATE TABLE T4(C1 INT,C2 INT,C3 INT,C4 VARCHAR(20)) DISTRIBUTED RANDOMLY;
DECLARE 
i INT;
BEGIN 
FOR i IN 1..1000 LOOP
INSERT INTO T4 VALUES (i,i+1,i+2,'www.cndba.cn');
END LOOP;
END;
/
COMMIT;

2 动态增加节点

2.1 禁止系统 DDL 操作

全局登录 MPP 系统任一节点,执行下面的语句禁止系统的 DDL 操作。http://www.cndba.cn/cndba/dave/article/3662

SQL> SP_DDL_FORBIDEN(1);
DMSQL executed successfully
used time: 5.155(ms). Execute id is 234060.

2.2 克隆数据库

数据库克隆的目的是把系统中的对象定义信息进行备份,用于恢复到新加的节点上,生成的备份集位于指定的目录备份集中。
若 MPP 系统处于运行状态,采用联机 DDL 克隆方式(需要配置本地归档)。

DM7 达梦数据库 重做日志管理 及 归档模式切换
https://www.cndba.cn/dave/article/3575http://www.cndba.cn/cndba/dave/article/3662

全局登录 MPP 系统任一节点,执行下面的语句。

[dave@www.cndba.cn1 bin]$ ./disql SYSDBA/SYSDBA

Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 14.731(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> backup database ddl_clone backupset '/dm/dmclone';
executed successfully
used time: 00:00:01.111. Execute id is 854770.
SQL>

生成的备份集保存在/dm/dmclone目录中。

[dave@www.cndba.cn1 dmclone]$ pwd
/dm/dmclone
[dave@www.cndba.cn1 dmclone]$ ll
总用量 5152
-rw-r--r-- 1 dmdba dinstall 5157376  9月  7 23:02 dmclone.bak
-rw-r--r-- 1 dmdba dinstall  112640  9月  7 23:02 dmclone.meta
[dave@www.cndba.cn1 dmclone]$

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

RMAN>backup database ‘/dm/dmdbms/data/dave01/dm.ini’ ddl_clone backupset ‘/dm/dmclone’;

2.3 脱机还原

在新增节点上执行脱机还原。手动拷贝克隆的备份集目录 clone 到新增节点dave03 的备份目录中,使用 DMRMAN 工具进行脱机还原。http://www.cndba.cn/cndba/dave/article/3662

#复制备份文件:
[dave@www.cndba.cn1 dmclone]$ ll
总用量 5152
-rw-r--r-- 1 dmdba dinstall 5157376  9月  7 23:02 dmclone.bak
-rw-r--r-- 1 dmdba dinstall  112640  9月  7 23:02 dmclone.meta
[dave@www.cndba.cn1 dmclone]$ scp dmclone.* 192.168.20.193:`pwd`
dmdba@192.168.20.193's password: 
dmclone.bak                 100% 5037KB   4.9MB/s   00:00    
dmclone.meta                100%  110KB 110.0KB/s   00:00    
[dave@www.cndba.cn1 dmclone]$ 

#初始化dave03:
[dave@www.cndba.cn3 dave03]$ dminit path=/dm/dmdbms/data db_name=dave03 instance_name=dave03 auto_overwrite=1

#还原和恢复


[dave@www.cndba.cn3 dmclone]$ cd /dm/dmdbms/bin
[dave@www.cndba.cn3 bin]$ ./dmrman 
dmrman V7.6.0.95-Build(2018.09.13-97108)ENT 

RMAN> restore database '/dm/dmdbms/data/dave03/dm.ini' from backupset '/dm/dmclone';
restore database '/dm/dmdbms/data/dave03/dm.ini' from backupset '/dm/dmclone';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[4].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[3].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[2].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[1].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[0].
checking if the database under system path [/dm/dmdbms/data/dave03] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm/dmclone] START......
total 1 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 2 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 8173.528(ms)

RMAN> recover database '/dm/dmdbms/data/dave03/dm.ini' from backupset '/dm/dmclone';
recover database '/dm/dmdbms/data/dave03/dm.ini' from backupset '/dm/dmclone';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[4].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[3].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[2].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[1].
checking if the database under system path [/dm/dmdbms/data/dave03] is running...[0].
checking if the database under system path [/dm/dmdbms/data/dave03] is running, write dmrman info.
EP[0] max_lsn: 62307
RESTORE RLOG  CHECK......
CMD END.CODE:[603],DESC:[no log generates while the backupset [/dm/dmclone] created]
no log generates while the backupset [/dm/dmclone] created
ndct db load finished
ndct db load finished
recover successfully!
time used: 7031.813(ms)
RMAN>

若要增加多个节点,则依次执行拷贝、脱机还原步骤。http://www.cndba.cn/cndba/dave/article/3662

2.4 配置新增节点的 dmmal.ini 和 dm.ini 文件

为新增的节点配置 dmmal.ini,其中包含扩容前 MPP 系统的节点,以及新增节点dave03的信息。

[MAL_INST1]
MAL_INST_NAME = DAVE01
MAL_HOST = 192.168.56.191
MAL_PORT = 5269
MAL_INST_HOST = 192.168.20.191
MAL_INST_PORT = 5236

[MAL_INST2]
MAL_INST_NAME = DAVE02
MAL_HOST = 192.168.56.192
MAL_PORT = 5270
MAL_INST_HOST = 192.168.20.192
MAL_INST_PORT = 5237

[MAL_INST3]
MAL_INST_NAME = DAVE03
MAL_HOST = 192.168.56.193
MAL_PORT = 5271
MAL_INST_HOST = 192.168.20.193
MAL_INST_PORT = 5238

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

INSTANCE_NAME = DAVE03
PORT_NUM = 5238
MAL_INI = 1
MPP_INI = 0

2.5 MOUNT 方式启动新增节点

以 MOUNT 方式启动新增节点 DAVE03,登录后执行如下命令。

#启动到Mount状态:
[dave@www.cndba.cn3 dave03]$  dmserver /dm/dmdbms/data/dave03/dm.ini mount -noconsole
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.0.95-Build(2018.09.13-97108)ENT  startup...
License will expire in 14 day(s) on 2019-09-21
ckpt lsn: 62307
ndct db load finished
ndct fill fast pool finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
SYSTEM IS READY.

#禁用DDL:
[dave@www.cndba.cn3 bin]$ disql SYSDBA/SYSDBA@192.168.20.193:5238

Server[192.168.20.193:5238]:mode is normal, state is mount
login used time: 21.437(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SP_DDL_FORBIDEN(1);
DMSQL executed successfully
used time: 21.146(ms). Execute id is 1.
SQL> ALTER DATABASE OPEN FORCE;
executed successfully
used time: 754.426(ms). Execute id is 0.
SQL>

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

2.6 动态增加 MAL

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

[dave@www.cndba.cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5237

Server[localhost:5237]:mode is normal, state is open
login used time: 20.275(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95

#设置本地 MAL 配置状态
SQL> SF_MAL_CONFIG(1,0);
DMSQL executed successfully
used time: 3.315(ms). Execute id is 737150.

#增加 MAL 配置
SQL> SF_MAL_INST_ADD('MAL_INST3','DAVE03','192.168.56.193',5271, '192.168.20.193',5238);
DMSQL executed successfully
used time: 1.394(ms). Execute id is 737151.

#应用 MAL 配置
SQL> SF_MAL_CONFIG_APPLY();
DMSQL executed successfully
used time: 1.323(ms). Execute id is 737152.

#重置本地 MAL 配置状态
SQL> SF_MAL_CONFIG(0,0);
DMSQL executed successfully
used time: 0.852(ms). Execute id is 737153.
SQL>

操作完成后原MPP节点的dmmal.ini 文件中就增加了DAVE03节点的信息。

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

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

#广播方式设置 MAL 配置状态
SQL> SF_MAL_CONFIG(1,1);
DMSQL executed successfully
used time: 3.086(ms). Execute id is 737154.

#保存老的 HASHMAP
SQL> SF_MPP_SAVE_HASHMAP();
DMSQL executed successfully
used time: 22.018(ms). Execute id is 737155.

#增加 MPP 实例 DAVE03
SQL> SF_MPP_INST_ADD('service_name3', 'DAVE03');
DMSQL executed successfully
used time: 00:00:02.046. Execute id is 737156.
SQL> SF_MPP_REDIS_STATE_SET_ALL();
SF_MPP_REDIS_STATE_SET_ALL();
[-610]:msession closed.
used time: 33.851(ms). Execute id is 0.
SQL> EXIT

#增加节点配置后,之前的连接失效,需要断开连接,重新全局登录,然后执行下列语句:
[dave@www.cndba.cn2 ~]$ disql SYSDBA/SYSDBA@localhost:5237

Server[localhost:5237]:mode is normal, state is open
login used time: 20.402(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95

#设置分布表的重分发状态
SQL> SF_MPP_REDIS_STATE_SET_ALL();
DMSQL executed successfully
used time: 40.090(ms). Execute id is 789594.

#广播方式重置 MAL 配置状态
SQL> SF_MAL_CONFIG(0,1);
DMSQL executed successfully
used time: 2.492(ms). Execute id is 789595.

#增加节点之后,可以放开 DDL 限制
SQL> SP_DDL_FORBIDEN(0);
DMSQL executed successfully
used time: 5.124(ms). Execute id is 789596.
SQL> 


最后用服务正常启动DAVE03 节点。
[dave@www.cndba.cn3 dave03]$ service DmServicedave03 start
Starting DmServicedave03:                                  [ OK ]
[dave@www.cndba.cn3 dave03]$

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

3 数据重分发

MPP 动态增加节点后,原系统中的哈希分布表、复制分布表和随机分布表需要进行数据重分发,范围分布表和 LIST 分布表不需要进行数据重分发。http://www.cndba.cn/cndba/dave/article/3662

3.1 哈希分布表数据重分发

之前创建的 T1 和 T2 表都是哈希分布表,其中 T1 为普通表,T2 为 HUGE 表,下面以这两个表为例进行哈希分布表的数据重分发。

http://www.cndba.cn/cndba/dave/article/3662

具体步骤如下:

1)全局登录新增节点 DAVE03(如果新增多个节点,则要分别全局登录每个新增节点)
[dave@www.cndba.cn3 dave03]$ disql cndba/"www.cndba.cn"@192.168.20.193:5238

Server[192.168.20.193:5238]:mode is normal, state is open
login used time: 9.761(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95

2) 设置本 session 可对表进行重分发(插入和删除),执行如下语句:
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 10.535(ms). Execute id is 516984.

3) 设置重分发状态,执行如下语句:
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T1',2);
DMSQL executed successfully
used time: 6.893(ms). Execute id is 516985.
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T2',2);
DMSQL executed successfully
used time: 4.087(ms). Execute id is 516986.
SQL> 

4) 进行查询插入,执行如下语句:
#注意这里的2是DAVE03节点的 SEQNO,如果增加节点较多,对应进行修改:
SQL> INSERT INTO T1 SELECT * FROM T1 WHERE EP_SEQNO('T1')= 2;
affect rows 333

used time: 52.033(ms). Execute id is 269534.
SQL> COMMIT;
executed successfully
used time: 11.109(ms). Execute id is 269535.
SQL> INSERT INTO T2 SELECT * FROM T2 WHERE EP_SEQNO('T2')= 2;
affect rows 3

used time: 39.558(ms). Execute id is 269537.
SQL> COMMIT;
executed successfully
used time: 3.271(ms). Execute id is 269538.
SQL> 


5) 设置待删除数据状态,执行如下语句:
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T1',3);
DMSQL executed successfully
used time: 4.692(ms). Execute id is 269539.
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T2',3);
DMSQL executed successfully
used time: 4.446(ms). Execute id is 269540.
SQL> 

6) 本地登录每个 MPP 系统的原有节点,删除分发出去的数据。
执行如下语句:
#注意这里的LOCAL,默认是全局的,可以不写:
[dave@www.cndba.cn2 ~]$ disql cndba/"www.cndba.cn"*LOCAL@192.168.20.192:5237

Server[192.168.20.192:5237]:mode is normal, state is open
login used time: 20.457(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> 
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 8.576(ms). Execute id is 868328.

对于普通表 T1,执行如下语句:
#注意这里的2是DAVE03节点的 SEQNO
SQL> DELETE FROM T1 WHERE EP_SEQNO('T1')=2;
affect rows 666

used time: 15.665(ms). Execute id is 868330.
SQL> commit;
executed successfully
used time: 5.851(ms). Execute id is 868331.
SQL> 

如果新增了多个节点,则需要删除分发到所有这些新增节点的数据,语句形如:
DELETE FROM T1 WHERE EP_SEQNO('T1')=新加节点MPP序号

对于 HUGE 表 T2,由于直接使用 DELETE 效率较低,采用查询插入再删除表的方式:
--放开本地登录下的 DDL 限制
[dave@www.cndba.cn2 ~]$ disql cndba/"www.cndba.cn"*LOCAL@192.168.20.192:5237

Server[192.168.20.192:5237]:mode is normal, state is open
login used time: 20.457(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SET_SESSION_MPP_REDIS(1);
SQL> SP_SET_SESSION_LOCAL_TYPE(1);
SQL> CREATE TABLE STR_TAB(A VARCHAR);
SQL> INSERT INTO STR_TAB SELECT TABLEDEF('CNDBA','T2') FROM DUAL;
SQL> ALTER TABLE T2 RENAME TO T2_REDIS;
DECLARE
sqltxt VARCHAR;
BEGIN
SELECT * INTO sqltxt FROM STR_TAB;
EXECUTE IMMEDIATE sqltxt;
END;
/
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T2',3);
#这里这里的1是对应的EP节点,我这里是在节点1上操作的,所以写1:
SQL>INSERT INTO T2 SELECT * FROM T2_REDIS WHERE EP_SEQNO('T2_REDIS')= 1;
SQL>DROP TABLE T2_REDIS;
SQL>DROP TABLE STR_TAB;
SQL>COMMIT;
在这个步骤中需要注意的是,如果表上建有二级索引,则需要重新创建二级索引。

7) 所有新增节点执行完上述步骤后,重置表的分发状态为普通状态,执行如下语句:
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T1',0);
DMSQL executed successfully
used time: 1.337(ms). Execute id is 8010.
SQL>

3.2 复制分布表数据重分发

表 T3 是复制分布表,下面以 T3 为例进行复制分布表的数据重分发。
具体步骤如下:

1)本地登录新增节点 DAVE03(如果新增多个节点,则要分别本地登录每个新增节点),执行如下语句:
#注意这里的LOCAL:
[dave@www.cndba.cn3 bin]$ disql cndba/"www.cndba.cn"*LOCAL@192.168.20.193:5238

Server[192.168.20.193:5238]:mode is normal, state is open
login used time: 9.644(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95

SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 3.646(ms). Execute id is 31.

#放开本地登录下的 DDL 限制
SQL> SP_SET_SESSION_LOCAL_TYPE(1); 
DMSQL executed successfully
used time: 1.060(ms). Execute id is 32.
SQL> 

2) 创建新增节点 DAVE03 到某一原有节点间的外部链接(如果新增多个节点,则要为每个新增节点创建一个这样的外部链接)
SQL> create link link_dave01 connect with cndba identified by "www.cndba.cn" using 'dave01';
executed successfully
used time: 4.029(ms). Execute id is 35.
SQL> 

这里的dave01 是我们的service_name,具体配置说明参考我的博客:
DM7 达梦数据库 disql 工具连接 数据库的三种方式
https://www.cndba.cn/dave/article/3572


3) 执行查询插入
SQL> INSERT INTO T3 SELECT * FROM T3@LINK_DAVE01;
affect rows 1000

used time: 14.804(ms). Execute id is 36.
SQL> commit;
executed successfully
used time: 8.291(ms). Execute id is 37.
SQL> 


4) 删除外部链接
SQL> DROP LINK LINK_DAVE01;
executed successfully
used time: 15.151(ms). Execute id is 38.

5)全局登录 MPP 系统,重置表的分发状态为普通状态,执行如下语句:

#disql默认就是全局,这里的GLOBAL可以不写:
[dave@www.cndba.cn3 bin]$ disql cndba/"www.cndba.cn"*GLOBAL@192.168.20.193:5238

Server[192.168.20.193:5238]:mode is normal, state is open
login used time: 10.310(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 9.253(ms). Execute id is 765130.
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T3',0);
DMSQL executed successfully
used time: 5.416(ms). Execute id is 765131.
SQL>

3.3 随机分布表数据重分发

表 T4 是随机分布表,下面以 T4 为例进行随机分布表的数据重分发。
具体步骤如下:

1) 本地登录新增节点 DAVE03(如果新增多个节点,则要分别本地登录每个新增节点),
执行如下语句:
[dave@www.cndba.cn3 bin]$ disql cndba/"www.cndba.cn"*LOCAL@192.168.20.193:5238

Server[192.168.20.193:5238]:mode is normal, state is open
login used time: 9.900(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 2.328(ms). Execute id is 41.

#放开本地登录下的 DDL 限制
SQL> SP_SET_SESSION_LOCAL_TYPE(1);
DMSQL executed successfully
used time: 1.440(ms). Execute id is 42.
SQL> 

2) 设置表的重分发状态
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T4',2);
DMSQL executed successfully
used time: 1.098(ms). Execute id is 43.

3) 创建 DAVE03 与每个原有节点间的外部链接(如果新增多个节点,则要为每个新增节点创建这样的外部链接)
SQL> create link link1 connect with cndba identified by "www.cndba.cn" using 'dave01';
executed successfully
used time: 3.755(ms). Execute id is 44.
SQL> create link link2 connect with cndba identified by "www.cndba.cn" using 'dave02';
executed successfully
used time: 3.619(ms). Execute id is 45.
SQL> 

4)本地登录每个原有节点,查出每个原有节点上表 T4 的 min(ROWID)和max(ROWID)。 

#DAVE01:
[dave@www.cndba.cn1 bin]$ ./disql cndba/"www.cndba.cn"*LOCAL

Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 9.353(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SELECT MIN(ROWID),MAX(ROWID) FROM T4;

LINEID     MIN(ROWID)           MAX(ROWID)          
---------- -------------------- --------------------
1          1                    488

used time: 5.089(ms). Execute id is 86.
SQL> 

#DAVE02:
[dave@www.cndba.cn2 ~]$ disql cndba/"www.cndba.cn"*LOCAL@192.168.20.192:5237

Server[192.168.20.192:5237]:mode is normal, state is open
login used time: 9.577(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL>  SELECT MIN(ROWID),MAX(ROWID) FROM T4;

LINEID     MIN(ROWID)           MAX(ROWID)          
---------- -------------------- --------------------
1          288230376151711745   288230376151712256

used time: 2.036(ms). Execute id is 8013.
SQL> 

5) 在新增节点 DAVE03 上,分别使用连接每个原有节点的外部链接执行查询插入。
SQL> INSERT INTO T4 SELECT * FROM T4@LINK1 WHERE ROWID BETWEEN V_MIN1 AND V_MIN1 + (V_MAX1 - V_MIN1)*1/3;
SQL> INSERT INTO T4 SELECT * FROM T4@LINK2 WHERE ROWID BETWEEN V_MIN2 AND V_MIN2 + (V_MAX2 - V_MIN2)*1/3;

说明:
V_MIN1 和 V_MAX1 对应第 4)步中查询出的 DAVE01上的 min(ROWID)和max(ROWID);
V_MIN2 和 V_MAX2 对应第 4)步中查询出的 DAVE02上的 min(ROWID)和 max(ROWID);
1/3 中的 3 表示动态增加节点后的节点总数。

如果有多个新增节点,则节点 2、节点 3……上执行的查询插入语句形如:
INSERT INTO T4 SELECT * FROM T4@LINKx WHERE ROWID BETWEEN V_MINx + (V_MAXx - V_MINx)*N_SEQ/N_SITE_NEW_TOTAL+ 1 AND V_MINx + (V_MAXx - V_MINx)*(N_SEQ + 1)/N_SITE_NEW_TOTAL;

说明:
V_MINx 和 V_MAXx 的意义与前面说明的一致;
N_SEQ 表示新增节点序号,新增节点 1 的 N_SEQ 为 0,新增节点 2 的 N_SEQ 为 1……;
N_SITE_NEW_TOTAL 表示动态增加节点后的节点总数。

我们这里的值是:
SQL> INSERT INTO T4 SELECT * FROM T4@LINK1 WHERE ROWID BETWEEN 1 AND 488 + 487*1/3;
affect rows 488
used time: 16.313(ms). Execute id is 46.

SQL> INSERT INTO T4 SELECT * FROM T4@LINK2 WHERE ROWID BETWEEN 288230376151711745 AND 288230376151711745 + (288230376151712256 - 288230376151711745)*1/3;
affect rows 171
used time: 11.426(ms). Execute id is 47.

SQL> commit;
executed successfully
used time: 5.002(ms). Execute id is 48.
SQL> 


6) 全局登录某一节点,设置表的待删除数据状态
[dave@www.cndba.cn1 bin]$ ./disql cndba/"www.cndba.cn"

Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 10.532(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T4',3);
DMSQL executed successfully
used time: 6.791(ms). Execute id is 91964.
SQL> 


7) 本地登录每个原有节点,删除分发出去的数据,执行如下语句:
SET_SESSION_MPP_REDIS(1);
DELETE FROM T4 WHERE ROWID BETWEEN V_MIN AND V_MIN + (V_MAX - V_MIN) * 1/3;

说明:
V_MIN 和 V_MAX 对应第 4)步中查询出的 min(ROWID)和 max(ROWID);
1/3 中的 1 表示新增节点数;3 表示动态增加节点后的节点总数。

我们这里dave01是:
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully

SQL> DELETE FROM T4 WHERE ROWID BETWEEN 1 AND 488 + 487*1/3;
affect rows 488
used time: 5.655(ms). Execute id is 90.

Dave02是:
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 0.836(ms). Execute id is 8016.
SQL> DELETE FROM T4 WHERE ROWID BETWEEN 288230376151711745 AND 288230376151711745 + (288230376151712256 - 288230376151711745)*1/3;
affect rows 171

used time: 2.928(ms). Execute id is 8017.
SQL> 

8) 每个原有节点都完成删除后,都执行提交操作。
COMMIT;

9) 全局登录某个节点,重置表的分发状态为普通状态,执行如下语句:
[dave@www.cndba.cn1 bin]$ ./disql cndba/"www.cndba.cn"

Server[LOCALHOST:5236]:mode is normal, state is open
login used time: 11.513(ms)
disql V7.6.0.95-Build(2018.09.13-97108)ENT 
Connected to: DM 7.1.6.95
SQL> SET_SESSION_MPP_REDIS(1);
DMSQL executed successfully
used time: 6.630(ms). Execute id is 81872.
SQL> SF_MPP_REDIS_STATE_SET('CNDBA','T4',0);
DMSQL executed successfully
used time: 3.675(ms). Execute id is 81873.
SQL> 


10) 本地登录DAVE03,删除之前创建的到每个原有节点的外部链接(如果新增多个节点,则要本地登录每个新增节点删除这些外部链接)
SQL> DROP LINK LINK1;
executed successfully
used time: 28.132(ms). Execute id is 52.
SQL> DROP LINK LINK2;
executed successfully
used time: 18.502(ms). Execute id is 53.
SQL>

至此,原有 MPP 的哈希分布表、复制分布表和随机分布表都已进行了数据重分发,但是还需要更新扩容后的 MPP 系统的控制文件中的数据分布控制结构。

全局登录某个节点,执行如下语句:http://www.cndba.cn/cndba/dave/article/3662

SQL> SF_MAL_CONFIG(1,1);
DMSQL executed successfully
used time: 2.615(ms). Execute id is 81874.
SQL> SF_MPP_SAVE_HASHMAP();
DMSQL executed successfully
used time: 18.079(ms). Execute id is 81875.
SQL> SF_MAL_CONFIG(0,1);
DMSQL executed successfully
used time: 2.524(ms). Execute id is 81876.
SQL>

MPP 系统动态扩容全部完成!

可以进一步通过SP_GET_EP_COUNT 过程查看分区情况:

SQL>  CALL SP_GET_EP_COUNT('CNDBA','T3');

LINEID     SEQNO       N_ROWS     
---------- ----------- -----------
1          0           1000
2          1           1000
3          2           1000

关于这里存储过程的说明参考:http://www.cndba.cn/cndba/dave/article/3662

DM7 达梦数据库 大规模并行处理 MPP (3) — 相关的系统过程和函数
https://www.cndba.cn/dave/article/3660

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2284
    原创
  • 3
    翻译
  • 580
    转载
  • 197
    评论
  • 访问:8205388次
  • 积分:4433
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ