Миграция таблицы DynamoDB - Советы по синхронизации данных? - PullRequest
0 голосов
/ 06 марта 2019

Моя команда переносит несколько разных таблиц DynamoDB в набор из двух таблиц DynamoDB. По сути, мы меняем модель и объединяем большую часть данных в две таблицы (сейчас они распределены по 6).

Мы рассматривали вопрос об использовании потоков DynamoDB и о том, чтобы те запускали лямбду, которая имеет дело с логикой запуска некоторого API, который записывает в новые таблицы. Тем не менее, я пытаюсь выяснить, как работать с старыми данными, так как нам придется перенести все, что уже находится в таблице, в новые таблицы.

Я предполагаю, что один из вариантов - запустить что-то, что сканирует каждый элемент в таблице DynamoDB (их около 100 миллионов), и для каждого вызовите тот же API, который вызывал Lambda, чтобы записать новую таблицу к. Однако я не уверен, как это сканирование старой таблицы обрабатывает, когда у нас также есть новые записи, которые довольно часто записываются в старую таблицу во время миграции.

Есть ли у кого-нибудь советы по выполнению такой миграции и синхронизации?

Спасибо!

1 Ответ

1 голос
/ 06 марта 2019

Streams & lambda - это хорошее решение (Абхай Чаухан) ...
(также видео о множестве мнений)

InВ этой ситуации попробуйте использовать DynamoDB Streams и AWS Lambda, чтобы при необходимости изменить данные.

Хороший способ реструктурировать определение таблицы - использовать триггеры DynamoDB, выполнив следующие действия:

  1. Создать новую таблицу (назовем это NewTable) с желаемой структурой ключей, LSI, GSI.

  2. Включить потоки DynamoDB в исходной таблице

  3. Свяжите лямбда-поток с потоком, который помещает запись в NewTable.(Эта лямбда должна обрезать флаг миграции на шаге 5)
  4. [ Необязательно ] Создайте GSI на исходной таблице, чтобы ускорить сканирование элементов.Убедитесь, что этот GSI имеет только атрибуты: первичный ключ и перенастроенный (см. Шаг 5).
  5. Сканирование GSI, созданного на предыдущем шаге (или всей таблицы), и используйте следующий фильтр: FilterExpression = "attribute_not_exists (Migrated)Msgstr "Обновить каждый элемент в таблице с помощью флага миграции (т. Е." Migrated ": {" S ":" 0 "}, который отправляет его в потоки DynamoDB (используя API UpdateItem, чтобы гарантировать отсутствие потери данных).

ПРИМЕЧАНИЕ Возможно, вы захотите увеличить единицы емкости записи в таблице во время обновлений.

Лямбда соберет все элементы, обрежет флаг Migrated и вставит его в NewTable. Как только все элементы будут перенесены, переназначьте код в новую таблицу Удалить оригиналтаблица, и лямбда-функция однажды довольна, все хорошо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...