使用 AWS DMS 从 PostgreSQL 迁移至 Amazon RDS

简介

在本教程中,您将学习如何将自托管 PostgreSQL 数据库实例迁移至 Amazon Relational Database Service (Amazon RDS) 上的全托管数据库。首先,您将了解为什么应使用 Amazon RDS 来管理关系型数据库。接下来,您将按照步骤将现有 PostgreSQL 数据库迁移至 Amazon RDS。在本教程结束时,您应能够自如地将现有数据库迁移至 Amazon RDS。

 时长

30-45 分钟

为什么使用 Amazon RDS?

Amazon RDS 是一款全托管服务,用于在 AWS 上运行关系型数据库。该服务支持六种不同的数据库引擎,包括 MySQL、PostgreSQL 和 MariaDB 等开源数据库。

通过 Amazon RDS,AWS 将负责管理您的数据库运维工作,让您的团队能够全身心投入创新。Amazon RDS 可处理实例故障转移、数据备份和软件更新。依托 AWS Cloud 的高效性,您可以使用速度更快、成本更低、可靠性更高的数据库服务。

教程内容

在本教程中,您将学习如何将自托管 PostgreSQL 数据库迁移至 Amazon RDS 上的全托管数据库。本教程分为五个步骤。

1. 在 Amazon RDS 中创建 PostgreSQL 数据库实例

在本模块中,您将在 Amazon RDS 中创建一个 PostgreSQL 数据库实例。使用 AWS DMS 将现有数据复制到此实例后,该实例将成为您的主数据库。

首先,前往 Amazon RDS 控制台。在控制台主页上,点击 Create database(创建数据库),创建新的数据库。

此操作会启动数据库创建向导。在 Engine options(引擎选项)界面中,点击 PostgreSQL 作为 Engine type(引擎类型)。然后选择您要使用的 PostgreSQL Version(版本)。请注意,AWS DMS 支持 PostgreSQL 9.4 及更高版本 (9.x)、10.x 和 11.x。

数据库创建向导提供了一些预设模板,方便您更快速地配置 Amazon RDS 数据库的各项设置。如果您要创建用于生产环境的数据库,建议选择生产环境模板。

在 Settings(设置)界面中,指定数据库的名称,并设置主账户的用户名和密码。本教程中请勿使用自动生成的密码,并务必确保记下您设置的密码。您后续需要该密码才能连接至数据库并创建其他用户账号。

接下来,选择 Database instance size(数据库实例规格)。您应该根据预估的数据库容量需求来选择实例规格。如果您目前是在 Amazon Elastic Compute Cloud (Amazon EC2) 上管理自己的数据库,则可以将当前 Amazon EC2 实例规格与 Amazon RDS 实例规格进行比较。

如果日后需要升级或降级数据库实例规格,可使用 Amazon RDS 轻松进行调整。不过请注意,调整数据库实例规格可能会导致数据库在一段时间内无法访问。

接下来,配置 Amazon RDS 数据库的 Storage(存储)选项。Amazon RDS 提供两种存储选项:General Purpose(通用型)和 Provisioned IOPS(预配 IOPS),IOPS 即每秒输入/输出操作数。如果选择通用型存储,每分配 1 GiB 的存储就会获得 3 IOPS 的性能。例如,100 GiB 的存储会获得 300 IOPS。此外,该存储类型还能提供最高 3000 IOPS 的突发性能。

如果选择预配存储,您可以单独为 IOPS 和存储容量进行配置。这样可以让您根据实际需求来灵活调整存储和性能配置。此外,您还可以启用 Storage autoscaling(存储自动扩展)功能。启用存储自动扩展功能后,Amazon RDS 会在数据库即将耗尽可用磁盘空间时自动增加存储容量。

接下来,需要决定是否要创建备用实例。备用实例其实就是数据库的一个副本,当主实例出现故障时可以接管服务。该副本应位于与您的 Amazon RDS 数据库相同的 AWS 区域内的不同可用区中,以降低单个数据中心故障带来的影响。如果您的生产数据库需要保证高可用性,我们建议您创建一个备用实例。

Amazon RDS 数据库创建向导的下一部分是关于 Connectivity(连接)。您必须指定数据库所部署的 Amazon Virtual Private Cloud (Amazon VPC),以及数据库实例的网络子网和安全组。

如果您是从 Amazon EC2 上的自托管数据库实例进行迁移,则可沿用与现有数据库相同的 Amazon VPC 和安全组配置。

如果您要迁移的数据库没有托管在 AWS 上,而应用程序部署在 AWS 上,那么请选择应用程序所在的那个 Amazon VPC,然后再为数据库实例新建一个安全组。

