亚马逊AWS官方博客

使用 AWS DMS 将 Google Cloud for MySQL 迁移到 Amazon Aurora MySQL

Original URL: https://aws.amazon.com/blogs/database/migrate-google-cloud-for-mysql-to-amazon-aurora-mysql/

AWS 最近已为 MySQL 8.0 和更高版本将 Google Cloud for MySQL 作为源添加到 AWS Data Migration Service (AWS DMS)。在本博文中,我们将说明如何使用 AWS DMS 自动从 Google Cloud for MySQL 迁移到 Amazon Aurora MySQL 兼容版本并最大限度地减少停机时间。在撰写本文时,在支持具有 Google SQL 的 Allow only SSL connections(仅允许 SSL 连接)设置的数据库方面存在限制,因为它需要服务器端和客户端证书验证。AWS DMS 仅支持服务器端证书验证。在本博文中,我们演示了迁移具有和不具有 SSL 的数据库的方法。对于此类同构迁移,我们 建议使用本机工具。在本博文中,我们假设本机工具无法满足您的使用案例的需求,并且您只想迁移某些架构。

解决方案概览

对于不具有 SSL 的 Google Cloud for MySQL 数据库,我们使用 AWS Schema Conversion Tool(AWS SCT)将源架构转换为目标 Aurora MySQL 数据库。我们使用 AWS DMS 在 Google Cloud for MySQL 和 Aurora MySQL 之间迁移数据,并为增量更改启用更改数据捕获(CDC,Change Data Capture)。

对于具有 SSL 的 Google Cloud for MySQL 数据库,我们在独立的 Amazon Elastic Compute Cloud(Amazon EC2)实例上安装非 SSL MySQL 代理。AWS DMS 连接到此代理 MySQL 实例,以便与源 Google Cloud for MySQL 数据库进行通信。这使我们能够将数据从支持 SSL 的 Google Cloud for MySQL 数据库迁移到 Aurora MySQL。您必须通过 Internet 从您的 AWS 环境访问 Google Cloud for MySQL 数据库,但该流量在传输过程中会使用 SSL 进行加密。

下图显示了总体解决方案的架构。

总体解决方案架构

对于此迁移,我们使用了简单的客户-产品-订单表结构和以下数据集。下图显示了该示例数据集的实体关系。图中包含“客户”、“产品”和“订单”这三个表。“订单”具有两个外键,一个来自“客户”表,另一个来自“产品”表。

实体关系图

先决条件

在此演练中,您应满足以下先决条件:

  • 一个现有的 Google Cloud for MySQL 数据库与公共连接
  • 一个 AWS 账户
  • 一个充当目标的 Aurora MySQL 数据库

在使用所述服务时,您的账户中会产生与此解决方案相关的费用。

第 1 部分:迁移不具有 SSL 的 Google Cloud for MySQL 数据库

对于同构迁移,特别是那些不需要捕获正在进行的更改的迁移,我们建议使用 MySQL 本机工具,例如 mysqldumpMySQL Workbench 数据导出和导入向导。如果源是另一个数据库引擎,例如 Google Cloud for SQL Server,则需要使用 AWS SCT 转换架构。但是,即使对于这种同构迁移(Google Cloud for MySQL 到 Aurora MySQL 的迁移),我们也会在开始迁移之前使用 AWS SCT 将架构更改应用于目标。下图显示了架构。

解决方案架构(无 SSL)

您可以采用类似方法进行异构迁移(例如,从Google Cloud for MySQL 迁移到 Amazon Aurora PostgreSQL 兼容版)。

安装 AWS SCT

AWS SCT 是一款免费应用程序,您可以将它安装在本地服务器、本地工作站或 EC2 实例上。有关安装说明,请参阅安装、验证和更新 AWS SCT。在本博文中,我们创建了一个 t3.medium EC2 实例并在其中安装此工具。

创建 AWS DMS 复制实例

您需要使用复制实例来迁移数据库。此实例需要足够的存储空间和处理能力才能执行您分配的任务,并将数据从源数据库迁移到目标数据库。要选择适当的实例,请参阅使用 AWS DMS 复制实例

首先,让我们创建一个基本实例。我们按如下方式设置参数:

  1. Name(名称)中,输入唯一标识此实例的友好名称。
  2. 对于 Instance class(实例类),根据您的工作负载选择一个实例。
  3. 对于 Engine version(引擎版本),我们建议选择最新版本。
  4. 对于 Allocated storage(分配的存储空间),根据您的工作负载选择存储空间。
  5. 对于 VPC,选择要在其中放置此实例的 VPC。
  6. 建议为生产工作负载选择 Multi-AZ(多可用区)。
  7. 选择 Publicly accessible(公开访问)设置,因为此实例需要通过 Internet 与 Google Cloud 进行通信。

