使用GDS互联互通功能实现GaussDB(DWS)集群间数据迁移
本实践演示基于GDS导入导出的高并发能力,实现两套DWS集群之间1500万行数据的分钟级迁移。
- 该功能仅8.1.2及以上集群版本支持。
- GDS为GaussDB(DWS)自研的高并发导入导出工具,了解更多请参考GDS使用说明。
- 本章节仅演示操作实践,GDS互联互通介绍及语法说明的详细内容,请参见基于GDS的跨集群互联互通。
本实践预计时长90分钟,实践用到的云服务资源主要是数据仓库服务GaussDB(DWS)、弹性云服务 ECS、虚拟私有云服务 VPC,基本流程如下:
支持区域
当前已上传OBS数据的区域如表1所示。
区域 |
OBS桶名 |
---|---|
华北-北京一 |
dws-demo-cn-north-1 |
华北-北京二 |
dws-demo-cn-north-2 |
华北-北京四 |
dws-demo-cn-north-4 |
华北-乌兰察布一 |
dws-demo-cn-north-9 |
华东-上海一 |
dws-demo-cn-east-3 |
华东-上海二 |
dws-demo-cn-east-2 |
华南-广州 |
dws-demo-cn-south-1 |
华南-广州友好 |
dws-demo-cn-south-4 |
中国-香港 |
dws-demo-ap-southeast-1 |
亚太-新加坡 |
dws-demo-ap-southeast-3 |
亚太-曼谷 |
dws-demo-ap-southeast-2 |
拉美-圣地亚哥 |
dws-demo-la-south-2 |
非洲-约翰内斯堡 |
dws-demo-af-south-1 |
拉美-墨西哥城一 |
dws-demo-na-mexico-1 |
拉美-墨西哥城二 |
dws-demo-la-north-2 |
莫斯科二 |
dws-demo-ru-northwest-2 |
拉美-圣保罗一 |
dws-demo-sa-brazil-1 |
约束限制
本实践中两套DWS、ECS服务在同一个区域和虚拟私有云VPC下,确保网络互通。
步骤二:准备源端数据
- 在GaussDB(DWS)控制台的“集群管理”,单击源集群dws-demo01所在行操作列的“登录”按钮。
本实践以8.1.3.x版本为例,8.1.2及以前版本不支持此登录方式,可以使用Data Studio连接集群。
- 登录成功后,进入SQL编辑器。
- 复制如下SQL语句到SQL窗口中,单击“执行SQL”,创建测试TPC-H表ORDERS。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
CREATE TABLE ORDERS ( O_ORDERKEY BIGINT NOT NULL , O_CUSTKEY BIGINT NOT NULL , O_ORDERSTATUS CHAR(1) NOT NULL , O_TOTALPRICE DECIMAL(15,2) NOT NULL , O_ORDERDATE DATE NOT NULL , O_ORDERPRIORITY CHAR(15) NOT NULL , O_CLERK CHAR(15) NOT NULL , O_SHIPPRIORITY BIGINT NOT NULL , O_COMMENT VARCHAR(79) NOT NULL) with (orientation = column) distribute by hash(O_ORDERKEY) PARTITION BY RANGE(O_ORDERDATE) ( PARTITION O_ORDERDATE_1 VALUES LESS THAN('1993-01-01 00:00:00'), PARTITION O_ORDERDATE_2 VALUES LESS THAN('1994-01-01 00:00:00'), PARTITION O_ORDERDATE_3 VALUES LESS THAN('1995-01-01 00:00:00'), PARTITION O_ORDERDATE_4 VALUES LESS THAN('1996-01-01 00:00:00'), PARTITION O_ORDERDATE_5 VALUES LESS THAN('1997-01-01 00:00:00'), PARTITION O_ORDERDATE_6 VALUES LESS THAN('1998-01-01 00:00:00'), PARTITION O_ORDERDATE_7 VALUES LESS THAN('1999-01-01 00:00:00') );
- 继续执行以下SQL语句,创建OBS外表。
其中AK值、SK值替换成实际账号的AK、SK值。<obs_bucket_name>由支持区域获取。
认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
CREATE FOREIGN TABLE ORDERS01 ( LIKE orders ) SERVER gsmpp_server OPTIONS ( ENCODING 'utf8', LOCATION 'obs://<obs_bucket_name>/tpch/orders.tbl', FORMAT 'text', DELIMITER '|', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', CHUNKSIZE '64', IGNORE_EXTRA_DATA 'on' );
- 执行以下SQL,从OBS外表导入数据到源DWS集群。导入时间预计2分钟,请等待。
如果出现导入错误,则是因为上面的外表AK值、SK值有误导致,请执行DROP FOREIGN TABLE order01;删除外表后,重新创建外表,再重试执行以下语句导入数据。
1
INSERT INTO orders SELECT * FROM orders01;
- 按以上方法,登录目标端集群dws-demo02,执行以下SQL,创建目标表orders。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
CREATE TABLE ORDERS ( O_ORDERKEY BIGINT NOT NULL , O_CUSTKEY BIGINT NOT NULL , O_ORDERSTATUS CHAR(1) NOT NULL , O_TOTALPRICE DECIMAL(15,2) NOT NULL , O_ORDERDATE DATE NOT NULL , O_ORDERPRIORITY CHAR(15) NOT NULL , O_CLERK CHAR(15) NOT NULL , O_SHIPPRIORITY BIGINT NOT NULL , O_COMMENT VARCHAR(79) NOT NULL) with (orientation = column) distribute by hash(O_ORDERKEY) PARTITION BY RANGE(O_ORDERDATE) ( PARTITION O_ORDERDATE_1 VALUES LESS THAN('1993-01-01 00:00:00'), PARTITION O_ORDERDATE_2 VALUES LESS THAN('1994-01-01 00:00:00'), PARTITION O_ORDERDATE_3 VALUES LESS THAN('1995-01-01 00:00:00'), PARTITION O_ORDERDATE_4 VALUES LESS THAN('1996-01-01 00:00:00'), PARTITION O_ORDERDATE_5 VALUES LESS THAN('1997-01-01 00:00:00'), PARTITION O_ORDERDATE_6 VALUES LESS THAN('1998-01-01 00:00:00'), PARTITION O_ORDERDATE_7 VALUES LESS THAN('1999-01-01 00:00:00') );
步骤三:安装并启动GDS服务器
- 参见弹性云服务的购买弹性云服务器创建弹性云服务器,注意ECS与DWS创建在同一个区域、VPC内,本例ECS镜像选择CentOS 7.6版本。
- 下载GDS工具包。
- 登录GaussDB(DWS)管理控制台。
- 在左侧导航栏中,单击“管理 > 连接客户端”。
- 在“命令行客户端”的下拉列表中,选择对应版本的GDS客户端。
请根据集群版本和安装客户端的操作系统,选择对应版本。
- 单击“下载”。
- 使用SFTP工具将下载的客户端(本实验以dws_client_8.2.x_redhat_x64.zip为例)上传至ECS的/opt目录下。
- 使用root用户登录ECS执行以下命令,进入/opt目录,解压客户端。
1 2
cd /opt unzip dws_client_8.2.x_redhat_x64.zip
- 创建GDS专有用户及所属用户组,此用户用于启动GDS及读取源数据。
1 2
groupadd gdsgrp useradd -g gdsgrp gds_user
- 分别修改工具包和数据源文件目录属主为GDS专有用户。
1 2
chown -R gds_user:gdsgrp /opt/gds/bin chown -R gds_user:gdsgrp /opt
- 切换到gds用户。
1
su - gds_user
- 执行以下命令进入gds目录,并执行环境变量。
1 2
cd /opt/gds/bin source gds_env
- 执行以下命令启动gds,其中ECS内网IP通过ECS控制台查看如下。
1
/opt/gds/bin/gds -d /opt -p ECS内网IP:5000 -H 0.0.0.0/0 -l /opt/gds/bin/gds_log.txt -D -t 2
- 放通ECS到DWS之间的网络端口。
由于GDS服务器(即本实验ECS)与DWS需要建立通讯,ECS默认的安全组入方向并没有放通GDS端口5000和DWS端口8000,需执行以下步骤:
步骤四:实现跨DWS集群的数据互联互通
- 创建server。
- 获取源端DWS集群的内网IP:切换到DWS控制台,左侧选择“专属集群 > 集群列表”,单击源端集群名称dws-demo01。
- 进入集群详情名称,记录DWS的内网IP。
- 切回到DWS控制台,单击目标端dws-demo02所在行操作列的“登录”按钮,进入到SQL窗口,
其中,源端DWS集群内网IP由以上步骤获取,ECS服务器内网IP从ECS控制台获取,用户dbadmin的登录密码在创建DWS集群时设定。
1 2 3 4 5 6 7 8 9
CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS ( address '源端DWS集群内网IP:8000', dbname 'gaussdb', username 'dbadmin', password '用户dbadmin的登录密码', syncsrv 'gsfs://ECS服务器内网IP:5000' ) ;
- 创建互联互通外表。
继续在目标端集群dws-demo02的SQL窗口执行以下命令创建互联互通外表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
CREATE FOREIGN TABLE ft_orders ( O_ORDERKEY BIGINT , O_CUSTKEY BIGINT , O_ORDERSTATUS CHAR(1) , O_TOTALPRICE DECIMAL(15,2) , O_ORDERDATE DATE , O_ORDERPRIORITY CHAR(15) , O_CLERK CHAR(15) , O_SHIPPRIORITY BIGINT , O_COMMENT VARCHAR(79) ) SERVER server_remote OPTIONS ( schema_name 'public', table_name 'orders', encoding 'SQL_ASCII' );
- 执行全表数据导入。
在SQL窗口中继续执行以下SQL语句,从ft_orders外表中导入全量数据。等待约1分钟导入。
1
INSERT INTO orders SELECT * FROM ft_orders;
执行以下SQL查询,确认导入1500万行数据成功。
1
SELECT count(*) FROM orders;
- 按过滤条件执行数据导入。
1
INSERT INTO orders SELECT * FROM ft_orders WHERE o_orderkey < '10000000';