最后,选择数据库支持的 Database authentication(数据库身份验证)方法。一般而言,PostgreSQL 数据库支持用户名和密码身份验证。使用 Amazon RDS 上的 PostgreSQL,您还可以选择允许使用 AWS Identity and Access Management (IAM) 进行身份验证。这种验证方式可以与应用程序服务器无缝集成,而且不需要定期轮换密码。

建议选择 Password and IAM database authentication(同时启用密码和 IAM 数据库身份验证)。如果只想先使用密码身份验证,则可以稍后添加 IAM 数据库身份验证,但这会导致 Amazon RDS 数据库实例在添加过程中出现短暂的停机时间。

您还可以配置其他一些选项,比如备份、监控、维护和自动升级等设置。尽管多数情况下默认设置就能满足需求,但我们仍然建议您仔细检查每个配置,确保它们符合您的实际需要。

在数据库创建向导的最后,您会看到该数据库实例的预估月度费用。点击 Create database (创建数据库),创建数据库。

在 Amazon RDS 配置基础设施并初始化数据库时,数据库的 Status(状态)会显示为 Creating(创建中)。

数据库准备就绪后,其 Status(状态)将变为 Available(可用)。

在本模块中,您已经成功在 Amazon RDS 中创建了一个可以立即用于生产环境的全托管 PostgreSQL 数据库实例。在下一个模块中,您将学习如何在 AWS DMS 中创建复制实例。

2. 在 AWS Database Migration Service (AWS DMS) 中创建复制实例

在本模块中,您将在 AWS DMS 中创建一个复制实例。

AWS DMS 是一款数据复制服务,可以将现有数据库的数据复制到 AWS 全托管数据库中。复制实例实际上就是 AWS DMS 用来运行数据复制任务的一个 Amazon EC2 实例。在下一个模块中,您将创建端点。

使用 AWS DMS 将现有 PostgreSQL 数据库迁移到 Amazon RDS 中的 PostgreSQL 数据库之前,您应该仔细阅读 AWS DMS 文档,了解如何使用 PostgreSQL 数据库作为源以及如何使用 PostgreSQL 数据库作为目标。在某些情况下,使用原生工具(如 pg_dump 和 pg_restore)迁移数据库不失为一种好的选择。

要创建复制实例,首先前往 AWS DMS 控制台的 Replication Instances(复制实例)界面。点击 Create replication instance(创建复制实例)以启动复制实例创建向导。

在 Replication instance configuration(复制实例配置)界面中,指定复制实例的 Name(名称)和 Description(描述),然后选择 Instance class(实例规格类型)。复制实例的规格类型需要根据现有数据库的大小和实例的数据传输量来决定。

然后选择 AWS DMS 的 Engine version(引擎版本)。最后,选择复制实例的 Allocated storage(分配的存储)容量。

在 Replication instance configuration(复制实例配置)界面中继续操作时,需要为复制实例选择一个 VPC。为简化复制实例的网络访问设置,建议选择之前创建 Amazon RDS 数据库时使用的同一 VPC。

为了提高可用性,您可以考虑为复制实例设置 Multi-AZ(多可用区)部署。如果您计划长期使用 AWS DMS 保持两个数据库的同步,那么建议启用多可用区部署。但如果只是将现有数据库一次性迁移到 Amazon RDS 全托管数据库中,则不太需要进行多可用区部署。

最后,选择您的复制实例是否需要启用 Publicly accessible(可公开访问)。如果现有数据库与新数据库和复制实例都位于同一 VPC 中,就不需要开放复制实例的公共访问权限。如果现有数据库不位于同一 VPC 中,则应使用 AWS Direct Connect 或 VPN 来允许从 VPC 连接至现有数据中心。为避免潜在的安全问题,在大多数情况下应避免启用复制实例的可公开访问。

接下来,展开 Advanced security and network configuration(高级安全和网络配置)界面。对于 VPC security group(s)(VPC 安全组)配置,选择附加至 Amazon RDS 数据库的同一安全组。这样做可以允许复制实例访问 Amazon RDS 数据库。

此外,您还可以编辑 Maintenance(维护)和 Tags(标签)设置。

设置完成后,点击 Create(创建),在 AWS DMS 中创建复制实例。

点击 Create(创建)后,AWS 将预配复制实例。在 AWS 预配和初始化实例期间,复制实例的 Status(状态)会显示为 Creating(创建中)。

复制实例准备就绪后,其 Status(状态)会变为 Available(可用)。

在等待复制实例变为可用期间,前往 Amazon EC2 控制台中的 Security Groups(安全组)界面。您需要向安全组添加一条规则,以允许复制实例访问数据库。

在 Security Groups(安全组)界面中,找到并选中附加至 PostgreSQL 数据库实例和复制实例的安全组。

点击 Edit inbound rules(编辑入站规则),编辑安全组的入站规则。