DMS 实例设置

创建目标 Aurora MySQL 实例

如果您已有一个 Aurora MySQL 实例,则可使用它。如果没有,请创建一个 Aurora MySQL 集群。确保目标拥有 AWS SCTAWS DMS 权限。AWS SCT 需要以下额外权限才能将架构应用于目标:

Grant CREATE, ALTER, DROP, INDEX, REFERENCES, CREATE VIEW, TRIGGER, CREATE ROUTINE, ALTER ROUTINE, EXECUTE on *.* to '<user>'@'IP';

在 Google Cloud 上配置网络更改

要确保 Amazon EC2 上运行的 AWS DMS 实例和 AWS SCT 能够连接到 Google Cloud for MySQL 实例,请确保该实例具有公有 IP。在 Authorized networks(授权网络)下添加 AWS DMS 复制实例和 AWS SCT EC2 实例的公有 IP。下图显示了配置。

GCP 联网更改

配置源 MySQL 更改

我们创建一个数据库用户,并使用最低权限原则以仅分配任务所需的权限:

create user 'dmsuser'@'%' identified by '<password>';

要让 AWS SCT 正确读取架构,您需要添加以下权限

grant select on *.* to 'dmsuser'@'%';
grant show view on *.* to 'dmsuser'@'%';

如果您还想捕获 AWS DMS 任务中正在进行的更改,则需要添加以下权限

grant replication client on *.* to 'dmsuser'@'%';
grant replication slave on *.* to 'dmsuser'@'%';

执行架构转换

现在可以将源架构应用于目标了。

  1. 连接到安装了 AWS SCT 的 EC2 实例。
  2. 打开 AWS SCT 应用程序,然后在 File(文件)菜单上选择 New Project Wizard(新建项目向导)。
  3. 对于 Project name(项目名称),输入相应的名称。
  4. 对于 Location(位置),请在本地计算机上选择适当的位置。
  5. 对于 Kind(类型),选择 SQL Database(SQL 数据库)。
  6. 对于 Source engine(源引擎),选择 MySQL
  7. 对于 Migration(迁移),选择 I want to keep the same engine but optimize for the cloud(我想保留同一引擎,但针对云进行优化)。
  8. 选择 Next(下一步)。
  9. 对于 Connection name(连接名称),输入相应的名称。
  10. 对于 Server name(服务器名称),选择源 Google Cloud for MySQL 公有 IP。
  11. 对于 Server port(服务器端口),如果使用的是默认端口,则使用 3306。
  12. 输入您创建的用户名和密码作为先决条件。
  13. 选择 Next(下一步)。

建立源连接后,它会显示 MySQL 用户有权访问的所有架构。

  1. 选择要迁移的架构,然后选择 Next(下一步)。

数据库迁移评估报告汇总所有架构转换任务,并针对无法转换为目标数据库实例的数据库引擎的架构对象,详细说明了操作项。由于这是同构迁移,因此,迁移评估可能不会提供很多操作项,如以下屏幕截图所示。

  1. 选择 Next(下一步)以继续。SCT 数据库迁移报告

现在您可以配置目标了。

  1. 对于 Name(名称),输入 Aurora MySQL DNS。
  2. 对于 Server port(服务器端口),如果使用的是默认端口,则使用 3306。
  3. 输入具有相应写入权限的用户的用户名和密码。
  4. 选择 Finish(完成)以结束向导。

由于在转换或调整源架构方面没有操作项,因此,您可以直接将架构从源加载到目标,如以下屏幕截图所示。

显示 SCT 应用更改的 Gif

选择(右键单击)目标架构,然后选择 Apply to database(应用于数据库)。

对象的顶部会显示一个保存图标,这表示它们已应用于目标数据库。

现在,源架构已应用于目标,可以创建 AWS DMS 端点和任务了。

创建 AWS DMS 端点

端点提供有关源和目标的连接、数据存储类型和位置信息。您需要创建至少一个源端点和一个目标端点。

源端点

创建源端点时,请提供以下信息:

  1. 对于 Endpoint identifier(端点标识符),输入一个友好名称。
  2. 对于 Source engine(源引擎),选择 Google Cloud for MySQL
  3. 对于 Access to endpoint(对端点的访问),选择 Provide access information manually(手动提供访问信息)。
  4. 对于 Server name(服务器名称),输入 Cloud SQL 的 IP 地址。
  5. 对于 Port(端口),如果使用的是默认端口,则使用 3306。
  6. 输入相应的用户名和密码。
  7. 测试端点,然后完成端点创建。

