如何在主要 table 更改时迁移 dynamodb 数据?
How to migrate dynamodb data on major table change?
在开发结构和需求发生变化的过程中。需要更改键和索引设置,这可能会破坏增量 table 更新。所以到目前为止,我的解决方案是删除 table 并从 cloudformation 堆栈重新创建它。
但是如何通过生产部署解决这个问题呢?是否可以按如下方式自动化 dynamodb 部署?
- 新建table
- 将数据从旧 table 迁移到新 table
- 删除旧的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 之间切换。
在开发结构和需求发生变化的过程中。需要更改键和索引设置,这可能会破坏增量 table 更新。所以到目前为止,我的解决方案是删除 table 并从 cloudformation 堆栈重新创建它。
但是如何通过生产部署解决这个问题呢?是否可以按如下方式自动化 dynamodb 部署?
- 新建table
- 将数据从旧 table 迁移到新 table
- 删除旧的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 之间切换。