【问题标题】:DynamoDB: Is it worth indexing a table for a one-time migration effort?DynamoDB:是否值得为一次性迁移工作索引表?
【发布时间】:2019-04-02 05:04:55
【问题描述】:

我们正在使用脚本将大量具有不同属性的不同表迁移到另一个表,以转换为新的 DynamoDB 表格式。

抛开细节不谈,我们需要为旧表中的每个项目添加“已迁移”属性。为了做到这一点,我们知道我们需要使用新属性进行扫描并更新表中的每个项目。但是,如果我们正在运行的添加此属性的脚本在中途死亡,我们将需要重新启动脚本并过滤掉任何没有此新属性的内容(并且只将新属性添加到缺少它的项目中)。

出现的一个想法是,我们可以使用 primaryKey + migrated 标志将全局二级索引添加到表中,以便我们可以使用它来确定需要更快迁移的内容。

但是,对于一次性迁移工作(在失败的情况下可能会运行几次),我不确定它是否值得创建索引的成本?该表中有数亿个项目,我很难证明创建一个巨大的索引只是为了加快扫描速度。想法?

【问题讨论】:

  • 您是否考虑过使用 AWS Database Migration Service 来完成这项任务?它会自动管理迁移工作人员,并会处理任何失败/重试,因此您无需担心。
  • @MatthewPope 是的 - 不幸的是,我们不能在我们的用例中使用迁移服务,因为我们不能从一个表直接写入另一个表,而是必须通过我们的服务用于摄取的一些 API 和审计。
  • 您可以通过使用 DMS 将所有内容提取到 S3 中的 tmp 存储桶来避免需要索引,然后应用自定义解决方案将其从 S3 发送到您的摄取 API。将 S3 文件成功加载到新表后,将其从 S3 中删除,以免再次处理。您可以添加一些其他内容以使其更具容错性,但它太适合放在评论中了。

标签: amazon-dynamodb


【解决方案1】:

要有效地使用 GSI,您最好将其设为稀疏索引。它只会包含未迁移的项目。您可以通过在每个项目上设置一个“未迁移”属性来控制它,然后在迁移后从项目中删除它,但这将使您的写入次数增加 4 倍(因为您写入表和索引,一次添加未迁移标志时,一次当你删除它时)。

我建议您在扫描表的脚本中定期保存 LastEvaluatedKey,以便在脚本失败时从中断处继续。为了加快扫描速度,您可以并行执行分段扫描。

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2010-10-05
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-11-10
    • 2018-08-14
    • 2020-02-02
    相关资源
    最近更新 更多