亚马逊推荐的在生产DynamoDB中更改大表模式的方法是什么?
想象一下假设的情况,我们有一个表Person,主哈希键SSN。该表可能包含1000万个项目。
现在有消息称,由于身份盗窃的严重程度,这个假想国家的政府已经引入了另一个个人身份识别:唯一个人识别码,或UPI。
我们必须添加一个UPI列并更改Person表的模式,以便现在主哈希键是UPI。 我们希望在一段时间内支持使用SSN的当前系统和使用UPI的新系统,因此我们需要这两个列在Person表中共存。
亚马逊推荐的这种架构更改方式是什么?
答案 0 :(得分:21)
有两种方法,但首先您必须了解您无法更改现有表的架构。要获得不同的架构,您必须创建一个新表。您可以重用现有表,但结果与创建不同表的结果相同。
答案 1 :(得分:11)
DynamoDB流使我们能够在不停机的情况下迁移表。我做得非常有效,我遵循的步骤是:
扫描上一步(或整个表)中创建的GSI并使用以下过滤器:
FilterExpression =" attribute_not_exists(已迁移)"
使用迁移标志更新表中的每个项目(即:“Migrated”:{“S”:“0”},将其发送到DynamoDB Streams(使用UpdateItem API,以确保不会发生数据丢失)。
注意:您可能希望在更新期间增加表格上的写入容量单位。
遵循这些步骤应确保您没有数据丢失且无停机时间。
我已经在我的博客上记录了这一点,并提供了协助代码: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/
答案 2 :(得分:2)
我使用亚历山大的第三种方法。再次,您创建一个新表,将在更新旧表时更新。不同之处在于,在您转换而不是使用lambda函数时,使用现有服务中的代码写入两个表。您可能拥有自己不希望在临时lambda函数中重现的自定义持久性代码,并且您可能无论如何都必须为此新表编写服务代码。根据您的架构,您甚至可以在没有停机的情况下切换到新表。
但是,使用lambda函数的好处是,对新表的附加写入引入的任何负载都将在lambda上,而不是服务上。
答案 3 :(得分:0)
如果更改涉及更改分区键,则可以添加新的GSI(全局二级索引)。此外,您始终可以向DynamoDB添加新的列/属性,而无需迁移表。