3
在开发过程中结构和要求发生变化。密钥和索引设置需要更改,这可能会破坏增量表更新。所以我的解决方案到目前为止是删除表并从cloudformation堆栈重新创建它。如何迁移主要表更改的dynamodb数据?
但是如何用生产部署来解决这个问题?是否有可能如下自动化dynamodb部署?
- 创建新表从旧表
- 将数据迁移到新表
- 删除旧表
在开发过程中结构和要求发生变化。密钥和索引设置需要更改,这可能会破坏增量表更新。所以我的解决方案到目前为止是删除表并从cloudformation堆栈重新创建它。如何迁移主要表更改的dynamodb数据?
但是如何用生产部署来解决这个问题?是否有可能如下自动化dynamodb部署?
是的,这是完全有可能实现自动化这样的部署结构。只要您有创建表的代码,从旧表中获取所有数据,更改数据,然后将其全部上传到新表,而不会在正常时间内丢失,这应该相当简单。如果你写什么语言你想做这样的事情,我可以帮助更多。
我已经完成了这项工作,我已经在下面添加了一个关于如何在Java中执行此操作的小型代码示例。
Java方法创建给定的类存储在发电机对象类型的表:
/**
* 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方法来删除表:
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());
}
}
我会扫描整个表和放下所有的内容转换为List,然后通过该列表进行映射,将对象转换为新的类型,然后创建一个新类型的表,但名称不同,将所有新对象推入,然后删除旧表切换您对旧表格的任何引用到新的一个。不幸的是,这意味着消耗桌子的所有东西都需要能够在两个登台桌面之间切换。
我正在使用JavaScript端点,并且有兴趣深入探究此主题。这不应该是为它提供的通用AWS解决方案的常见问题吗? – nenTi
我不认为有关于如何做到这一点的任何AWS文档(特别是在JavaScript中),但我会研究它,并尽快找到你。 –