如何在主要 table 更改时迁移 dynamodb 数据?

How to migrate dynamodb data on major table change?

在开发结构和需求发生变化的过程中。需要更改键和索引设置,这可能会破坏增量 table 更新。所以到目前为止,我的解决方案是删除 table 并从 cloudformation 堆栈重新创建它。

但是如何通过生产部署解决这个问题呢?是否可以按如下方式自动化 dynamodb 部署?

  1. 新建table
  2. 将数据从旧 table 迁移到新 table
  3. 删除旧的table

是的,完全有可能使这种部署结构自动化。只要您有创建 table 的代码,从旧 table 获取所有数据、更改数据,然后将其全部上传到新 table 应该相当简单=] 正常运行时间没有任何下降。如果你想用什么语言来做这样的事情,我可以提供更多帮助。

我以前做过,我在下面添加了一个小的通用代码示例,说明如何在 Java 中执行此操作。

Java 给定存储在 dynamo 中的对象类型的 class 创建 table 的方法:

 /**
 * Creates a single table with its appropriate configuration (CreateTableRequest)
 */
public void createTable(Class tableClass) {
    DynamoDBMapper mapper = createMapper(); // you'll need your own function to do this.

    ProvisionedThroughput pt = new ProvisionedThroughput(1L, 1L);
    CreateTableRequest ctr = mapper.generateCreateTableRequest(tableClass);
    ctr.withProvisionedThroughput(new ProvisionedThroughput(1L, 1L));

    // Provision throughput and configure projection for secondary indices.
    if (ctr.getGlobalSecondaryIndexes() != null) {
        for (GlobalSecondaryIndex idx : ctr.getGlobalSecondaryIndexes()) {
            if (idx != null) {
                idx.withProvisionedThroughput(pt).withProjection(new Projection().withProjectionType("ALL"));
            }
        }
    }

    TableUtils.createTableIfNotExists(client, ctr);
}

Java删除方法table:

private static void deleteTable(String tableName) {
    AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
    DynamoDB dynamoDB = new DynamoDB(client);
    Table table = dynamoDB.getTable(tableName);
    try {
        System.out.println("Issuing DeleteTable request for " + tableName);
        table.delete();
        System.out.println("Waiting for " + tableName + " to be deleted...this may take a while...");
        table.waitForDelete();

    }
    catch (Exception e) {
        System.err.println("DeleteTable request failed for " + tableName);
        System.err.println(e.getMessage());
    }
}

我会扫描整个 table 并将所有内容放入一个列表中,然后通过该列表进行映射,将对象转换为您的新类型,然后创建一个新的 table该类型但名称不同,推送所有新对象,然后在将旧 table 的任何引用切换到新对象后删除旧 table 。不幸的是,这确实意味着消耗您的 table 的所有内容都需要能够在您的两个暂存 table 之间切换。