从 Amazon Redshift 迁移数据

概览

本文档介绍了通过公共 IP 地址将数据从 Amazon Redshift 迁移到 BigQuery 的过程。

如果您想要通过虚拟私有云 (VPC) 在专用 IP 地址上转移 Redshift 实例中的数据,请参阅通过 VPC 迁移 Amazon Redshift 数据

使用 BigQuery Data Transfer Service 将数据从 Amazon Redshift 数据仓库复制到 BigQuery。此服务与 GKE 中的迁移代理合作,并触发从 Amazon Redshift 到 Amazon S3 存储分区中的暂存区域的卸载操作。然后,BigQuery Data Transfer Service 会将 Amazon S3 存储分区中的数据迁移到 BigQuery。

下图展示了迁移期间 Amazon Redshift 数据仓库与 BigQuery 之间的整体数据流动情况。

准备工作

本部分介绍如何设置从 Amazon Redshift 到 BigQuery 的数据迁移。具体步骤包括:

  • Google Cloud 要求:满足 Google Cloud 的前提条件并在其上设置权限。
  • 授予对 Amazon Redshift 集群的访问权限。
  • 授予对您用于临时暂存数据的 Amazon S3 存储分区的访问权限。 请记下访问密钥对,以便在后续步骤中使用。
  • 设置借助 BigQuery Data Transfer Service 进行的迁移。您需要有:
    • Amazon Redshift JDBC 网址。请按照获取 JDBC 网址的说明进行操作。
    • Amazon Redshift 数据库的用户名和密码。
    • AWS 访问密钥对,将通过授予对 S3 存储分区的访问权限步骤获取。
    • Amazon S3 存储分区的 URI。我们建议您为此存储分区设置生命周期政策,以避免产生不必要的费用。建议的到期时间为 24 小时,以便您有足够的时间将所有数据转移到 BigQuery。

所需权限

创建 Amazon Redshift 转移作业的准备工作:

  1. 确保创建转移作业的人员在 BigQuery 中拥有以下所需权限:

    • 创建转移作业所需的 bigquery.transfers.update 权限
    • 针对目标数据集的 bigquery.datasets.getbigquery.datasets.update 权限

    预定义的 IAM 角色 bigquery.admin 包含 bigquery.transfers.updatebigquery.datasets.updatebigquery.datasets.get 权限。如需详细了解 BigQuery Data Transfer Service 中的 IAM 角色,请参阅访问权限控制参考文档

  2. 请参阅 Amazon S3 的相关文档,以确保您已配置启用转移作业所需的所有权限。Amazon S3 源数据必须至少包含对其应用的 AWS 代管政策 AmazonS3ReadOnlyAccess

Google Cloud 要求

为了确保成功实现 Amazon Redshift 数据仓库迁移,必须满足下列 Google Cloud 的前提条件:

  1. 选择或创建 Google Cloud 项目以存储迁移数据。

    • 在 Google Cloud Console 中,转到项目选择器页面。

      转到“项目选择器”

    • 选择或创建 Google Cloud 项目。

  2. 启用 BigQuery Data Transfer Service API。

    在 Google Cloud Console 中,点击 BigQuery Data Transfer Service API 页面上的启用按钮。

    启用 API

    新项目中会自动启用 BigQuery。对于现有项目,您可能需要启用 BigQuery API。绿色对勾标记表示您已启用了 API。

    已启用 API

  3. 创建 BigQuery 数据集来存储数据。您不需要创建任何表。

授予对 Amazon Redshift 集群的访问权限

遵循 Amazon 提供的说明将以下 IP 地址列入许可名单。您可以将与您的数据集位置对应的 IP 地址列入许可名单,也可以将下表中的所有 IP 地址列入许可名单。以下是为 Amazon Redshift 数据迁移预留的 Google 拥有的 IP 地址。

区域位置

