从 Amazon Redshift 迁移架构和数据

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

您可以使用 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 的迁移工作流。

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Data Transfer Service APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Data Transfer Service APIs.

    Enable the APIs

设置所需权限

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

  1. 确保创建转移作业的主账号在包含转移作业的项目中具有以下权限:

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

    roles/bigquery.admin 预定义的 Identity and Access Management (IAM) 角色包括 bigquery.transfers.updatebigquery.datasets.updatebigquery.datasets.get 权限。如需详细了解 BigQuery Data Transfer Service 中的 IAM 角色,请参阅访问权限控制

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

创建数据集

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

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

按照为 SQL 客户端配置入站规则中的说明,将以下 IP 地址列入许可名单。您可以将与您的数据集位置对应的 IP 地址列入许可名单,也可以将下表中的所有 IP 地址列入许可名单。以下是为 Amazon Redshift 数据迁移预留的 Google 拥有的 IP 地址。

单区域位置

区域说明 区域名称 IP 地址
美洲
俄亥俄州,哥伦布 us-east5 34.162.72.184
34.162.173.185
34.162.205.205
34.162.81.45
34.162.182.149
34.162.59.92
34.162.157.190
34.162.191.145
达拉斯 us-south1 34.174.172.89
34.174.40.67
34.174.5.11
34.174.96.109
34.174.148.99
34.174.176.19
34.174.253.135
34.174.129.163
艾奥瓦 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
圣地亚哥 southamerica-west1 34.176.188.48
34.176.38.192
34.176.205.134
34.176.102.161
34.176.197.198
34.176.223.236
34.176.47.188
34.176.14.80
南卡罗来纳 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-west10 34.32.28.80
34.32.31.206
34.32.19.49
34.32.33.71
34.32.15.174
34.32.23.7
34.32.1.208
34.32.8.3
芬兰 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-southwest1 34.175.99.115
34.175.186.237
34.175.39.130
34.175.135.49
34.175.1.49
34.175.95.94
34.175.102.118
34.175.166.114
米兰 europe-west8 34.154.183.149
34.154.40.104
34.154.59.51
34.154.86.2
34.154.182.20
34.154.127.144
34.154.201.251
34.154.0.104
荷兰 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-west9 34.163.76.229
34.163.153.68
34.155.181.30
34.155.85.234
34.155.230.192
34.155.175.220
34.163.68.177
34.163.157.151
都灵 europe-west12 34.17.15.186
34.17.44.123
34.17.41.160
34.17.47.82
34.17.43.109
34.17.38.236
34.17.34.223
34.17.16.47
华沙 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
中东
Dammam me-central2 34.166.20.177
34.166.10.104
34.166.21.128
34.166.19.184
34.166.20.83
34.166.18.138
34.166.18.48
34.166.23.171
多哈 me-central1 34.18.48.121
34.18.25.208
34.18.38.183
34.18.33.25
34.18.21.203
34.18.21.80
34.18.36.126
34.18.23.252
特拉维夫 me-west1 34.165.184.115
34.165.110.74
34.165.174.16
34.165.28.235
34.165.170.172
34.165.187.98
34.165.85.64
34.165.245.97
非洲
约翰内斯堡 africa-south1 34.35.11.24
34.35.10.66
34.35.8.32
34.35.3.248
34.35.2.113
34.35.5.61
34.35.7.53
34.35.3.17

多区域位置

多区域说明 多区域名称 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 用户,并授予该用户对 Amazon Redshift 的只读访问权限以及对 Amazon S3 的读写访问权限。如需实现此步骤,您可以应用以下政策:

    Amazon Redshift 迁移 Amazon 权限

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

通过单独的迁移队列配置工作负载控制

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

收集转移信息

