8

我正在使用具有针对应用程序用例优化的键和吞吐量的 DynamoDB 表。为了支持其他临时管理和报告用例,我想在 S3 中保留一个完整的备份(一天前的备份是可以的)。同样,我无法扫描整个 DynamoDB 表来进行备份。我拥有的钥匙不足以找出什么是“新的”。如何进行增量备份?我是否必须修改我的 DynamoDB 架构,或者添加额外的表才能做到这一点?有什么最佳实践吗?

更新DynamoDB Streams解决了这个问题。

DynamoDB Streams 在任何 DynamoDB 表中捕获按时间排序的项目级修改序列,并将此信息存储在日志中长达 24 小时。应用程序可以访问此日志,并以近乎实时的方式查看修改前后出现的数据项。

4

5 回答 5

6

我看到两个选项:

  1. 生成当前快照。您必须阅读表格才能执行此操作,您可以以非常慢的速度执行此操作以保持在您的容量限制(扫描操作)之下。然后,在内存中保留在一段时间内执行的更新列表。你可以把这些放在另一张桌子上,但你也必须阅读这些,这可能会花费同样多的钱。这个时间间隔可以是一分钟、10 分钟、一个小时,无论您在应用程序退出时是否愿意丢失。然后,定期从 S3 获取快照,在快照上重放这些更改,然后上传新快照。我不知道你的数据集有多大,所以这可能不切实际,但我已经看到这对于高达 1-2GB 的数据集非常成功。

  2. 每天使用完整扫描增加读取吞吐量并备份您的数据。您说您负担不起,但不清楚您的意思是为容量付费,还是扫描会耗尽所有容量并且应用程序将开始失败。从 DynamoDB 中提取数据的唯一方法是读取数据,无论是强一致性还是最终一致性。如果备份是您业务需求的一部分,那么我认为您必须确定它是否值得。您可以通过检查ConsumedCapacityUnits结果的属性来自动限制您的阅读。Scan 操作有一个 Limit 属性,您可以使用它来限制每个操作中读取的数据量。Scan 还使用最终一致性读取,其价格是强一致性读取的一半。

于 2013-04-01T13:34:03.850 回答
4

您现在可以使用 dynamoDB 流将数据持久化到另一个表中或在另一个数据存储中维护另一个数据副本。

https://aws.amazon.com/blogs/aws/dynamodb-streams-preview/

于 2015-02-06T01:10:29.197 回答
4

对于增量备份,您可以将您的 DynamoDB 流与 Lambda 函数关联,以自动触发每次数据更新的代码(即:数据到另一个存储,如 S3)

可用于与 DynamoDb 绑定以进行增量备份的 lambda 函数:

https://github.com/PageUpPeopleOrg/dynamodb-replicator

我在博客上详细介绍了如何使用 DynamoDB Streams、Lambda 和 S3 版本化存储桶为 DynamoDb 中的数据创建增量备份:

https://www.abhayachauhan.com/category/aws/dynamodb/dynamodb-backups

或者,DynamoDB 刚刚实现了按需备份和恢复。它们不是增量的,而是完整的备份快照。

查看https://www.abhayachauhan.com/2017/12/dynamodb-scheduling-on-demand-backups/了解更多信息。

高温高压

于 2016-06-07T10:33:00.030 回答
3

2017 年 11 月 29 日,引入了按需备份。它允许您直接在 DynamoDB 中直接创建备份,而无需消耗任何容量。以下是博客文章中的一些片段:

此功能旨在帮助您遵守有关长期存档和数据保留的法规要求。您可以通过单击(或 API 调用)创建备份,而不会消耗您预置的吞吐量容量或影响应用程序的响应能力。备份以高度持久的方式存储,可用于创建新表。

...

备份立即可用!它使用 Amazon 管理的密钥进行加密,包括所有表数据、预置容量设置、本地和全局二级索引设置以及流。它不包括 Auto Scaling 或 TTL 设置、标签、IAM 策略、CloudWatch 指标或 CloudWatch 警报。

鉴于我们的一些客户的表接近 0.5 PB,您可能想知道此操作如何能够即时进行。在幕后,DynamoDB 拍摄完整快照并保存所有更改日志。进行备份就像保存时间戳以及表的当前元数据一样简单。

于 2017-11-29T17:56:18.570 回答
0

DynamoDB 中的扫描操作返回按主键(哈希键)排序的行。所以如果一个表的hash key是一个自增的整数,那么在下次备份的时候,将上次备份时保存的最后一条记录的hash key设置为扫描请求的“lastEvaluatedKey”参数,扫描会返回有仅自上次备份以来创建。

于 2015-03-07T11:10:48.323 回答