Миграция PostgreSQL на AWS Aurora

Дано 2 железки, на каждой PostgreSQL 9.6, на одной общий размер баз около 100гб, из всех выделяются 2 на 70гб и 20гб, второй хост мелкий, сумарно бд около 6гб. Цель - перенести все на Aurora и "снять" управление/бекапы с админов, освободившиеся инстансы выкинуть. Было известно, что для переноса есть такой сервис как AWS Database Migration Service, позволяющий переносить данные с последующей репликацией. Однако, сам AWS DMS переносит только данные - sequences/view/triggers и тп не будут перенесены, для этого есть AWS Schema Conversion Tool.
В случае с большими базами алгоритм следующий:
  1. Создаем нужные бд
  2. Запускаем DMS в режиме репликации, для этого должен быть создан инстанс посредник, который берет из источника и кладет в место назначения, скрипт для этого дела тут
  3. Выставляем MT и тушим приложение
  4. Переносим мелкие бд через pg_dump, я для этого написал скриптик
  5. Запускаем последующий скрипт, который выставляет права на все объекты
  6. Меняем в приложении как обращаться к бд
  7. Запускаем приложение
В случае же мелких бд все прекрасно переносится через обычный pg_dump, как и рекомендует AWS (Use native PostgreSQL database migration tools).
  1. Выставляем MT
  2. Запускаем скрипт который переносит все бд
  3. Меняем в приложении как обращаться к бд
  4. Запускаем приложение
На большой бд downtime составил 30 мин, из которых 10 раскатывался ansible, во втором простой составил 20 мин.
Теперь подробней о моих костылях:
migrate_pgsql2aurora_cdc.sh
Скрипт должен содержать информацию о подключении к бд исходнике и назначении, пользователь должен иметь все необходимые права.
Должен быть создана реплика инстанс с именем replication-instance-1, так же есть проблема с тем что один инстанс для переноса может запускать лимитированое количество задач.
Все базы которые необходимо перенести должны быть указаны в файле db_list.
На каждую базу создается по 2 endpoint'a один на src, второй на dst, после создается задача репликации, у которой есть откуда и куда, а так же хост, он же реплика инстанс.
Плюс ко всему есть несолько типов миграции:
  • full-load - Только миграция
  • cdc - Репликация, при наличии всех данных
  • full-load-and-cdc - Миграция с последующей репликацией.
Так же должно быть 2 файла:
task-settings.json
table-mappings.json
В первом указаны параметры, так же не забываем про LOB'ы из коробки, они ограничены и есть шанс получить невалидные данные, которые просто обрежутся, советую почитать про параметры данного файла. Из полезного это валидация, LOB'ы и логирование, если установлен FullLobMode, то перенос займет значительное время.
Во втором какие схемы/таблицы переносить. Плюс надо удостовериться что replica instance сможет достучаться как до исходника так и до назначения, а так же в пункте назначения должны быть созданы бд.
pg_backup_copy.sh
Данный файл запускать на хосте источнике, дергает все бд и начинает заливать.
set_owner.sh
Смена владельца на таблицах, sequences и view
Список баз на которые необходимо установить права в файле db_list, из которого по циклу применяются изменения, в моем случае имя пользователя у каждого сервиса с приставкой _user