Этим утром я занимался обновлением базы данных PostgreSQL на AWS RDS. Мы хотели перейти с версии 9.3.3 на версию 9.4.4. Мы «протестировали» обновление для промежуточной базы данных, но промежуточная база данных намного меньше и не использует Multi-AZ. Оказалось, что этот тест был довольно неадекватным.
Наша производственная база данных использует Multi-AZ. В прошлом мы выполняли незначительные обновления версий, и в этих случаях RDS сначала обновит резервный режим, а затем повысит его до мастерского. Таким образом, единственное время простоя составляет ~ 60 с во время аварийного переключения.
Мы предполагали, что то же самое произойдет и при обновлении основной версии, но как же мы ошиблись.
Некоторые подробности о нашей настройке:
- db.m3.large
- Обеспеченный IOPS (SSD)
- 300 ГБ памяти, из которых 139 ГБ используется
- У нас были обновления ОС RDS, мы хотели сделать пакетное обновление, чтобы минимизировать время простоя
Вот события RDS, зарегистрированные во время нашего обновления:
ЦП базы данных был максимально загружен между 08:44 и 10:27. Казалось, что большую часть этого времени RDS делала снимок перед обновлением и после обновления.
Документы AWS не предупреждают о таких последствиях, хотя из их прочтения становится ясно, что очевидным недостатком нашего подхода является то, что мы не создали копию производственной базы данных в настройке Multi-AZ и пытаемся обновить ее как пробный запуск
В целом это было очень неприятно, потому что RDS предоставил нам очень мало информации о том, что он делал и как долго это могло занять. (Опять же, пробный запуск помог бы ...)
Кроме того, мы хотим извлечь уроки из этого инцидента, поэтому вот наши вопросы:
- Это нормально при обновлении основной версии на RDS?
- Если бы мы хотели сделать обновление основной версии в будущем с минимальным временем простоя, как бы мы поступили? Есть ли какой-нибудь умный способ использовать репликацию, чтобы сделать ее более прозрачной?
ANALYZE
по обновлению статистики решил это. Если у кого-то есть понимание этого, это тоже было бы здорово.