将 Amazon QLDB 账本迁移至 Amazon Aurora PostgreSQL 数据库博客

将 Amazon QLDB 账本迁移到 Amazon Aurora PostgreSQL

作者 Dan Blaner日期 2024年7月18日类别 高级 (300) Amazon Aurora Amazon Quantum Ledger Database (Amazon QLDB) 与 PostgreSQL 兼容 技术如何操作链接

将 Amazon QLDB 账本迁移至 Amazon Aurora PostgreSQL 数据库博客

关键要点

在本文中,我们展示了将 Amazon QLDB 账本迁移至 Amazon Aurora PostgreSQL 的过程,包括如何使用美国机动车辆管理局 (DMV) 的示例账本进行操作。Amazon Aurora PostgreSQL 作为一个可靠的数据库选项,可以维持数据变更的审计记录。

迁移决策

在进行数据库迁移时,必须决定哪些数据会被迁移。对于某些应用程序,可能希望迁移整个数据库及其所有历史数据;而对于其他应用,迁移最近的数据例如最近12个月并将旧数据归档则更为合适。有些情况可能需要快速迁移最近数据,等到应用程序切换后再迁移旧数据。通常,迁移不会一次性完成,因此需要在一段时间内保持目标数据库与源数据库的同步。

本文的解决方案首先迁移整个源账本到目标数据库,然后将源数据库中的更新复制到目标数据库,直到切换为止。这种解决方案是模块化的,可以根据您的特定迁移策略进行调整。

在迁移过程中,您还需决定如何在目标数据库中建模数据,并在迁移时将账本数据转换为适合该模型的格式。Amazon QLDB 的文档数据模型支持复杂的结构化文档,可能包含嵌套元素。然而,将灵活的文档模型映射到更为严格的关系数据库模式可能会非常具有挑战性。由于文档结构随时间变化,迁移进程无法假设每个修订都有相同的结构。鉴于这些挑战,您可以选择将数据以 JSON 格式迁移到 Amazon Aurora PostgreSQL,这能大大简化迁移,但可能不是访问关系数据库中数据的最佳方法。

在本文的解决方案中,车辆注册示例应用程序的账本数据被规范化为关系模型,同时账本的修订元数据以 JSONB 类型存储在 Amazon Aurora PostgreSQL 中。

解决方案概览

迁移过程分为两个阶段:全面加载和持续复制。全面加载通过高效的批量加载方式将源数据库的数据导入目标数据库。在应用程序切换到目标数据库之前,源数据库可能会继续处理流量,因此其中可能包含未被全面加载的数据更改。持续复制或变更数据捕获,CDC过程会不断捕获更改并迁移至目标数据库,以保持其与源数据库的实时同步。

在全面加载阶段,Amazon QLDB 网络账本被导出到 Amazon S3 存储桶。导出包含自导出开始时刻起所有事务的数据。接着,一个 AWS Glue 作业将导出的账本文档修订提取出来,并转化为 CSV 格式,以便与 AWS 数据库迁移服务 (AWS DMS) 一同使用。AWS Glue 作业将转化后的 CSV 文件写入 Amazon S3。然后,AWS DMS 任务从 Amazon S3 读取 CSV 文件,并将其数据加载到 Aurora PostgreSQL 数据库中。尽管本文展示了将数据迁移至 Amazon Aurora PostgreSQL,AWS DMS 还支持多种其他目标终端目标端点的多样性,因此这里展示的过程可以适配到其他数据库的迁移中。

以下图示展示了解决方案架构。

持续复制阶段会捕获账本的新更新并在几近实时的情况下将其迁移至目标 Aurora PostgreSQL 数据库。该过程依赖于 Amazon QLDB 的 流式传输 功能。解决方案通过识别导出中的最后账本块,确保流式传输从导出开始后提交的第一个账本块开始。随着新事务在账本中提交,Amazon QLDB 将这些更改发送至 Amazon Kinesis 数据流。一个 AWS Lambda 函数会从 Kinesis 数据流中消费事件并将数据写入目标数据库,如下图所示。

前提条件

迁移解决方案将使用多个 AWS CloudFormation 模板进行部署,以设置基础设施并部署在迁移中使用的代码。CloudFormation 模板和相关文件可在 GitHub 代码库 下载,并必须下载至您的工作站。使用以下命令下载项目代码:

