文档首页/ 数据仓库服务 GaussDB(DWS)/ 最佳实践/ 数据迁移/ 使用GDS互联互通功能实现GaussDB(DWS)集群间数据迁移
更新时间:2024-11-05 GMT+08:00

使用GDS互联互通功能实现GaussDB(DWS)集群间数据迁移

本实践演示基于GDS导入导出的高并发能力,实现两套DWS集群之间1500万行数据的分钟级迁移。

  • 该功能仅8.1.2及以上集群版本支持。
  • GDS为GaussDB(DWS)自研的高并发导入导出工具,了解更多请参考GDS使用说明
  • 本章节仅演示操作实践,GDS互联互通介绍及语法说明的详细内容,请参见基于GDS的跨集群互联互通

本实践预计时长90分钟,实践用到的云服务资源主要是数据仓库服务GaussDB(DWS)弹性云服务 ECS虚拟私有云服务 VPC,基本流程如下:

  1. 准备工作
  2. 步骤一:创建两套DWS集群
  3. 步骤二:准备源端数据
  4. 步骤三:安装并启动GDS服务器
  5. 步骤四:实现跨DWS集群的数据互联互通

支持区域

当前已上传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下,确保网络互通。

准备工作

步骤一:创建两套DWS集群

参见创建集群创建两套DWS集群,建议创建在中国-香港区域。两套集群名称分别为dws-demo01和dws-demo02。

步骤二:准备源端数据

  1. 在GaussDB(DWS)控制台的“集群管理”,单击源集群dws-demo01所在行操作列的“登录”按钮。

    本实践以8.1.3.x版本为例,8.1.2及以前版本不支持此登录方式,可以使用Data Studio连接集群

  2. 登录成功后,进入SQL编辑器。
  3. 复制如下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')
     );
    

  4. 继续执行以下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'
     );
    

  5. 执行以下SQL,从OBS外表导入数据到源DWS集群。导入时间预计2分钟,请等待。

    如果出现导入错误,则是因为上面的外表AK值、SK值有误导致,请执行DROP FOREIGN TABLE order01;删除外表后,重新创建外表,再重试执行以下语句导入数据。

    1
    INSERT INTO orders SELECT * FROM orders01;
    

  6. 按以上方法,登录目标端集群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服务器

  1. 参见弹性云服务的购买弹性云服务器创建弹性云服务器,注意ECS与DWS创建在同一个区域、VPC内,本例ECS镜像选择CentOS 7.6版本。
  2. 下载GDS工具包。

    1. 登录GaussDB(DWS)管理控制台。
    2. 在左侧导航栏中,单击“管理 > 连接客户端”
    3. 命令行客户端”的下拉列表中,选择对应版本的GDS客户端。

      请根据集群版本和安装客户端的操作系统,选择对应版本。

    4. 单击“下载”

  3. 使用SFTP工具将下载的客户端(本实验以dws_client_8.2.x_redhat_x64.zip为例)上传至ECS的/opt目录下。
  4. 使用root用户登录ECS执行以下命令,进入/opt目录,解压客户端。

    1
    2
    cd /opt
    unzip dws_client_8.2.x_redhat_x64.zip
    

  5. 创建GDS专有用户及所属用户组,此用户用于启动GDS及读取源数据。

    1
    2
    groupadd gdsgrp
    useradd -g gdsgrp gds_user
    

  6. 分别修改工具包和数据源文件目录属主为GDS专有用户。

    1
    2
    chown -R gds_user:gdsgrp /opt/gds/bin
    chown -R gds_user:gdsgrp /opt
    

  7. 切换到gds用户。

    1
    su - gds_user
    

  8. 执行以下命令进入gds目录,并执行环境变量。

    1
    2
    cd /opt/gds/bin
    source gds_env
    

  9. 执行以下命令启动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
    

  10. 放通ECS到DWS之间的网络端口。

    由于GDS服务器(即本实验ECS)与DWS需要建立通讯,ECS默认的安全组入方向并没有放通GDS端口5000和DWS端口8000,需执行以下步骤:

    1. 回到弹性云服务器ECS的控制台,单击云服务器名称进入详情。
    2. 切换到“安全组”页签,单击“配置规则”。
    3. 选择“入方向规则”,单击“添加规则”,优先级输入1,协议端口输入5000,单击“确认”。

    4. 按以上方式,另外添加一行8000的入方向规则。

步骤四:实现跨DWS集群的数据互联互通

  1. 创建server。

    1. 获取源端DWS集群的内网IP:切换到DWS控制台,左侧选择“专属集群 > 集群列表”,单击源端集群名称dws-demo01。
    2. 进入集群详情名称,记录DWS的内网IP。

    3. 切回到DWS控制台,单击目标端dws-demo02所在行操作列的“登录”按钮,进入到SQL窗口,

      执行以下命令创建server。

      其中,源端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'
       )
       ;
      

  2. 创建互联互通外表。

    继续在目标端集群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'
     );
    

  3. 执行全表数据导入。

    在SQL窗口中继续执行以下SQL语句,从ft_orders外表中导入全量数据。等待约1分钟导入。

    1
    INSERT INTO orders SELECT * FROM ft_orders;
    

    执行以下SQL查询,确认导入1500万行数据成功。

    1
    SELECT count(*) FROM orders;
    

  4. 按过滤条件执行数据导入。

    1
    INSERT INTO orders SELECT * FROM ft_orders WHERE o_orderkey < '10000000';