在 DMS 上创建 GCP 源端点

目标端点

使用目标端点的以下参数重复上一过程:

  1. 对于 Select RDS instance(选择 RDS 实例),选择 Aurora MySQL 实例。
  2. 对于 Access to endpoint(对端点的访问),选择 Provide access information manually(手动提供访问信息)。
  3. 对于 Server name(服务器名称),使用预填充的设置。
  4. 对于 Port(端口),如果使用的是默认端口,则使用 3306。
  5. 输入相应的用户名和密码。
  6. 测试端点,然后完成端点创建。

创建 AWS DMS 迁移任务

AWS DMS 任务是所有工作发生的位置。您可以在该任务中配置要迁移的数据库对象、日志记录要求、错误处理等。创建任务时,请提供以下信息:

  1. 对于 Task identifier(任务标识符),输入一个友好的可识别名称。
  2. 对于 Replication instance(复制实例),选择您创建的实例。
  3. 对于 Source database endpoint(源数据库端点),选择您创建的 Google Cloud for MySQL 端点。
  4. 对于 Target database endpoint(目标数据库端点),选择您创建的 Aurora MySQL 端点。
  5. 对于 Migration type(迁移类型),选择 Migrate existing data and replicate ongoing changes(迁移现有数据并复制正在进行的变更)。
    DMS 任务(无 SSL)#1
  6. 启用 Amazon CloudWatch Logs,以便能够调试问题。
  7. 对于 Table mappings(表映射),选择 Wizard(向导)。
  8. 选择要迁移的架构。
  9. 将所有其他内容保留为默认值,然后选择 Create task(创建任务)。
    DMS 任务(无 SSL)#2

一旦创建任务,任务就会处于 Creating(正在创建)状态。几秒钟后,它会变为 Ready(准备就绪)状态。迁移过程(如果已启用 CDC)将自动启动。

加载完成后,导航到 Table statistics(表统计数据)选项卡,如以下屏幕截图所示。

完全加载已完成(无 SSL)

如果复制正在进行的更改,请尝试在源上插入新记录以查看统计信息中更新的“插入”列,如以下屏幕截图的最后一行所示。

CDC 正在进行中

您可能需要使用 MySQL Workbench 等工具连接到目标。另外,您可能需要执行数据验证。如果源和目标之间的计数达到您的要求,可随意将您的应用程序指向 Aurora MySQL 数据库,然后关闭源 Google Cloud for MySQL 数据库。

第 2 部分:迁移支持 SSL 的 Google Cloud for MySQL 数据库

截至撰写本文时,AWS DMS 不支持 Google Cloud for MySQL 设置 Allow only SSL connections(仅允许 SSL 连接) 一种解决此限制的可能方法是在已知的安全环境中创建 MySQL 代理。该代理接受非 SSL 连接,但使用 SSL 连接到源 Google Cloud for MySQL 数据库。已安装 MySQL 代理的 EC2 实例可为您完成这项工作。

我们使用 ProxySQL,它是一款适用于 MySQL 的开源、高性能、高度可用的数据库协议感知代理。下图显示了架构。

用于迁移非 SSL 数据库的解决方案架构

安装 ProxySQL

以下说明适用于 Amazon Linux AMI。对于其他 Linux 发行版,您可以使用类似的方法。如果您没有可用的实例,请启动一个实例。大小和实例类型取决于各种因素,例如,存在的数据量以及所需的迁移完成速度。

在实例准备就绪时,请确保允许 SSH 流量(此流量来自连接源)。SSH 将进入实例并运行以下命令。这些命令从 yum 存储库获取 ProxySQL 并安装它,并且还会安装 MySQL。您可能需要针对不同的 Linux 发行版略做调整。

sudo yum update
sudo tee /etc/yum.repos.d/proxysql.repo<<EOF
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/latest
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
sudo yum makecache
sudo yum install proxysql
sudo systemctl enable --now proxysql
systemctl status proxysql
sudo yum install mysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxySQLAdmin> '

如果一切顺利,您现在应已登录 ProxySQL。

ProxySQL 已安装成功

我们建议将 ProxySQL 管理员的默认密码从 admin 更改为其他内容:

UPDATE global_variables SET variable_value='admin:<password>' WHERE variable_name='admin-admin_credentials';

LOAD ADMIN VARIABLES TO RUNTIME;

创建 AWS DMS 复制实例

如前所述,您需要使用复制实例来迁移数据库。此实例需要足够的存储空间和处理能力才能执行您分配的任务,并将数据从源数据库迁移到目标数据库。要选择适当的实例,请参阅使用 AWS DMS 复制实例