bashgit clone git@githubcomawssamples/exampleqldbledgermigrationgit

项目包含以下文件:

文件名称描述setupyml部署并填充车辆注册账本、目标 Aurora PostgreSQL 数据库及相关的 VPC 网络ledgerexportyml部署导出账本数据的组件ledgerfullmigrationyml部署 AWS Glue 和 AWS DMS 组件,用于提取、转换和加载 (ETL) 导出的账本数据到目标数据库ledgercdcmigrationyml设置 Amazon QLDB 流式传输和将账本更改写入目标数据库的流消费者dmvpostloadddlsql包含在迁移的全面加载阶段完成后用于创建目标数据库索引的 SQL 语句

创建源数据库和目标数据库

为了演示,我们创建一个 Amazon QLDB 账本作为源,创建一个 Aurora PostgreSQL 集群作为目标,并配套创建 VPC 和相关网络、AWS Secrets Manager 以存放数据库凭据、S3 存储桶、AWS 身份与访问管理 (IAM) 角色及另一些启动 Aurora 集群所需的组件。设置将账本数据库填充数据并在 Aurora PostgreSQL 集群上创建数据库和架构,同时创建用于迁移的数据库用户。

该解决方案依赖于 RDS 数据 API,该 API 在所有区域不可用。请查阅 这张表 以确认您所在区域是否支持数据 API。

如果您使用此解决方案作为自己的迁移基础,您可以跳过此部分,如果您已经设置了 Amazon QLDB 账本和 Aurora PostgreSQL 集群。

按照以下步骤使用 AWS CloudFormation 部署组件:

在 AWS CloudFormation 控制台中,选择左侧导航窗格中的 Stacks。选择 Create stack,然后选择 With new resources (standard)。选择 Upload a template file。选择 Choose file,然后选择您从 GitHub 项目中获取的 setupyml 文件。选择 Next。在 Specify stack details 页面,输入 ledgermigratesetup 作为 Stack name。保持所有输入参数为默认值,除非 VPC 的 CIDR 与您环境中的其他 VPC 冲突。在这种情况下,修改 VPCCIDR、DatabaseSubnetCIDRs 和 PublicSubnetCIDRs 参数以避免冲突。您可能还需要调整默认的 AuroraDBInstanceClass 参数,因为不是所有实例类型在所有区域都可用。选择 Next。在 Configure stack options 页面,选择 Next。在 Review and create 页面,选中为创建 IAM 资源提供认可的复选框,然后选择 Submit。

当堆栈处于 CREATECOMPLETE 阶段时,选择 Outputs 选项卡以查看堆栈输出。这些值将在迁移过程的后续步骤中使用。

从 Amazon QLDB 导出数据

迁移的第一步是将源账本中的数据导出到 S3 存储桶。导出由许多文件组成,每个文件包含一个或多个以 JSON 格式表示的账本块请参阅 QLDB 中的日志导出输出 获取详细信息。即使是中等大小的账本,导出过程也可能需要数小时。为了减少导出时间,可以并行运行单个账本的多个导出,每个导出处理账本的一部分。Amazon QLDB 默认支持最多两个并发导出。如果您有非常大的账本数百GB,请联系 AWS 支持以请求增加该限制。

在此解决方案中,我们使用 Step Functions 执行导出。状态机接受所需的并发导出数量作为参数。它获取账本摘要以获得日志中的最后块编号,并使用该编号将账本分为相等部分,将工作均匀分配到导出任务中。状态机开始导出工作,并循环直至所有任务完成。当所有导出工作完成后,状态机获取每个导出中最后块的摘要和证明哈希,并将其存储在 Amazon S3 中,以便在源账本被删除后进行加密验证在此文章中不展示此过程。

要运行导出,我们首先需要使用 AWS CloudFormation 部署所需的组件。按照以下步骤操作:

在 AWS CloudFormation 控制台中,选择左侧导航窗格中的 Stacks。选择 Create stack,然后选择 With new resources (standard)。选择 Upload a template file。选择 Choose file,然后选择您从 GitHub 项目中获取的 ledgerexportyml 文件。选择 Next。在 Specify stack details 页面中,将 Stack name 设置为 ledgerexport。保持 LedgerName 参数的默认值“vehicleregistration”。选择 Next。在 Configure stack options 页面,选择 Next。在 Review and create 页面,选中为创建 IAM 资源提供认可的复选框,然后选择 Submit。当堆栈处于 CREATECOMPLETE 阶段时,打开 Step Functions 控制台,选择左侧导航窗格中的 State machines。选择 LedgerExporter 状态机。