区域说明 区域名称 IP 地址
美洲
爱荷华 us-central1 34.121.70.114
34.71.81.17
34.122.223.84
34.121.145.212
35.232.1.105
35.202.145.227
35.226.82.216
35.225.241.102
拉斯维加斯 us-west4 34.125.53.201
34.125.69.174
34.125.159.85
34.125.152.1
34.125.195.166
34.125.50.249
34.125.68.55
34.125.91.116
洛杉矶 us-west2 35.236.59.167
34.94.132.139
34.94.207.21
34.94.81.187
34.94.88.122
35.235.101.187
34.94.238.66
34.94.195.77
蒙特利尔 northamerica-northeast1 34.95.20.253
35.203.31.219
34.95.22.233
34.95.27.99
35.203.12.23
35.203.39.46
35.203.116.49
35.203.104.223
北弗吉尼亚 us-east4 35.245.95.250
35.245.126.228
35.236.225.172
35.245.86.140
35.199.31.35
35.199.19.115
35.230.167.48
35.245.128.132
35.245.111.126
35.236.209.21
俄勒冈 us-west1 35.197.117.207
35.199.178.12
35.197.86.233
34.82.155.140
35.247.28.48
35.247.31.246
35.247.106.13
34.105.85.54
盐湖城 us-west3 34.106.37.58
34.106.85.113
34.106.28.153
34.106.64.121
34.106.246.131
34.106.56.150
34.106.41.31
34.106.182.92
圣保罗 southamerica-east1 35.199.88.228
34.95.169.140
35.198.53.30
34.95.144.215
35.247.250.120
35.247.255.158
34.95.231.121
35.198.8.157
南卡罗来纳 us-east1 35.196.207.183
35.237.231.98
104.196.102.222
35.231.13.201
34.75.129.215
34.75.127.9
35.229.36.137
35.237.91.139
多伦多 northamerica-northeast2 34.124.116.108
34.124.116.107
34.124.116.102
34.124.116.80
34.124.116.72
34.124.116.85
34.124.116.20
34.124.116.68
欧洲
比利时 europe-west1 35.240.36.149
35.205.171.56
34.76.234.4
35.205.38.234
34.77.237.73
35.195.107.238
35.195.52.87
34.76.102.189
芬兰 europe-north1 35.228.35.94
35.228.183.156
35.228.211.18
35.228.146.84
35.228.103.114
35.228.53.184
35.228.203.85
35.228.183.138
法兰克福 europe-west3 35.246.153.144
35.198.80.78
35.246.181.106
35.246.211.135
34.89.165.108
35.198.68.187
35.242.223.6
34.89.137.180
伦敦 europe-west2 35.189.119.113
35.189.101.107
35.189.69.131
35.197.205.93
35.189.121.178
35.189.121.41
35.189.85.30
35.197.195.192
荷兰 europe-west4 35.204.237.173
35.204.18.163
34.91.86.224
34.90.184.136
34.91.115.67
34.90.218.6
34.91.147.143
34.91.253.1
华沙 europe-central2 34.118.72.8
34.118.45.245
34.118.69.169
34.116.244.189
34.116.170.150
34.118.97.148
34.116.148.164
34.116.168.127
苏黎世 europe-west6 34.65.205.160
34.65.121.140
34.65.196.143
34.65.9.133
34.65.156.193
34.65.216.124
34.65.233.83
34.65.168.250
亚太地区
德里 asia-south2 34.126.212.96
34.126.212.85
34.126.208.224
34.126.212.94
34.126.208.226
34.126.212.232
34.126.212.93
34.126.212.206
香港 asia-east2 34.92.245.180
35.241.116.105
35.220.240.216
35.220.188.244
34.92.196.78
34.92.165.209
35.220.193.228
34.96.153.178
雅加达 asia-southeast2 34.101.79.105
34.101.129.32
34.101.244.197
34.101.100.180
34.101.109.205
34.101.185.189
34.101.179.27
34.101.197.251
墨尔本 australia-southeast2 34.126.196.95
34.126.196.106
34.126.196.126
34.126.196.96
34.126.196.112
34.126.196.99
34.126.196.76
34.126.196.68
孟买 asia-south1 34.93.67.112
35.244.0.1
35.200.245.13
35.200.203.161
34.93.209.130
34.93.120.224
35.244.10.12
35.200.186.100
大阪 asia-northeast2 34.97.94.51
34.97.118.176
34.97.63.76
34.97.159.156
34.97.113.218
34.97.4.108
34.97.119.140
34.97.30.191
首尔 asia-northeast3 34.64.152.215
34.64.140.241
34.64.133.199
34.64.174.192
34.64.145.219
34.64.136.56
34.64.247.158
34.64.135.220
新加坡 asia-southeast1 34.87.12.235
34.87.63.5
34.87.91.51
35.198.197.191
35.240.253.175
35.247.165.193
35.247.181.82
35.247.189.103
悉尼 australia-southeast1 35.189.33.150
35.189.38.5
35.189.29.88
35.189.22.179
35.189.20.163
35.189.29.83
35.189.31.141
35.189.14.219
台湾 asia-east1 35.221.201.20
35.194.177.253
34.80.17.79
34.80.178.20
34.80.174.198
35.201.132.11
35.201.223.177
35.229.251.28
35.185.155.147
35.194.232.172
东京 asia-northeast1 34.85.11.246
34.85.30.58
34.85.8.125
34.85.38.59
34.85.31.67
34.85.36.143
34.85.32.222
34.85.18.128
34.85.23.202
34.85.35.192