您会发现该安全组中已经存在一条规则,该规则允许从创建数据库时所使用的 IP 地址访问 PostgreSQL 实例。移除这个已有的 IP 地址,转而在规则中添加 Amazon RDS 数据库实例和复制实例所使用的安全组名称。

此时的操作界面应如下所示。

点击 Save rules(保存规则),保存对安全组所做的规则更改。

当复制实例创建完成并且安全组规则也修改完毕后,我们就可以开始学习下一模块的内容了。

在本模块中,您在 AWS DMS 中创建了一个复制实例。该复制实例的作用是运行复制任务,把数据从现有的数据库迁移到 Amazon RDS 的全托管数据库中。此外,您还更新了安全组设置,以允许从复制实例访问 Amazon RDS 中的 PostgreSQL 数据库实例。

在下一个模块中,您将学习如何在 Amazon RDS 中为源数据库和目标数据库分别创建端点。

3. 在 AWS DMS 中创建端点

在本模块中,您将学习如何在 AWS DMS 中为复制任务分别创建源端点和目标端点。

所谓复制任务,就是使用 AWS DMS 把数据从一个数据库迁移到另一个数据库的作业。在创建复制任务前,必须先为源数据库和目标数据库分别注册端点。端点中定义了连接数据库所需的信息,包括连接地址、登录凭证等。

我们先来为目标数据库创建端点。目标数据库是您在 Amazon RDS 中所创建的数据库。

前往 AWS DMS 控制台,点击左侧菜单的 Endpoints(端点)。点击 Create endpoint(创建端点),创建新的端点。

在端点创建向导中,选择创建 Target endpoint(目标端点)。选中 Select RDS DB instance(选择 RDS 数据库实例)复选框,然后在下拉列表中选择新创建的 Amazon RDS 数据库。

系统会自动填充 Endpoint configuration(端点配置)的大部分内容。您只需要在该界面底部输入您的数据库 Password(密码)。

在保存端点设置前,最好先测试一下连接,以确保配置正确无误。要测试端点连接,展开 Test endpoint connection(测试端点连接)界面。

选择要进行测试的 Replication instance(复制实例),然后点击 Run test(运行测试)。几秒钟后,您应该能看到测试的 Status(状态)会变为 successful(成功)。这说明您的安全组和端点配置是正确的。点击 Create endpoint(创建端点)保存端点设置。

接着,重复上述步骤,为源数据库也创建一个端点。与目标数据库端点不同的是,源数据库端点的连接地址、端口号和登录凭证需要您自己填写。

此外,还要确保复制实例能够访问源数据库。如果您的源数据库托管在 Amazon EC2 上,请确保允许复制实例的安全组与源数据库的安全组之间进行网络通信。如果您的源数据库未托管在 Amazon EC2 上,则需要根据源数据库的位置来调整网络设置。

在继续学习下一个模块之前,应确保您已经成功配置了两个端点,分别用于源数据库和目标数据库。同时,务必测试这两个端点的连通性,确保它们都能成功连接到对应的数据库。完成这些步骤后,您可以继续学习下一个模块。

在本模块中,您创建了用于连接源、目标数据库所需的端点。在下一个模块中,您将使用这些端点创建一个复制任务,将数据从源数据库复制到目标数据库。

4. 在 AWS DMS 中创建复制任务

在本模块中,您将在 AWS DMS 中创建一个复制任务。

复制任务负责将数据从源数据库迁移至目标数据库。在本示例中,您要将数据从现有数据库迁移至 Amazon RDS 中新创建的数据库。

首先,前往 AWS DMS 控制台,点击左侧菜单的 Database migration tasks(数据库迁移任务)。然后点击 Create task(创建任务),创建新的复制任务。

在 Task configuration(任务配置)界面中,设置复制任务的各项参数。为任务命名,并选择在前一个模块中创建的 Replication instance(复制实例)。然后为现有数据库选择 Source database endpoint(源数据库端点),并为 Amazon RDS 中的全托管数据库选择 Target database endpoint(目标数据库端点)。

此外还需要选择 Migration type(迁移类型)。AWS DMS 提供两种迁移类型:

1.Migrate existing data(迁移现有数据),用于执行一次性的全量数据复制,将源数据库中的所有数据复制到目标数据库。

2.Replicate ongoing changes(复制持续更改),用于捕获源数据库的所有后续变更,并将其同步到目标数据库。

如果要将应用程序从自托管数据库迁移至全托管数据库,则需要同时使用这两种类型。第一种类型会复制数据库中的所有现有数据,第二种类型可确保后续的增量变更同步到新的数据库,直到应用程序最终切换到新数据库。

对于 Migration type(迁移类型),选择 Migrate existing data and replicate ongoing changes(迁移现有数据并复制持续更改)。请注意,该操作需要在源数据库上启用 logical replication(逻辑复制)。

