了解并优化 Amazon Redshift 的复制功能 数据库博客
by Felipe Gregolewitsch Bipin Nair Prabhu Ayyakkannu and Suchindranath Hegde 在 2024 年 2 月 20 日发布于 高级300 ,Amazon Redshift ,AWS 数据库迁移服务 ,最佳实践 ,技术如何做
在本文中,我们深入探讨了如何使用 AWS 数据库迁移服务 将数据加载到 Amazon Redshift 中,并讨论了如何优化数据加载。通过利用 AWS DMS 和 Amazon Redshift,用户能够在处理大量不断增长的数据集时,实现高效的数据整合和更新。
在数据持续增长的今天,能够正确处理和使用大数据集至关重要。Amazon Redshift 结合机器学习ML和 SQL 进行结构化数据和半结构化数据的分析。组织面临的主要挑战包括:
如何将数据集整合至 Amazon Redshift,并保持数据的实时更新如何配置参数以优化数据加载到 Amazon Redshift的过程AWS DMS 支持广泛的 数据源 和 目标。AWS DMS 使用 复制实例 或 AWS DMS Serverless,作为运行复制软件的计算资源。
您需要创建一个源连接和目标连接,以告知 AWS DMS 从何处提取数据,以及要将数据加载到哪里。接下来,您安排在该服务器上运行的任务以移动您的数据。
AWS DMS 提供以下三种类型的复制任务:
迁移现有数据全量加载 此任务根据表和模式过滤迁移现有数据,并在加载完成后停止。变更数据捕获CDC 此任务在目标数据库中迁移源数据库的数据变更。迁移现有数据并复制持续变化全量加载和 CDC 此任务迁移现有数据并根据源数据库的变化更新目标数据库。
在数据迁移期间,AWS DMS 会从源数据库读取数据并创建一系列 CSV 文件。对于全量加载操作,AWS DMS 从源表中使用简单的查询读取数据,并为每个表单独创建 CSV 文件。AWS DMS 使用 AWS SDK 将 CSV 文件复制到您的 Amazon 简单存储服务S3 存储桶中。然后,AWS DMS 使用 COPY 命令将 Amazon S3 中的 CSV 文件的数据复制到 Amazon Redshift 中的适当表中。
在 CDC 阶段,AWS DMS 默认为 Amazon Redshift 使用 批量应用batch apply 模式,而不是事务应用模式。
为了进行数据迁移,您的 Redshift 集群必须与 AWS DMS 复制实例位于同一 AWS 账户和区域,因为 AWS DMS 需要在相同区域内将数据从 Amazon S3 读取到 Amazon Redshift。更多详细要求请参考 使用 Amazon Redshift 数据库作为 AWS 数据库迁移服务目标的先决条件。
在数据仓库的情况下,提交操作的成本可能相当高,并且事务模式可能无法满足需求。为了解决这个问题,AWS DMS 使用 批量处理batch apply,其处理流程如下:
AWS DMS 从源数据库的事务日志中读取变更事件。AWS DMS 有一个名为 Sorter 的内部组件,跟踪源数据库中的提交顺序事件。AWS DMS 在目标数据库上创建一个净变更表例如, awsdmschanges000000000XXXX。目标数据库在特定时间经过或批量大小达到一定大小之前累计事件。然后,AWS DMS 在复制实例上计算净变更并创建 CSV 文件。净表数据CSV 文件存储在 S3 存储桶中。AWS DMS 将净表数据复制到 Amazon Redshift 净变更表例如, awsdmschanges000000000XXXX。来自净变更表的操作随后以批处理的方式执行为 DELETE、INSERT 和 UPDATE 语句在 Amazon Redshift 中运行。以下图示说明此过程。
在本文章中,我们以 Amazon Aurora MySQL 兼容版 作为源数据库;然而,此处定义的策略和最佳实践也可用于其他源数据库并将 Amazon Redshift 作为目标。现在, 零 ETL 已一般可用,我们也可以考虑将其与 Amazon Aurora MySQL 结合使用。
要跟随本文的内容,您应熟悉以下 AWS 服务:
AWS DMSAmazon Redshift在将数据加载到 Redshift 集群时,请考虑以下最佳实践:
建议说明为 Redshift 表设置主键使用 AWS DMS 进行数据迁移到 Amazon Redshift 时,建议目标表上设置主键。AWS DMS 在连续复制中使用批量应用模式。如果目标表没有主键,则插入可能以批量应用模式进行,但更新和删除将逐条应用,性能将受到影响。设置目标表准备模式为 TRUNCATEBEFORELOAD 或 DONOTHING这是因为当 AWS DMS 为 Amazon Redshift 目标创建表时,默认情况下创建的表无分布键和排序键。我们可以使用 GitHub 上的视图检查 AWS DMS 预创建的表。调整 AWS DMS 设置以减少提交数例如,调整 BatchApplyTimeoutMin、BatchApplyTimeoutMax 和 BatchApplyMemoryLimit 设置。在全量加载期间处理 CSV 文件AWS DMS 默认情况下会创建 32MB 的 CSV 文件,使用 10 个线程。如果迁移大型数据集,增加 maxFileSize 和 fileTransferUploadStream 等设置将加速全量加载过程。使用 Amazon Redshift 工作负载管理 (WLM) 来管理工作负载配置 WLM 属性以影响复制操作期间的性能。参考 使用 Amazon Redshift 工作负载管理更好地管理工作负载 了解可用选项。检查数据库是否无锁或被阻塞的会话使用查询来检测当前锁状态,以确保没有阻塞情况发生。使用多线程设置和参数来加速全量加载和 CDC适当地配置 ParallelLoadThreads 和 ParallelApplyThreads 设置以利用多线程能力。检查 Amazon Redshift Advisor 的建议根据建议进行适当的更改以优化性能。使用增强 VPC 路由确保 Amazon S3 与 Redshift 集群之间的数据传输不会通过互联网。在认识到出现冲突时,调整 AWS DMS 设置AWS DMS 在出现冲突时会逐个应用更改。请参考相关知识中心文章进行故障排查。在本地环境中进行基准测试理解最佳配置并适当调整。以下是我们在基准测试中观察到的一些结果: 在默认配置下,全量加载完成时间约为 30 分钟。 通过将 “MaxFullLoadSubTasks 设置为 49,我们将完成时间缩短了近50至1601分钟。
请注意,增加 MaxFullLoadSubTasks 和 ParallelLoadThreads 会导致 AWS DMS 复制实例的 IOPS 和 CPU 利用率激增,因此请确保您监控并根据需要扩展存储和复制实例类别。有关更多细节,请参阅 优化 AWS DMS 性能。
在这个案例中,一家医疗保健客户从 MicroStrategy 迁移到 Amazon QuickSight。QuickSight 从他们的 Redshift 集群读取数据,该集群从多个 Aurora MySQL 集群接收数据。为支持迁移,他们创建了超过 400 个任务。客户面临的主要问题包括目标延迟高、AWS DMS 任务频繁失败以及 Amazon Redshift 资源的高利用率。
以下图展示了他们的初始设置。
客户在该设置中遇到的一些挑战包括:
大多数任务的初始全量加载时间超过 24 小时,造成 CDC 处于 34 天的延迟状态由于涉及多个集群,某些表需要优先处理以满足下游系统的服务级别协议SLA他们需要管理源数据库、AWS DMS 复制实例和 Redshift 集群的维护窗口在任务失败或重启时,变更写入磁盘而非内存,导致高延迟需要管理源数据库中的 DDL 更改接下来,我们讨论了一些提出的更改。
为优化全量加载,我们增加了源数据库、AWS DMS 复制实例和目标的资源,并调整了以下参数:
MaxFullLoadSubTasks 从默认的 8 增加到 25。CommitRate 增加到 50000。为了优先处理某些表,我们在 表映射 中设置了加载顺序。
蓝鸟加速器使用教程为了在全量加载期间优化并行加载,我们调优了以下参数:
jsonParallelLoadThreads 32ParallelLoadBufferSize 50
我们还调增了 CDC 期间的变更处理设置,以优化更改应用流程。这些值是经过多次测试和监控 AWS DMS 任务的延迟后选择的。虽然默认设置通常作为起点是好的,但我们建议根据实际情况评估 AWS DMS 任务并逐步调整以找到最佳方案。
json{ BatchApplyPreserveTransaction true BatchApplyTimeoutMin 1800 // 将批量频率减少到 30 分钟 BatchApplyTimeoutMax 1800 // 将批量频率减少到 30 分钟 BatchApplyMemoryLimit 4096 BatchSplitSize 8000 MemoryLimitTotal 20240 MemoryKeepTime 120 StatementCacheSize 100}
我们注意到超时问题导致延迟短暂增加。使用 Amazon CloudWatch 指标识别了这个行为,并增加了 Redshift 集群的超时时间。相应命令如下:
ALTER USER dmsuser SESSION TIMEOUT 72000
以下展示了客户的最终设置。
在本文中,我们讨论了 AWS DMS 如何在全量加载和 CDC 期间将数据加载到 Amazon Redshift 中,并分享了一些优化数据加载的最佳实践。同时,分享了客户的案例分析及其经验教训。
要深入了解 AWS DMS,请参考 AWS 数据库迁移服务入门。欢迎在评论区分享您或您的客户使用该方法后的反馈。
Felipe Gregolewitsch 是亚马逊网络服务的高级数据库迁移专家,擅长 Amazon RDS 核心服务。拥有超过 14 年的数据库迁移经验,涵盖南美和亚太地区的多个项目。
Suchindranath Hegde 是亚马逊网络服务的数据迁移专家解决方案架构师,与客户紧密合作,提供关于使用 AWS DMS 进行数据迁移的指导和技术支持。
Prabhu Ayyakkannu 是亚马逊网络服务的数据迁移专家解决方案架构师,专注于解决数据迁移相关挑战,与客户合作充分发挥 AWS DMS 的潜力。
Bipin Nair 是亚马逊网络服务的云支持 DBA,专注于 AWS DMS,拥有逾十年的 Oracle 数据库和 AWS 关系数据库工作经验。