多区域位置

多区域说明 多区域名称 IP 地址
欧盟成员国的数据中心1 EU 34.76.156.158
34.76.156.172
34.76.136.146
34.76.1.29
34.76.156.232
34.76.156.81
34.76.156.246
34.76.102.206
34.76.129.246
34.76.121.168
美国的数据中心 US 35.185.196.212
35.197.102.120
35.185.224.10
35.185.228.170
35.197.5.235
35.185.206.139
35.197.67.234
35.197.38.65
35.185.202.229
35.185.200.120

1 位于 EU 多区域的数据不会存储在 europe-west2(伦敦)或 europe-west6(苏黎世)数据中心中。

授予对 Amazon S3 存储分区的访问权限

您必须拥有 S3 存储分区才能用作将 Amazon Redshift 数据转移到 BigQuery 的暂存区。如需了解详情,请参阅 Amazon 文档

  1. 建议您创建一个专用的 Amazon IAM 用户,并授予该用户对 Redshift 的只读访问权限以及对 S3 的读写访问权限。可通过应用以下现有政策来实现此目的:

    Redshift 迁移 Amazon 权限

  2. 创建 Amazon IAM 用户访问密钥对

可选:通过单独的迁移队列实现工作负载控制

您可以定义一个专供迁移使用的 Amazon Redshift 队列,借此限制并分隔用于迁移的资源。可为此迁移队列配置最大并发查询计数。然后,您可以将特定迁移用户组与此队列关联,并在设置迁移时使用这些凭据将数据转移到 BigQuery。转移服务仅拥有迁移队列的访问权限。

设置 Amazon Redshift 转移作业

如需设置 Amazon Redshift 转移作业,请执行以下操作:

控制台

  1. 转到 Cloud Console 中的 BigQuery 页面。

    转到 BigQuery 页面

  2. 点击转移作业

  3. 点击 Add Transfer

  4. 新转移作业页面上,执行以下操作:

    • 来源字段中,选择迁移:Amazon Redshift
    • Display name 部分,输入转移作业的名称,例如 My migration。显示名可以是任何容易辨识的值,让您以后在需要修改时能够轻松识别。
    • 目标数据集部分,选择相应的数据集。

      新的 Amazon Redshift 迁移一般信息

  5. 数据源详细信息下,继续设置 Amazon Redshift 转移作业的特定详细信息。

    • Amazon Redshift 的 JDBC 连接网址 (JDBC connection url for Amazon Redshift) 字段,提供用来访问您 Amazon Redshift 集群的 JDBC 网址
    • 您的数据库用户名字段,输入您希望迁移的 Amazon Redshift 数据库的用户名。
    • 您的数据库密码字段,输入数据库密码。
    • 访问密钥 ID私有访问密钥字段中,输入您从授予对 S3 存储分区的访问权限步骤获取的访问密钥对。
    • Amazon S3 URI 字段,输入您将用作暂存区域的 S3 存储分区的 URI
    • Amazon Redshift 架构字段,输入您要迁移的 Amazon Redshift 架构。
    • 表名模式字段,指定与架构中的表名匹配的名称或模式。您可以使用正则表达式指定采用以下格式的模式:<table1Regex>;<table2Regex>。此模式应遵循 Java 正则表达式语法。

      新的 Amazon Redshift 迁移数据源详细信息

    • (可选)在通知选项部分,执行以下操作:

      • 点击切换开关以启用电子邮件通知。启用此选项后,转移作业管理员会在转移作业运行失败时收到电子邮件通知。
      • 选择 Pub/Sub 主题部分,选择您的主题名称,或点击创建主题。此选项用于为您的转移作业配置 Pub/Sub 运行通知

        Pub/Sub 主题

  6. 点击保存

  7. Cloud Console 随即显示所有转移作业设置的详细信息,包括此转移作业的资源名称

    转移作业确认

bq

输入 bq mk 命令并提供转移作业创建标志 --transfer_config。此外,还必须提供以下标志:

  • --project_id
  • --data_source
  • --target_dataset
  • --display_name
  • --params
bq mk \
--transfer_config \
--project_id=project_id \
--data_source=data_source \
--target_dataset=dataset \
--display_name=name \
--params='parameters'

