Как переключать базы данных с помощью AWS / RDS в пакетном процессе и избежать простоев? - PullRequest
0 голосов
/ 08 июня 2019

Для внутреннего использования у нас есть веб-приложение на экземпляре EC2, которое считывает (без записи) данные из базы данных RDS / Postgres.В течение части дня генерируются новые данные для этой базы данных (пакетный процесс, который выполняется в течение ~ 2 часов), и данные записываются прямо в одну и ту же базу данных, что приводит к простоям приложения (~ 2 часа) до полной записи данных..

Что может быть полезным в AWS / EC2 / RDS для управления подобной ситуацией, чтобы не допустить простоя приложения, а также иметь возможность отката к предыдущей версии и, конечно, не переходить нановая версия, если какая-либо ошибка происходит во время пакетного процесса?

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Я хотел бы рассмотреть возможность использования снимков RDS для этого. У вас будет доступный для записи «основной» экземпляр RDS (или «золотой» образ, если хотите), и у вас будет обновленный экземпляр RDS только для чтения, который вы запрашиваете.

Пример процесса может выглядеть так:

  • Убедитесь, что у вас есть запись псевдонима CNAME (через маршрут 53) в размещенной зоне (с разрешением DNS в VPC), чтобы указывать на текущий экземпляр RDS только для чтения (на имя, которое вы видите в Консоль RDS) - TTL, скажем, 5-60 секунд
  • сделать ETL / загрузить на мастер
  • Выполните все необходимые действия по проверке
  • Снимок главного экземпляра RDS
  • Раскрутка нового экземпляра RDS только для чтения из основного снимка
  • Измените запись псевдонима CNAME, чтобы она указала на новый экземпляр RDS только для чтения
  • Когда все клиенты базы данных приложения перешли на другой ресурс (см. Ниже), завершить работу старого экземпляра RDS только для чтения
  • Опционально остановка главного экземпляра RDS для экономии затрат - до следующей загрузки

Чтобы это работало, вам нужно будет использовать CNAME для настроек пула соединений базы данных вашего приложения и обеспечивать регулярное устаревание соединений - в идеале время жизни соединения не более чем каждые несколько минут, чтобы минимизировать время отключения. время. Также помните о кешировании DNS в некоторых приложениях. Исторически сложилось так, например, что Java по умолчанию имеет некоторое долгоживущее кэширование (которое вы можете переопределить).

Вы тоже можете автоматизировать это. Одним из вариантов будет Codepipeline.

Ваша способность «откатиться» зависит от того, сколько дней назад вы сохраняли снимки. Чтобы выполнить откат, вы создаете экземпляр RDS из данного снимка и изменяете CNAME.

Возможно, вы используете RDS Read Replica . Но я не уверен, что вы можете остановить и (пере) запустить процесс репликации для PostgreSQL - как и для MySQL - во время загрузки. Кроме того, я подозреваю, что репликация, чтобы наверстать упущенное, может вызвать головную боль (и, возможно, некоторые операторы DDL не будут реплицироваться изящно или по назначению).

0 голосов
/ 08 июня 2019

Типичные процессы ETL (Extract-Transform-Load) обычно работают следующим образом:

  • Загрузка данных в Подготовка таблиц
  • Выполнениесценарии для очистки / преобразования содержимого таблиц в формат, подходящий для создания отчетов
  • публикация таблиц для использования пользователями

На последнем шаге можно использовать TRUNCATE, а затем SELECT INTO.

. Если это слишком большое время простоя, то другой способ заключается в том, чтобы пользователи запрашивали Просмотр .Затем измените представление так, чтобы оно указывало на второй набор таблиц (которые теперь становятся «основными» таблицами).Таким образом, при каждой загрузке представление просто переключается между наборами таблиц.

...