使用亚马逊 DynamoDB 存档到冷库

作者: 安德鲁·陈 李·汉尼根 | 202 3 年 10 月

Amazon DynamoDB 是一个完全托管的 NoSQL 数据库,可提供快速且可预测的性能和无缝扩展。多个行业的客户使用 DynamoDB 作为他们的首选数据库。

许多教育技术 (EdTech) 公司使用 DynamoDB 作为持久数据存储来跟踪学生的考试成绩和课程进度。随着学生各年级的提高,他们与特定课程材料和考试成绩的互动也会发生变化。完成课程或毕业后,学生访问过去的教育资产的频率会大大降低。出于合规或合同义务的考虑,教育科技公司必须在很长一段时间(通常超过5年)内将这些数据随时提供给学生。这种模式不仅限于教育领域——不同行业的客户在数据访问模式方面面临着类似的挑战。因此,DynamoDB 中对保持数据可访问性的经济高效存储解决方案的需求不断增长。

DynamoDB 将数据组织成表,提供两种不同的存储类别: 标准和标准不频繁访问 (标准 IA)。 标准类是默认配置,通常适用于大多数工作负载。另一方面,Standard-IA 类是专门为存储不常访问数据的表设计的。该类别为存储的每千兆字节 (GB) 数据提供了更具成本效益的价格。随着数据老化和访问频率降低,从标准表迁移到标准 IA 表成为一种经济实惠的策略。组织可以节省存储成本,同时确保它们具有与标准 DynamoDB 表类相同的性能和集成。这种方法使企业能够有效利用 DynamoDB 的存储功能,在成本优化和数据可用性之间取得平衡。拥有 DynamoDB 表且存储约占其成本的 50% 或以上的客户应考虑将其数据移至标准 IA 表。

有关 DynamoDB 标准表类和 Standard-IA 表类之间的详细定价示例,您可以查看我们的定价页面 使用不同表类的 示例

在这篇文章中,我们将探讨创建自定义解决方案的过程,该解决方案使用 亚马逊 DynamoDB Streams 、DynamoDB 生 存时间 (TTL) 和 亚马逊云科技 Lambda 将数据从标准 Dynam oDB 表存档到标准 IA 表。

解决方案概述

通过结合 DynamoDB Streams 和 Lambda 的强大功能,我们可以捕获对标准表所做的更改,并根据这些更改触发特定操作。在 TTL 的帮助下,我们可以在标准表中自动将数据标记为已过期,并在包含过期数据的 DynamoDB 流中生成一条记录。然后,通过 Lambda 事件筛选,我们可以选择性地仅处理来自 DynamoDB 流的过期数据事件。这种筛选机制使我们能够高效地处理过期数据并将其迁移到 Standard-IA 表,同时避免不必要的处理和成本。

下图说明了解决方案架构。

该工作流程包含以下步骤:

  1. DynamoDB TTL 根据项目属性从 DynamoDB 标准表中删除过期的项目。
  2. DynamoDB Streams 会生成包含过期项目的直播记录。
  3. Lambda 处理来自 DynamoDB Streams 的删除事件。使用 Lambda 事件筛选时,只有来自 DynamoDB TTL 的删除事件才能调用 Lambda。
  4. 数据被写入到 DynamoDB 标准-IA 表中。

使用 DynamoDB TTL 删除数据

DynamoDB TTL 提供了一种在 DynamoDB 中管理数据生命周期的便捷方式。使用 TTL,您可以为表中的每个项目分配时间戳,以指明该项目何时被视为过期或不再需要。在指定的时间戳之后,DynamoDB 会自动从表中删除该项目,无需您手动将其删除。TTL 的主要好处是,它允许您在没有运营开销的情况下删除过时或不相关的项目,从而减少存储的数据量。这在前面概述的场景中特别有用,在这些场景中,大量数据会随着时间的推移而过时。您可以通过自动删除过期的项目来保持表格精简,并确保仅保留与工作负载最相关和最新的数据。

重要的是,DynamoDB 在不消耗任何写入吞吐量的情况下删除过期项目,这意味着在删除过时数据时不会产生额外费用或影响性能。使用带有 TTL 的 DynamoDB 全局表时,DynamoDB 会在所有副本中复制 TTL 删除内容。根据您的表在每个副本区域中为复制 TTL 删除操作配置的容量模式和表类别,这会产生写入成本。