在 Table mappings(表映射)界面中,选择要复制的表。输入要复制的 Schema name(模式名)和 Table name(表名)。您可以使用 % 作为通配符来匹配多个表或模式。

在本实践中,您将按原样迁移源数据库中存在的表。如果您有更复杂的要求,可在将源数据写入目标数据库之前,使用 AWS DMS 进行过滤和转换

设置完成后,点击 Create task(创建任务),启动复制任务。

创建完成后,该任务会显示在 Database migration tasks(数据库迁移任务)界面中,其 Status(状态)显示为 Creating(创建中)。

任务初始化后,其 Status(状态)会变为 Starting(正在启动)。

当现有数据迁移完成后,任务的 Status(状态)会变为 Load complete, replication ongoing(全量加载完成,增量复制进行中)。此时,源数据库的任何变更都会被实时同步到目标数据库。

在本模块中,您在 AWS DMS 中创建了一个复制任务,用于将现有数据从原有数据库迁移到 Amazon RDS 的新数据库中,并持续同步源数据库之后的增量变更。

在下一个模块中,您将学习如何完成迁移并清理教程中创建的各种资源。

5. 完成迁移并清理资源

如果您严格按照本课程的所有步骤进行操作,那么现在您应该已经在 Amazon RDS 中创建了一个新的、全托管数据库。您还创建了一个迁移任务,用于将数据从源数据库复制到新的数据库。在最后一个模块中,您将学习如何完成数据迁移,以及如何清理 AWS DMS 资源。

完成初始的全量迁移并将所有数据同步至新的数据库后,即可将新的数据库用作主数据库。

您可以采取以下两种方式:

  1. 如果您对迁移的效果很有信心,可以直接修改应用程序的数据库连接配置,让其连接到新的数据库。如此一来,所有的读写操作都会直接作用在新的数据库上。
  2. 如果您想更谨慎一些,也可以选择在一段时间内对新旧两个数据库同时进行读写操作。这种方式既可以在现有数据库中持续维护数据的准确性,也能让您比对两个数据库的查询结果,以验证数据的一致性。 此外,您可以使用 AWS DMS 中的验证功能比较源记录和目标记录。

无论您选择哪种切换方式,在新数据库正式成为主数据库之前,都应对其进行充分的测试。当应用程序完全切换到新的主数据库,并且您对迁移结果也完全满意后,就可以考虑删除 AWS DMS 的相关基础设施了。

虽然我们在本教程中使用了 AWS DMS,但还有其他方法可以迁移 PostgreSQL 数据库。您可以使用 pg_dump 和 pg_restore 客户端应用程序创建数据导出文件,然后将其加载至新数据库中。此外,您可以使用原生 PostgreSQL 逻辑复制将持续更改迁移至新数据库。

当应用程序完全切换到新的主数据库,并且您对迁移结果也完全满意后,就可以考虑删除 AWS DMS 的相关基础设施了。

首先,停止并删除用于复制数据的数据库迁移任务。前往 AWS DMS 控制台,点击左侧菜单的 Database migration tasks(数据库迁移任务)。选中要移除的任务,然后点击 Stop(停止)。

停止任务需要一些时间。任务停止后,再次将其选中,然后点击 Delete(删除)。

接下来,前往 AWS DMS 控制台,点击 Endpoints(端点)。同时选中源端点和目标端点,然后点击 Delete(删除)。

再点击左侧菜单的 Replication instances(复制实例)。如果复制实例未被用于任何其他复制任务,将其选中,然后点击 Delete(删除)。

如果不想保留为本教程创建的目标 Amazon RDS 数据库,也应将其删除。

前往 Amazon RDS 控制台。选择您的数据库实例,然后从 Actions(操作)下拉菜单中点击 Delete(删除)。

确认您要删除数据库。您可以选择不创建最终快照或保留备份,因为您仅在本实践中使用该数据库。

最后,由于源数据库已经不再使用,您可能还需要将其终止。如果源数据库运行在 Amazon EC2 实例上,则可终止该 Amazon EC2 实例。如果您的源数据库在其他地方运行,请遵循适当的终止程序来操作。

在本模块中,您掌握了如何将应用程序迁移到新的数据库上。此外,您还掌握了如何在使用完 AWS DMS 资源后清理这些资源。

总结

总的来说,在本教程中,我们使用 AWS DMS 成功地将一个现有的自托管 PostgreSQL 数据库迁移至了 Amazon RDS 中的全托管 PostgreSQL 数据库。此迁移可以让开发人员从繁琐的数据库运维工作中解放出来,全身心投入到业务创新中。另外,AWS DMS 可以帮您自动化执行将数据迁移到新数据库这个复杂的任务。

从 MongoDB 迁移至 Amazon DocumentDB