收集使用 BigQuery Data Transfer Service 设置迁移所需的信息:

  • 按照获取 JDBC 网址的说明进行操作。
  • 获取对您的 Amazon Redshift 数据库具有适当权限的用户的用户名和密码。
  • 按照授予对 Amazon S3 存储桶的访问权限中的说明获取 AWS 访问密钥对。
  • 获取您要用于转移作业的 Amazon S3 存储桶的 URI。我们建议您为此存储桶设置Lifecycle政策,以避免产生不必要的费用。建议的到期时间为 24 小时,以便您有足够的时间将所有数据转移到 BigQuery。

评估您的数据

在数据转移过程中,BigQuery Data Transfer Service 会将 Amazon Redshift 中的数据以 CSV 文件的形式写入 Cloud Storage。如果这些文件包含 ASCII 0 字符,则无法加载到 BigQuery 中。我们建议您评估自己的数据,以确定是否存在此问题。如果存在此问题,您可以通过将数据以 Parquet 文件的形式导出到 Amazon S3 来解决此问题,然后使用 BigQuery Data Transfer Service 导入这些文件。如需了解详情,请参阅 Amazon S3 转移作业概览

设置 Amazon Redshift 转移作业

从下列选项中选择一项:

控制台

  1. 在 Google Cloud 控制台中,进入 BigQuery 页面。

    进入 BigQuery

  2. 点击数据传输

  3. 点击创建转移作业

  4. 来源类型部分中,从来源列表中选择迁移:Amazon Redshift

  5. 转移配置名称部分的显示名字段中,输入转移作业的名称,例如 My migration。显示名可以是任何容易辨识的值,让您以后在需要修改时能够轻松识别。

  6. 目标设置部分中,从数据集列表中选择您创建的数据集

  7. 数据源详细信息部分中,执行以下操作:

    1. Amazon Redshift 的 JDBC 连接网址 字段中,提供用来访问您 Amazon Redshift 集群的 JDBC 网址
    2. 您的数据库用户名字段中,输入要迁移的 Amazon Redshift 数据库的用户名。
    3. 您的数据库密码字段,输入数据库密码。

    4. 访问密钥 ID私有访问密钥字段中,输入您从授予对 S3 存储桶的访问权限步骤获取的访问密钥对。

    5. Amazon S3 URI 字段中,输入您将用作暂存区域的 S3 存储桶的 URI

    6. Amazon Redshift 架构字段中,输入您要迁移的 Amazon Redshift 架构。

    7. 表名模式字段中,指定与架构中的表名匹配的名称或模式。您可以使用正则表达式指定采用以下格式的模式:<table1Regex>;<table2Regex>。此模式应遵循 Java 正则表达式语法。 例如:

      • lineitem;ordertb 匹配名为 lineitemordertb 的表。
      • .* 匹配所有表。

      如果将此字段留空,则会迁移来自指定架构的所有表。

    8. 对于 VPC 和预留的 IP 范围,将此字段留空。

  8. 服务账号菜单中,从与您的 Google Cloud 项目关联的服务账号中选择一个服务账号。您可以将服务账号与转移作业相关联,而不是使用用户凭据。如需详细了解如何将服务账号用于数据转移,请参阅使用服务账号

    • 如果您使用联合身份登录,则需要有服务账号才能创建转移作业。如果您使用 Google 账号登录,则转移作业的服务账号是可选的。
    • 服务账号必须具有所需的权限
  9. 可选:在通知选项部分中,执行以下操作:

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

  11. Google Cloud 控制台会显示所有转移作业设置详细信息,包括此转移作业的资源名称

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 \
    --service_account_name=service_account \
    --params='parameters'

其中:

  • project_id 是您的 Google Cloud 项目 ID。如果未指定 --project_id,则系统会使用默认项目。
  • data_source 是数据源,即 redshift
  • dataset 是转移作业配置的 BigQuery 目标数据集。
  • name 是转移作业配置的显示名。转移作业名称可以是任何可让您在需要修改转移作业时识别该转移作业的名称。
  • service_account:用于对传输作业进行身份验证的服务账号名称。该服务账号应属于用于创建转移作业的同一 project_id,并且应具有所有所需的权限
  • 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

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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 以上的表,请先联系 Cloud Customer Care

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

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

后续步骤