DynamoDB 直播概述

DynamoDB Streams 提供按时间排序的日志,其中包含对 DynamoDB 表中项目的更改。当应用程序创建、更新或删除表中的项目时,修改记录将写入表的相应流中。

默认情况下,DynamoDB Streams 会收集对 DynamoDB 项目执行的以下操作:

  • 插入 -表格中添加了一个新项目
  • 修改 -现有物品的一个或多个属性已被修改
  • 移除 -已从表格中删除项目

用户可以从以下选项中选择要捕获的数据:

  • 仅限关键属性 -仅限修改后的项目的关键属性
  • 新图片 -整个项目,如修改后显示的那样
  • 旧图片 — 整件商品,与修改之前的样子
  • 新图片和旧图片 -商品的新旧图片

使用 DynamoDB Streams,您可以本地收集已经 TTL 过期的项目的信息,用于进一步处理。

当项目使用 DynamoDB TTL 过期时,它们会在 DynamoDB 流中创建一条包含以下字段的记录:

  • Records [ ] .userIDentity.Type “服务”
  • Records [ ] .useridentity.principalID “dynamodb.amazonaws.com”

然后可以将这些属性添加为 Lambda 函数的事件过滤器,如下所示:

"Records": [
  ...
  {
    "userIdentity": {
      "type": "Service",
      "principalId": "dynamodb.amazonaws.com"
    }
  }
  ...
]

通过使用此事件过滤器,客户可以确保仅从 DynamoDB TTL 删除中调用 Lambda 函数。这可以减少调用次数并节省更多成本。

使用 Lambda 写入 DynamoDB 标准-IA 表

Lambda 是一项计算服务,允许您在不预置或管理服务器的情况下运行代码。Lambda 在高度可用的计算基础设施上运行代码以响应事件,并且您只需为消耗的资源付费。Lambda 与各种 亚马逊云科技 服务(包括 DynamoDB Streams)进行了开箱即用的集成。 您可以将 DynamoDB 流添加为触发器,让 Lambda 函数 将数据放 入标准 IA 表。项目的插入、更新或删除将记录在 DynamoDB 流中,并触发 Lambda 函数作为响应。为避免不必要的处理,您可以利用 Lambda 事件过滤来仅响应所需的事件。DynamoDB Streams 可以与各种 亚马逊云科技 服务集成,包括 Lambda。此外,Lambda 在使用来自 DynamoDB Streams 的数据时调用的 GetRecor ds API 调用无需支付任何费用。 Lambda 调用期的标准费用将按照 亚马逊云科技 Lamb da 定价收取。

结论

在这篇文章中,我们讨论了使用 DynamoDB TTL、DynamoDB Streams 和带有事件过滤功能的 Lambda 将数据从 DynamoDB 标准表存档到 DynamoDB 标准 IA 表。通过利用 亚马逊云科技 服务及其原生集成,您可以构建完全托管且经济实惠的解决方案,在 DynamoDB Standard-IA 表中存档数据。如果客户希望通过 DynamoDB API 保持数据的可访问性,同时节省存储冷数据的成本,则应实施上述解决方案。

加入对话!您的反馈和经验对我们和我们的社区非常宝贵。深入阅读下面的评论,分享您的见解、提问或提供其他观点。让我们共同增进理解!有关使用 DynamoDB 的更多信息,请参阅 开发 者指南。


作者简介

Andrew Chen 是一名教育科技解决方案架构师,对数据分析、机器学习和基础设施虚拟化感兴趣。安德鲁以前有管理咨询经验,曾担任各种云迁移项目的技术主管。在业余时间,安德鲁喜欢钓鱼、远足、划皮划艇和跟上金融市场的步伐。

Lee Hannigan 是一名高级 DynamoDB 专业解决方案架构师,现居爱尔兰多尼戈尔。他在分布式系统方面拥有丰富的专业知识,并以大数据和分析技术的坚实基础为后盾。作为 DynamoDB 专业解决方案架构师,Lee 擅长利用 DynamoDB 的功能协助客户设计、评估和优化工作负载。