其中:

  • project_id 是您的 Google Cloud 项目 ID。如果未指定 --project_id,则系统会使用默认项目。
  • data_source 是数据源,即 redshift
  • dataset 是转移作业配置的 BigQuery 目标数据集。
  • name 是转移作业配置的显示名。转移作业名称可以是任何容易辨识的值,让您以后在需要修改时能够轻松识别。
  • parameters 包含所创建转移作业配置的参数(采用 JSON 格式),例如:--params='{"param":"param_value"}'

Amazon Redshift 转移作业配置需要的参数包括:

  • jdbc_url:用于定位 Amazon Redshift 集群的 JDBC 连接网址。
  • database_username:用于访问数据库以卸载指定表的用户名。
  • database_password:与用户名配合使用的密码,用于访问数据库以卸载指定表。
  • access_key_id:访问密钥 ID,用于签署发往 AWS 的请求。
  • secret_access_key:与访问密钥 ID 配合使用的私有访问密钥,用于签署发往 AWS 的请求。
  • s3_bucket:以“s3://”开头的 Amazon S3 URI,用于指定要使用的临时文件的前缀。
  • redshift_schema:包含要迁移的所有表的 Amazon Redshift 架构。
  • table_name_patterns:以英文分号 (;) 分隔的表名模式。表模式是要迁移的表的正则表达式。如果未提供,系统将迁移数据库架构下的所有表。

例如,以下命令会创建名为 My Transfer 的 Amazon Redshift 转移作业,且目标数据集名为 mydataset,项目 ID 为 google.com:myproject

bq mk \
--transfer_config \
--project_id=myproject \
--data_source=redshift \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"jdbc_url":"jdbc:postgresql://test-example-instance.sample.us-west-1.redshift.amazonaws.com:5439/dbname","database_username":"my_username","database_password":"1234567890","access_key_id":"A1B2C3D4E5F6G7H8I9J0","secret_access_key":"1234567890123456789012345678901234567890","s3_bucket":"s3://bucket/prefix","redshift_schema":"public","table_name_patterns":"table_name"}'

API

使用 projects.locations.transferConfigs.create 方法并提供一个 TransferConfig 资源实例。

Java

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create redshift transfer config
public class CreateRedshiftTransfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String datasetRegion = "US";
    String jdbcUrl = "MY_JDBC_URL_CONNECTION_REDSHIFT";
    String dbUserName = "MY_USERNAME";
    String dbPassword = "MY_PASSWORD";
    String accessKeyId = "MY_AWS_ACCESS_KEY_ID";
    String secretAccessId = "MY_AWS_SECRET_ACCESS_ID";
    String s3Bucket = "MY_S3_BUCKET_URI";
    String redShiftSchema = "MY_REDSHIFT_SCHEMA";
    String tableNamePatterns = "*";
    String vpcAndReserveIpRange = "MY_VPC_AND_IP_RANGE";
    Map<String, Value> params = new HashMap<>();
    params.put("jdbc_url", Value.newBuilder().setStringValue(jdbcUrl).build());
    params.put("database_username", Value.newBuilder().setStringValue(dbUserName).build());
    params.put("database_password", Value.newBuilder().setStringValue(dbPassword).build());
    params.put("access_key_id", Value.newBuilder().setStringValue(accessKeyId).build());
    params.put("secret_access_key", Value.newBuilder().setStringValue(secretAccessId).build());
    params.put("s3_bucket", Value.newBuilder().setStringValue(s3Bucket).build());
    params.put("redshift_schema", Value.newBuilder().setStringValue(redShiftSchema).build());
    params.put("table_name_patterns", Value.newBuilder().setStringValue(tableNamePatterns).build());
    params.put(
        "migration_infra_cidr", Value.newBuilder().setStringValue(vpcAndReserveIpRange).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDatasetRegion(datasetRegion)
            .setDisplayName("Your Redshift Config Name")
            .setDataSourceId("redshift")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .setSchedule("every 24 hours")
            .build();
    createRedshiftTransfer(projectId, transferConfig);
  }

  public static void createRedshiftTransfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Cloud redshift transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Cloud redshift transfer was not created." + ex.toString());
    }
  }
}

配额和限制

对于每项加载作业、每个表,BigQuery 有 15 TB 的加载配额。Amazon Redshift 会在内部执行表数据压缩,因此实际导出的表大小会超过 Amazon Redshift 报告的表大小。如果您打算迁移大小超过 15 TB 的表,请先联系 Google Cloud 支持团队

请注意,使用此服务可能会产生 Google 之外的费用。如需了解详情,请查看 Amazon RedshiftAmazon S3 的价格页面。

由于 Amazon S3 的一致性模型要求,向 BigQuery 转移的作业中可能不包括某些文件。

后续步骤