Как перенести данные Dynamodb при серьезном изменении таблицы?

В процессе разработки структуры и требования меняются. Необходимо изменить настройки ключа и индекса, что может нарушить добавочное обновление таблицы. Итак, мое решение до сих пор состоит в том, чтобы удалить таблицу и воссоздать ее из стека cloudformation.

Но как решить эту проблему при развертывании в продакшене? Можно ли автоматизировать развертывание Dynamodb следующим образом?

  1. Создать новую таблицу
  2. Перенести данные из старой таблицы в новую таблицу
  3. Удалить старую таблицу

person nenTi    schedule 03.05.2017    source источник


Ответы (1)


Да, автоматизировать такую ​​структуру развертывания вполне возможно. Пока у вас есть код для создания таблицы, должно быть довольно просто получить все данные из старой таблицы, изменить данные, а затем загрузить все это в новую таблицу без каких-либо потерь времени безотказной работы. Если вы напишите, на каком языке вы хотели бы сделать это, я могу помочь немного больше.

Я делал это раньше и добавил ниже небольшой обобщенный пример кода о том, как вы могли бы сделать это на 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());
    }
}

Я просматривал всю таблицу и помещал все содержимое в список, а затем отображал этот список, преобразовывая объекты в ваш новый тип, а затем создавал новую таблицу этого типа, но с другим именем, проталкивал все ваши новые объекты, а затем удалите старую таблицу после переключения любых ссылок, которые у вас могут быть из старой таблицы, на новую. К сожалению, это означает, что все, что потребляет ваши таблицы, должно иметь возможность переключаться между двумя промежуточными таблицами.

person John Gallagher    schedule 04.05.2017
comment
Я использую конечную точку javascript и хотел бы глубже изучить эту тему. Разве это не должно быть общей проблемой с общим решением AWS, предоставленным для нее? - person nenTi; 05.05.2017
comment
Я не думаю, что есть какие-либо документы AWS о том, как это сделать (особенно в javascript), но я изучу это и постараюсь вернуться к вам довольно скоро. - person John Gallagher; 05.05.2017