状态机接受一个 JSON 对象作为输入。

在 JSON 编辑器中输入以下代码片段。如果您通过 AWS 支持增加了并发导出的限制,请将 ExportCount 的值更改为新的限制。

json{ LedgerName vehicleregistration BucketPrefix dmv/ ExportCount 2}

选择 Start execution。状态机将在 vehicleregistration 账本上运行大约 10 分钟,但对更大的账本需要更长时间。完成后,执行状态将显示为 Succeeded。运行详细信息页面的 Graph view 部分展示了状态机中步骤的可视化表示。

选择 Export 节点,从 Output 部分复制导出 ID,并将其保存到文本编辑器中。您将在后续步骤中使用它们。

选择 Digest 节点,并将 LastBlockNum 和 LastBlockTimestamp 的值复制到文本编辑器中以供后用。

导出完成。该过程创建了一个名为 ledgerexport[ACCOUNT ID] 的 S3 存储桶,其中包含一个名为 dmv 的文件夹,存储已导出的账本数据,格式为 JSON。文件夹的名称是在状态机输入中设置的 BucketPrefix 参数。

提取和转换数据

导出完成后,下一步是从导出的 JSON 文件中提取账本数据,并将其转换为 CSV 文件,以便高效加载到 Amazon Aurora PostgreSQL 中。解决方案创建 AWS Glue 作业执行提取和转换。AWS Glue 使用 Apache Spark 将导出数据集分配到多个计算节点,以并行处理,从而减少处理大型账本所需的时间。AWS Glue 作业从导出步骤创建的 S3 存储桶中读取已导出的数据,并将其输出写入由该过程创建的新 ETL 存储桶。

AWS Glue 作业的构建旨在将 k 账本中的表转换为我们为目标数据库设计的架构,将账本文档的结构展平为关系数据库的行和列。要使用此过程迁移您的账本,您需要修改 AWS Glue 作业的 PySpark 代码中的部分内容,以适应您的数据模型。

tg加速器下载

要执行提取和转换,请使用 AWS CloudFormation 部署所需的组件:

在 AWS CloudFormation 控制台中,选择左侧导航窗格中的 Stacks。选择 Create stack,然后选择 With new resources (standard)。选择 Upload a template file。选择 Choose file,然后选择您从 GitHub 项目中获得的 ledgerfullmigrationyml 文件。

选择 Next。该模板将部署此迁移阶段和下一阶段所需的组件。

在 Specify stack details 页面,将 Stack name 设置为 ledgerfullmigrate。与导出堆栈不同,此模板需要输入参数。

提供以下输入参数:

对于 LedgerName,输入来自 ledgermigratesetup 堆栈的 LedgerName 输出参数的值。

对于 ExportIds,输入从状态机运行中复制的导出 ID,格式为逗号分隔的列表。对于 ExportBasePrefix,输入 dmv/。对于 GlueWorkerType,输入 G2X。对于 NumberOfGlueWorkers,输入 2。对于 ReplicationInstanceSubnets,输入来自 ledgermigratesetup 堆栈的 DatabaseSubnets 参数中的子网。对于 ReplicationInstanceClass,输入 dmsr6ilarge。对于 SecurityGroups,选择来自 ledgermigratesetup 工作组的 DatabaseSecurityGroups 参数中的安全组。对于 TargetDatabaseSecretName,输入来自 ledgermigratesetup 堆栈的 MigrateDatabaseUserSecretName 输出参数的值。

对于 TargetDatabaseName,输入来自 ledgermigratesetup 堆栈的 TargetDatabaseName 输出参数的值。

选择 Next。

在 Configure stack options 页面,选择 Next。在 Review and create 页面,选中为创建 IAM 资源提供认可的复选框,然后选择 Submit。

当 CloudFormation 堆栈部署完成后,导航到 AWS Glue 控制台,选择左侧导航窗格中的 ETL jobs。

选择 ledgerdmvmigrate 作业并选择 Run job。

选择作业名称以打开作业详细信息页面。选择 Runs 选项卡以查看作业状态。

作业完成后,其状态将显示为 Succeeded。

![作业执行成功](https//d2908q01vomqb2cloudfrontnet/887309d048beef83ad3