暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8a MPP Cluster快速扩容(搬数据分片)实战_上半场

原创 白军奎 2020-07-30
1173

1.环境准备

1)四节点集群distribution信息
图片1.png
采用的distribution是p6 d1的方式,每个节点上有6个主分片,共24个数据分片,每个分片有一个备份。
2)建库建表
gbase> create database test;
Query OK, 1 row affected (Elapsed: 00:00:00.08)

gbase> use test;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)

gbase> create table t(a int);
Query OK, 0 rows affected (Elapsed: 00:00:00.54)

gbase> create table t_dis(a int) distributed by (‘a’);
Query OK, 0 rows affected (Elapsed: 00:00:00.73)

gbase> create table t_rep(a int) replicated;
Query OK, 0 rows affected (Elapsed: 00:00:00.54)
3)准备数据文件:
[gbase@lz-node-0 RH]$ cat 1.sh
#!/bin/bash
for ((i=0;i<=65536;i++))
do
echo “(”$i")," >> 111.sql
done
生成如 insert into t values(0),(1),(2),… 形式的sql文件,插入64k行的数据。

4)向3个表中分别插入 0~65536 这些数值
gbase> show tables;
±---------------+
| Tables_in_test |
±---------------+
| t |
| t_dis |
| t_rep |
±---------------+
3 rows in set (Elapsed: 00:00:00.00)

gbase> select count() from t;
±---------+
| count(
) |
±---------+
| 65537 |
±---------+
1 row in set (Elapsed: 00:00:00.15)

gbase> select count() from t_dis;
±---------+
| count(
) |
±---------+
| 65537 |
±---------+
1 row in set (Elapsed: 00:00:00.09)

gbase> select count() from t_rep;
±---------+
| count(
) |
±---------+
| 65537 |
±---------+
1 row in set (Elapsed: 00:00:00.04)
5)统计结果
统计数据在各个分片表中的数据行数,方式:
gncli -uuser -ppasswd -hip1 -e"select count(*) from test.t_n1"

6)找其中一个节点查看表分片信息
[gbase@lz-node-0 sys_tablespace]$ pwd
/opt/gnode/userdata/gbase/test/sys_tablespace
[gbase@lz-node-0 sys_tablespace]$ ll
total 0
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n1
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n12
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n13
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n16
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n17
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n20
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n21
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n24
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n4
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n5
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n8
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_dis_n9
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_n1
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n12
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n13
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n16
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n17
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n20
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n21
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n24
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n4
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n5
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n8
drwx------. 2 gbase gbase 6 Jul 18 10:27 t_n9
drwx------. 2 gbase gbase 26 Jul 18 10:32 t_rep
选取的是第一个数据节点10.10.2.76,共有分片表25个(每个分布表在该节点上有12个分片,6个主分片、6个分发分片。t_rep为复制表)

2.扩容

为达到集群扩容,搬分片的目的,必要条件是扩容前后集群的gbase.nodedatamap保持不变。
编写新的demo.options_2

[gbase@lz-node-0 gcinstall]$ cat demo.options_2 
installPrefix= /opt
#coordinateHost = 10.10.2.76,10.10.3.79,10.10.3.54
#coordinateHostNodeID = 234,235,237
dataHost = 10.10.2.99,10.10.2.179,10.10.0.139,10.10.3.199
existCoordinateHost =10.10.2.76,10.10.3.79,10.10.3.54
existDataHost =10.10.2.76,10.10.3.79,10.10.3.54,10.10.1.109
loginUser= root
loginUserPwd = 'pwd'
#loginUserPwdFile = loginUserPwd.json
dbaUser = gbase
dbaGroup = gbase
dbaPwd = 'gbase'
rootPwd = 'pwd'
#rootPwdFile = rootPwd.json
dbRootPwd = ''
#mcastAddr = 226.94.1.39
mcastPort = 5497