使用以下参数创建您的实例:

  1. Name(名称)中,输入唯一标识此实例的友好名称。
  2. 对于 Instance class(实例类),根据您的工作负载选择一个实例。
  3. 对于 Engine version(引擎版本),我们建议选择最新版本。
  4. 对于 Allocated storage(分配的存储空间),根据您的工作负载选择存储空间。
  5. 对于 VPC,选择要在其中放置此实例的 VPC。
  6. 建议为生产工作负载选择 Multi-AZ(多可用区)。
  7. 取消选择 Publicly accessible(公开访问)设置

创建目标 Aurora MySQL 实例

如果您已有一个 Aurora MySQL 实例,则可使用它。如果没有,请创建一个 Aurora MySQL 集群。确保目标拥有 AWS DMS 权限。

在 Google Cloud for MySQL 上配置联网、安全性和用户权限

在 Google Cloud Platform(GCP)控制台上,导航到要迁移的 MySQL 集群下的联网部分,然后完成以下步骤:

  1. 添加正在运行 ProxySQL 的 EC2 实例的公有 IP,以便流量可以从该公有 IP 到达。
    SSL 实例的 GCP 联网更改
  2. Security(安全性)选项卡上,选择 Allow only SSL connections(仅允许 SSL 连接)。
  3. 如果您还没有客户端证书,请生成该证书。
  4. 下载服务器证书和客户端证书。
    GCP 生成并下载 SSL 证书
  5. 在源 MySQL 数据库上,创建两个用户:一个是由 AWS DMS 用来迁移数据的 dmsuser,另一个是由 ProxySQL 用来监控连接的监控用户:
    create user 'dmsuser'@'%' identified by <password>;
    grant select on *.* to 'dmsuser'@'%';
    CREATE USER 'monitor'@'%' IDENTIFIED BY <password>;
    GRANT USAGE ON *.* TO 'monitor'@'%';

配置 ProxySQL

以下命令可配置您的 ProxySQL 实例,确保它能够连接到源 Google Cloud for MySQL 数据库。您需要添加服务器信息、用户信息和 SSL 证书,还需要创建一个监控用户,此用户对源进行 ping 操作以确保其处于联机状态。您应在 ProxySQLAdmin 提示符下运行这些命令。如果您在 ProxySQL EC2 实例上将其丢失,请运行以下代码:

mysql -u admin -p<password> -h 127.0.0.1 -P6032 --prompt='ProxySQLAdmin> '
  1. mysql_servers 表中插入源 MySQL 信息:
    INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight, use_ssl) VALUES ('<GCP MySQL IP>',0,3306,1000, 1);
  2. 将服务器加载到运行时并将其保存到磁盘:
    LOAD MYSQL SERVERS TO RUNTIME;
    SAVE MYSQL SERVERS TO DISK;
  3. mysql_users 表中插入 dmsuser
    INSERT INTO mysql_users(username,password) VALUES ('dmsuser',<password>);
  4. 将用户加载到运行时并将其保存到磁盘:
    load mysql users to runtime; 
    save mysql users to disk;
  5. 将您从 GCP 下载的 SSL 证书复制到 /var/lib/proxysql 目录中。上述命令将从本地计算机(MacOS 终端)复制这些文件。如果您未在 MacOS 上,请按照本地计算机的操作系统的推荐说明执行操作。
    scp -i <key.pem> server-ca.pem ec2-user@<EC2IPRunningProxySQL>:~/.
    scp -i <key.pem> client-cert.pem ec2-user@<EC2IPRunningProxySQL>:~/.
    scp -i <key.pem> client-key.pem ec2-user@<EC2IPRunningProxySQL>:~/.
  6. 它们将位于 ProxySQL 的 EC2 实例的主目录中,因此将它们复制到 /var/lib/proxysql
    sudo cp client-cert.pem client-key.pem server-ca.pem /var/lib/proxysql
  7. 运行以下查询,为 SSL 设置各种变量并监控 ProxySQL 中的 Google Cloud for MySQL 数据库:
    mysql -u admin -p<password> -h 127.0.0.1 -P6032 --prompt='ProxySQLAdmin> '
    SET mysql-ssl_p2s_cert="/var/lib/proxysql/client-cert.pem";
    SET mysql-ssl_p2s_key="/var/lib/proxysql/client-key.pem";
    SET mysql-ssl_p2s_ca="/var/lib/proxysql/server-ca.pem";
    SET mysql-ssl_p2s_cipher='ECDHE-RSA-AES256-SHA';
    UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
    UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
    UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
    UPDATE GLOBAL_VARIABLES SET variable_value='8.0' WHERE variable_name='mysql-server_version';
    UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
    UPDATE GLOBAL_VARIABLES SET variable_value='true' WHERE variable_name='admin-web_enabled';
    load mysql variables to runtime;
    save mysql variables to disk;
  8. 在 MySQL 连接日志上运行 SELECT,确保您能够成功连接到源 Google Cloud for MySQL 数据库:
    SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 3;

    以下屏幕截图显示 ProxySQL 正在成功地与源数据库进行交互。

