# 使用GDS互联互通功能实现DWS集群间数据迁移
本实践演示基于GDS导入导出的高并发能力，实现两套DWS集群之间1500万行数据的分钟级迁移。
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
- 该功能仅8.1.2及以上集群版本支持。
- GDS为DWS自研的高并发导入导出工具，了解更多请参考[安装配置和启动GDS](https://support.huaweicloud.com/tg-dws/dws_07_0759.html)。
- 本章节仅演示操作实践，GDS互联互通介绍及语法说明的详细内容，请参见[基于GDS的跨集群互联互通](https://support.huaweicloud.com/migration-dws/dws_15_0041.html)。
 
本实践预计时长90分钟，实践用到的云服务资源主要是**数据仓库服务DWS** 、**弹性云服务 ECS** 、**虚拟私有云服务 VPC**，基本流程如下：
1. [准备工作]
2. [步骤一：创建两套DWS集群]
3. [步骤二：准备源端数据]
4. [步骤三：安装并启动GDS服务器]
5. [步骤四：实现跨DWS集群的数据互联互通]
#### 视频介绍
<video controls="controls" preload="none" id="object587210918212" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/support/dws-video/1725610451938288876.mp4" title="基于GDS实现互联互通" poster="https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002402640697.png" height="308.0000" width="600.0000"></video>
 #### 支持区域
当前已上传OBS数据的区域如[表1]所示。
 表1区域和OBS桶名 
| 区域        | 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下，确保网络互通。
 #### 准备工作
- 已注册华为云账号，具体请参见[注册华为云账号](https://support.huaweicloud.com/usermanual-account/account_id_001.html)，且在使用DWS 前检查账号状态，账号不能处于欠费或冻结状态。
- 获取此账号的"AK/SK"。
- 已创建虚拟私有云和子网，参见[创建虚拟私有云和子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)。
 #### 步骤一：创建两套DWS集群
参见[创建集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)创建两套DWS集群，建议创建在华北-北京四区域。两套集群名称分别为dws-demo01和dws-demo02。
 #### 步骤二：准备源端数据
1. 在[DWS控制台](https://console.huaweicloud.com/dws)左侧的"集群列表"，单击源集群dws-demo01所在行操作列的"登录"按钮。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   本实践以8.1.3.x版本为例，8.1.2及以前版本不支持此登录方式，可以使用gsql登录。
   
   
2. 登录成功后，进入SQL编辑器。
3. 复制如下SQL语句到SQL窗口中，单击"执行SQL"，创建测试TPC-H表ORDERS。 
   ```
   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')
    );
   ```
   
   
4. 继续执行以下SQL语句，创建OBS外表。 
   其中AK值、SK值替换成实际账号的AK、SK值。*\<obs_bucket_name\>由[支持区域]* 获取。
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   ```
   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'
    );
   ```
   
   
5. 执行以下SQL，从OBS外表导入数据到源DWS集群。导入时间预计2分钟，请等待。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   如果出现导入错误，则是因为上面的外表AK值、SK值有误导致，请执行DROP FOREIGN TABLE order01;删除外表后，重新创建外表，再重试执行以下语句导入数据。
   ```
   INSERT INTO orders SELECT * FROM orders01;
   ```
   
   
6. 按以上方法，登录目标端集群dws-demo02，执行以下SQL，创建目标表orders。 
   ```
   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服务器
1. 参见弹性云服务的[自定义购买ECS](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)创建弹性云服务器，注意ECS与DWS创建在同一个区域、VPC内，本例ECS镜像选择CentOS 7.6版本。
2. 下载GDS工具包。 
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws) 。
   
   2. 在左侧导航栏中，单击"管理 \> 连接客户端"。
   
   3. 在"命令行客户端"的下拉列表中，选择对应版本的GDS客户端。 请根据集群版本和安装客户端的操作系统，选择对应版本。
      ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
      客户端CPU架构要和集群一致，如果集群是X86规格，则应该选择X86客户端。
      
   
   4. 单击"下载"。
   
   
   
   
3. 使用SFTP工具将下载的客户端（本实验以**dws_client_8.2.x_redhat_x64.zip**为例）上传至ECS的/opt目录下。
4. 使用root用户登录ECS执行以下命令，进入/opt目录，解压客户端。 
   ```
   cd /opt
   unzip dws_client_8.2.x_redhat_x64.zip
   ```
   
   
5. 创建GDS专有用户及所属用户组，此用户用于启动GDS及读取源数据。 
   ```
   groupadd gdsgrp
   useradd -g gdsgrp gds_user
   ```
   
   
6. 分别修改工具包和数据源文件目录属主为GDS专有用户。 
   ```
   chown -R gds_user:gdsgrp /opt/gds/bin
   chown -R gds_user:gdsgrp /opt
   ```
   
   
7. 切换到gds用户。 
   ```
   su - gds_user
   ```
   
   
8. 执行以下命令进入gds目录，并执行环境变量。 
   ```
   cd /opt/gds/bin
   source gds_env
   ```
   
   
9. 执行以下命令启动gds，其中ECS内网IP通过[ECS控制台](https://console.huaweicloud.com/ecm/#/ecs/manager/vmList)查看如下。
   
   ```
   /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
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001744541653.png "点击放大")
   
   
   
10. 放通ECS到DWS之间的网络端口。 
    由于GDS服务器（即本实验ECS）与DWS需要建立通讯，ECS默认的安全组入方向并没有放通GDS端口5000和DWS端口8000，需执行以下步骤：
    1. 回到弹性云服务器ECS的控制台，单击云服务器名称进入详情。
    
    2. 切换到"安全组"页签，单击"配置规则"。
    
    3. 选择"入方向规则"，单击"添加规则"，优先级输入1，协议端口输入5000，单击"确认"。 ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001744505041.png "点击放大")
       
       
    
    4. 按以上方式，另外添加一行8000的入方向规则。
    
    
    
    
 
 #### 步骤四：实现跨DWS集群的数据互联互通
1. 创建server。 
   1. 获取源端DWS集群的内网IP：切换到DWS控制台，左侧选择"集群 \> 集群列表"，单击源端集群名称dws-demo01。
   
   2. 进入集群详情页面，记录DWS的内网IP。 ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001744549421.png "点击放大")
      
      
   
   3. 切回到DWS控制台，单击目标端dws-demo02所在行操作列的"登录"按钮，进入到SQL窗口， 执行以下命令创建server。
      其中，*源端DWS集群内网IP* 由以上步骤获取，*ECS服务器内网IP* 从ECS控制台获取，*用户dbadmin的登录密码*在创建DWS集群时设定。
      ```
      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'
       )
       ;
      ```
      
   
   
   
   
2. 创建互联互通外表。 
   继续在目标端集群dws-demo02的SQL窗口执行以下命令创建互联互通外表。
   ```
   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'
    );
   ```
   
   
3. 执行全表数据导入。 
   在SQL窗口中继续执行以下SQL语句，从ft_orders外表中导入全量数据。等待约1分钟导入。
   ```
   INSERT INTO orders SELECT * FROM ft_orders;
   ```
   执行以下SQL查询，确认导入1500万行数据成功。
   ```
   SELECT count(*) FROM orders;
   ```
   
   
4. 按过滤条件执行数据导入。 
   ```
   INSERT INTO orders SELECT * FROM ft_orders WHERE o_orderkey < '10000000';
   ```
   
   
 