执行扩容
./gcinstall.py --silent=demo.options_2
… 等待并按照提示,输入y继续
… 直到安装新节点成功
10.10.2.179 Install gcluster on host 10.10.2.179 successfully.
10.10.0.139 Install gcluster on host 10.10.0.139 successfully.
10.10.2.99 Install gcluster on host 10.10.2.99 successfully.
10.10.3.199 Install gcluster on host 10.10.3.199 successfully.
Update and sync configuration file…
Starting all gcluster nodes…
Adding new datanodes to gcware…
此时gcadmin showdistribution查看node信息并未改变。

创建新的distribution
编辑gcChangeInfo.xml文件引用配置文件distribution_info.xml_new
[gbase@lz-node-0 gcinstall]$ vi gcChangeInfo.xml

distribution_info.xml_new配置文件内容如下:
<?xml version='1.0' encoding="utf-8"?>
<distributions>
    <distribution>
        <segments>
			<segment>
                <primarynode ip="10.10.2.76"/>
                <duplicatenodes>
                    <duplicatenode ip="10.10.3.79"/>
                </duplicatenodes>
            </segment>
            <segment>
                <primarynode ip="10.10.3.79"/>
                <duplicatenodes>
                    <duplicatenode ip="10.10.3.54"/>
                </duplicatenodes>
            </segment>
            <segment>
                <primarynode ip="10.10.3.54"/>

                <duplicatenodes>
                    <duplicatenode ip="10.10.1.109"/>
                </duplicatenodes>
            </segment>
            <segment>
                <primarynode ip="10.10.1.109"/>
            <segment>
                <primarynode ip="10.10.3.199"/>

                <duplicatenodes>
                    <duplicatenode ip="10.10.2.99"/>
                </duplicatenodes>
            </segment>	
        </segments>
    </distribution>
</distributions>

这里不完整列举了。

新建distribution

[gbase@lz-node-0 gcinstall]$ gcadmin distribution gcChangeInfo.xml
gcadmin generate distribution …

copy system table from 10.10.3.79 to 10.10.2.179
source ip: 10.10.3.79
target ip: 10.10.2.179
copy system table from 10.10.3.54 to 10.10.0.139
source ip: 10.10.3.54
target ip: 10.10.0.139
copy system table from 10.10.1.109 to 10.10.3.199
source ip: 10.10.1.109
target ip: 10.10.3.199
copy system table from 10.10.2.76 to 10.10.2.99
source ip: 10.10.2.76
target ip: 10.10.2.99
gcadmin generate distribution successful

此时查看集群新的distribution如下图
图片2.png

新创建的distributionid为2,以10.10.2.76节点为例,
扩容前该节点上的主分片有 _n1,_n5,_n9,_n13,_n17,_n21 ; 备份分片有 _n4,_n8,_n12,_n16,_n20,_n24
扩容后,10.10.2.76节点上的主分片变为:_n1,_n5,_n9; 备份分片_n4,_n8,_n12。 将_n13,_n17,_n21主分片和_n16,_n20,_n24备份分片移到了10.10.2.99节点。
**
初始化新的nodedatamap**
gbase> initnodedatamap;
Query OK, 0 rows affected (Elapsed: 00:00:03.20)

至此,扩容工作完成了一半,已完成新节点的加入以及完成新的distribution分布策略的制定和生成。
这里做下验证,确保新旧的数据分布是一样的(验证新旧的nodedatamap一致)。

gbase> use test;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)

gbase> CREATE TABLE "nodedatamap" ("hashkey" int(11) DEFAULT NULL, "nodeid" int(11) DEFAULT NULL, "data_distribution_id" bigint(8) DEFAULT NULL);
Query OK, 0 rows affected (Elapsed: 00:00:00.58)

gbase> set _gbase_query_path='on';
Query OK, 0 rows affected (Elapsed: 00:00:00.01)

gbase> insert into test.nodedatamap select * from gbase.nodedatamap ; 
Query OK, 131072 rows affected (Elapsed: 00:00:01.26)
Records: 131072  Duplicates: 0  Warnings: 0

gbase> select hashkey,nodeid from test.nodedatamap where data_distribution_id=1 minus 
select hashkey,nodeid from test.nodedatamap where data_distribution_id=2;
Empty set (Elapsed: 00:00:00.66)

data_distribution_id=2和data_distribution_id=1的数据完全一样,即表明这两个的数据分布一致。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论