更改DynamoDB表的架构:最佳/推荐方式是什么?

Dim*_*hev 36 amazon-dynamodb

亚马逊推荐的在生产DynamoDB中更改大型表的架构的方法是什么?

想象一个假设的情况,我们有一个表Person,主哈希密钥SSN.该表可能包含1000万个项目.

现在的消息是,由于身份盗窃的关键数量,这个假设国家的政府引入了另一个个人身份:唯一个人身份识别码,即UPI.

我们必须添加一个UPI列并更改Person表的模式,以便现在主哈希键是UPI.我们想要支持使用SSN的当前系统和使用UPI的新系统的一段时间,因此我们需要这两个列在Person表中共存.

亚马逊推荐的这种架构更改方式是什么?

Ale*_*kis 22

有几种方法,但首先您必须了解您无法更改现有表的架构.要获得不同的架构,您必须创建一个新表.您可以重用现有表,但结果与创建不同表的结果相同.

  1. 延迟迁移到同一个表,没有Streams.每次修改Person表中的条目时,使用UPI而不是SSN作为哈希键的值在Person表中创建一个新项,并删除在SSN键入的旧项.这假设UPI从不同于SSN的值范围中提取.如果SSN看起来像XXX-XX-XXXX,那么只要UPI具有与SSN不同的位数,那么您将永远不会有重叠.
  2. 使用Streams延迟迁移到同一个表.当流通常可用时,您将能够为您的Person表启用Stream.使用NEW_AND_OLD_IMAGES流视图类型创建流,并且每当您检测到对Person表中的现有人添加UPI的项的更改时,创建一个Lambda函数,该函数删除在SSN处键入的人并添加具有相同权限的人属于UPI的属性.此方法具有可通过向项添加原子计数器版本属性并在版本属性上调节DeleteItem调用来减轻竞争条件.
  3. 使用Streams抢占(脚本)迁移到不同的表.运行扫描表的脚本,并为Person表中的每个Person项添加唯一的UPI.使用NEW_AND_OLD_IMAGES流视图类型在Person表上创建一个流,并为该流订阅一个lambda函数,当lambda函数检测到具有UPI的Person已更改或Person有一个人时,该函数将所有新人写入新的Person_UPI表中UPI补充道.基表上的突变通常需要数百毫秒才能作为流记录显示在流中,因此您可以对应用程序中的新Person_UPI表进行热故障转移.拒绝请求几秒钟,在此期间将应用程序指向Person_UPI表,然后重新启用请求.

  • 固定ITIN-> SSN (2认同)

Abh*_*han 14

DynamoDB流使我们能够在不停机的情况下迁移表.我这样做非常有效,我遵循的步骤是:

  1. 创建一个新表(让我们称之为NewTable),使用所需的密钥结构,LSI,GSI.
  2. 在原始表上启用DynamoDB Streams
  3. 将Lambda与Stream关联,将记录推送到NewT​​able.(这个Lambda应该在步骤5中修剪迁移标志)
  4. [ 可选 ]在原始表上创建GSI以加速扫描项目.确保此GSI仅具有以下属性:主键和迁移(请参阅步骤5).
  5. 扫描在上一步(或整个表)中创建的GSI并使用以下过滤器:

    FilterExpression ="attribute_not_exists(已迁移)"

使用migrate标志更新表中的每个项目(即:"Migrated":{"S":"0"},将其发送到DynamoDB Streams(使用UpdateItem API,以确保不会发生数据丢失).

注意:您可能希望在更新期间增加表中的写入容量单位.

  1. Lambda将获取所有项目,修剪Migrated标志并将其推入NewTable.
  2. 迁移完所有项目后,将代码重新指定给新表
  3. 删除原始表,Lambda函数一旦开心就好了.

遵循这些步骤应确保您没有数据丢失且没有停机时间.

我在我的博客上记录了这一点,并提供了协助代码:https: //www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/

  • 哇。与关系数据库或 mongodb 中的迁移相比,上面有很多专门的机制可以在其他持久性框架中做一些非常简单的事情。顺便说一句,您是否正在对新填充的表或旧表进行新的写入/更新?什么时候你知道你已经完成了? (7认同)
  • 你好,你能更新给定的链接吗?它下来了。还是谢谢你的回答!! (4认同)