DynamoDB - 如何进行增量备份?

8
我正在使用针对应用程序用例进行优化的DynamoDB表进行密钥和吞吐量。为了支持其他即席管理和报告用例,我想在S3中保留完整备份(一天前的备份可以)。同样,我无法扫描整个DynamoDB表来进行备份。我拥有的密钥不足以找出什么是“新”的。如何进行增量备份?我是否需要修改我的DynamoDB模式或添加额外的表来完成此操作?有没有最佳实践?
更新: DynamoDB Streams 解决了这个问题。
DynamoDB Streams捕获任何DynamoDB表中按时间顺序排列的项目级修改序列,并将此信息存储在日志中,最长可达24小时。应用程序可以访问此日志,并在几乎实时的情况下查看数据项在修改之前和之后的状态。

你如何读取分片?你如何确保分片不会被重复读取? - bpavlov
5个回答

6

我看到两个选项:

  1. 生成当前快照。您需要从表中读取数据来完成此操作,可以以非常缓慢的速度执行(Scan 操作)以保持在容量限制之下。然后,在内存中保留一段时间内执行的更新列表。您可以将这些放在另一个表中,但是您也必须读取它们,这可能会花费同样多的代价。这个时间间隔可以是一分钟、10 分钟、一个小时,或者任何您在应用程序退出时感到舒适的时间间隔。然后,定期从 S3 获取您的快照,回放这些更改并上传新的快照。我不知道您的数据集有多大,所以这可能不切实际,但我见过对于 1-2GB 的数据集使用此方法获得了巨大成功。

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


选项2(每天完整扫描)可能不可行,因为数据不断增长。我更倾向于选项1。我愿意在最少的额外表格和容量上投入以实现备份功能。接下来的问题是,如何最好地回放快照中的更改(这些更改大部分可能是CSV或JSON格式的)?我应该将快照加载到某个本地数据库中,执行回放操作,然后存储新的快照吗? - Nizam Mohideen
我的数据现在接近1 GB,但我希望做好迎接大幅增长的准备。 - Nizam Mohideen
我在考虑内存处理,因此使用快照方法处理的数据大小受限于内存容量。将最新的快照反序列化为对象集合,应用更新并重新序列化。随着数据增长,请考虑对快照进行分区(或使用其他数据库)。如果必须更新分区以适应数据增长,则报告的其他部分也需要识别该更改。 - Steven Hood
谢谢@Steven。我会在达到15个最低点赞后给你点赞的 :-( - Nizam Mohideen

4

2
欢迎来到 Stack Overflow!虽然这个回答或许能解决问题,但最好是在这里包含必要的部分并提供链接作为参考。 - Nathan Tuggy

4

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

您可以使用的Lambda函数来与DynamoDb捆绑进行增量备份:

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/

希望对你有所帮助。


3
2017年11月29日,引入了“按需备份”功能。它允许您直接在DynamoDB中创建备份,几乎不会消耗任何容量。以下是来自博客文章的一些摘录:
此功能旨在帮助您符合长期归档和数据保留的监管要求。您可以仅通过单击(或API调用)创建备份,而无需消耗配额吞吐量或影响应用程序的响应性。备份以高度耐用的方式存储,并可用于创建全新的表。 ... 备份立即可用!它使用由亚马逊管理的密钥加密,并包括所有表数据、已配置的容量设置、本地和全局二级索引设置以及Streams。但不包括自动缩放或TTL设置、标签、IAM策略、CloudWatch指标或CloudWatch警报。 您可能会想知道,考虑到一些客户的表接近半个PB,为什么这个操作可以瞬间完成。幕后,DynamoDB进行完整快照并保存所有更改日志。备份的操作只是将时间戳与当前表的元数据一起保存。

除此之外,您现在可以进行持续备份,并使用时间点恢复功能将其还原到单独的表中。因此,如果您需要在过去35天内的特定时间进行报告,现在也可以这样做。 - NoSQLKnowHow

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接