ProxySQL 成功连接到 GCP

创建 AWS DMS 端点

如前所述,端点提供有关源和目标的连接、数据存储类型和位置信息。您需要创建至少一个源端点和一个目标端点。

源端点

由于您已在 Google Cloud for MySQL 数据库上运行一个非 SSL 代理,因此,您可以将其配置为源,如下所示:

  1. 对于 Endpoint identifier(端点标识符),输入一个友好名称。
  2. 对于 Source engine(源引擎),选择 MySQL
  3. 对于 Access to endpoint(对端点的访问),选择 Provide access information manually(手动提供访问信息)。
  4. 对于 Server name(服务器名称),输入运行 ProxySQL 的 EC2 实例的 IP 地址。
  5. 对于 Port(端口),如果使用的是默认端口,则使用 3306。
  6. 输入相应的用户名和密码。
  7. 测试端点,然后完成端点创建。

DMS 上的 ProxySQL 端点配置

目标端点

使用目标端点的以下参数重复此过程:

  1. 对于 Select RDS instance(选择 RDS 实例),选择 Aurora MySQL 实例。
  2. 对于 Access to endpoint(对端点的访问),选择 Provide access information manually(手动提供访问信息)。
  3. 对于 Server name(服务器名称),使用预填充的设置。
  4. 对于 Port(端口),如果使用的是默认端口,则使用 3306。
  5. 输入相应的用户名和密码。
  6. 测试端点,然后完成端点创建。

创建 AWS DMS 任务

如前所述,您可以在 AWS DMS 任务中配置要迁移的数据库对象、日志记录要求、错误处理等。使用以下信息创建任务:

  1. 对于 Task identifier(任务标识符),输入一个友好的可识别名称。
  2. 对于 Replication instance(复制实例),选择您创建的实例。
  3. 对于 Source database endpoint(源数据库端点),选择您创建的 ProxySQL MySQL 端点。
  4. 对于 Target database endpoint(目标数据库端点),选择您创建的 Aurora MySQL 端点。
  5. 对于 Migration type(迁移类型),选择 Migrate existing data(迁移现有数据)。
    SSL 数据库迁移的 DMS 任务
  6. 启用 CloudWatch Logs,以便能够调试问题。
  7. 对于 Table mappings(表映射),选择 Wizard(向导)。
  8. 选择要迁移的架构。
    DMS 任务(无 SSL)#2
  9. 将所有其他内容保留为默认值,然后选择 Create task(创建任务)。

一旦创建任务,任务就会处于 Creating(正在创建)状态。几秒钟后,它会变为 Ready(准备就绪)状态。迁移将自动启动。

加载完成后,导航到 Table statistics(表统计数据)选项卡,如以下屏幕截图所示。

SSL 数据库迁移已完成

您可能需要使用 MySQL Workbench 等工具连接到目标。另外,您可能需要执行数据验证。如果源和目标之间的计数达到您的要求,可随意将您的应用程序指向 Aurora MySQL 数据库。

清理

停止正在运行 AWS SCT 和 ProxySQL 的 EC2 实例。此外,删除这些实例的关联安全组,或删除不再需要的规则。如果您不再需要 DMS 实例,请将其删除。

结论

在本博文中,我们说明了如何使用 AWS SCT 和 AWS DMS 将数据库和架构从 Google Cloud for MySQL(具有或不具有 SSL)迁移到 Aurora MYSQL。请试用此解决方案,如果您有任何意见,请告诉我们。

查看来自采用了类似方法的客户的博客文章:使用 AWS DMS 从 GCP 迁移到 AWS,为 OLX Autos 的平台做好准备


关于作者

作者头像Kasi Muthu 是 AWS 在德克萨斯州休斯敦的全球合作伙伴解决方案架构师,专注于数据库、分析以及人工智能/机器学习。他热衷于帮助合作伙伴和客户加速其云数据之旅。他是这个领域值得信赖的顾问,并且在云上架构和构建可扩展、弹性和高性能工作负载方面拥有丰富的经验。工作之余,他喜欢和家人在一起,并将大量空闲时间花在浏览 YouTube 上。