Репликация и отказоустойчивость PostgreSQL
Вопрос
Расскажите, как устроить отказоустойчивый PostgreSQL для продакшена: репликация, переключение, чтение с реплик.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Потоковая физическая репликация: мастер и одна-две реплики, слоты репликации
Асинхронная против синхронной: потеря последних транзакций против задержки коммита, кворум `ANY 1 (...)`
Автоматическое переключение через Patroni (или аналог) с хранилищем консенсуса, защита от split brain
Приложение ходит через единую точку входа (VIP, HAProxy, DNS), умеет переподключаться
Чтение с реплик: лаг, read-your-writes, отмена долгих запросов на реплике и `hot_standby_feedback`
Бэкапы отдельно от реплик: базовый бэкап плюс архив WAL, PITR, регулярная проверка восстановления
Что могут спросить следом
- Что такое split brain и как его избегают?
- Почему реплика не заменяет бэкап?
- Зачем слоты репликации и чем они опасны?
Разбор
База: потоковая физическая репликация с мастера на две реплики в разных зонах. Слоты репликации гарантируют, что мастер не удалит WAL, нужный реплике, но если реплика пропала, слот копит WAL и может заполнить диск, так что за ним следят и задают max_slot_wal_keep_size. Асинхронный режим быстрый, но при аварии теряются последние транзакции; синхронный с кворумом ANY 1 (r1, r2) не теряет подтверждённое, но добавляет задержку на коммит. Переключение автоматизирую Patroni: он держит лидерство через etcd или Consul, при падении мастера поднимает самую свежую реплику и не даёт двум узлам одновременно считать себя мастером (split brain). Приложение ходит через единую точку (HAProxy с проверкой роли, VIP) и умеет переподключаться и повторять идемпотентные операции. Чтение с реплик даёт масштаб, но надо помнить о лаге и о конфликтах: долгие запросы на реплике отменяются при применении WAL, а hot_standby_feedback спасает их ценой раздувания на мастере. И отдельно бэкапы: реплика честно повторит DROP TABLE, поэтому нужны базовые бэкапы с архивом WAL (pgBackRest, WAL-G), восстановление на момент времени и регулярные учения по восстановлению.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.