Была ли реализована отказоустойчивость в PostgreSQL
Что проверяют
Формально это вопрос об опыте, но интервьюер проверяет, понимаете ли вы, как устроена отказоустойчивость базы и что при этом должно уметь Java-приложение. Следом обычно спрашивают, что происходит с транзакциями в момент переключения и сколько данных можно потерять.
Как отвечать
Сначала честно обозначьте роль: настраивали кластер сами, работали с готовым от DBA или облака, или отвечали только за приложение. Потом каркас:
- потоковая репликация: реплики получают WAL с основного сервера. Асинхронная не тормозит запись, но при аварии теряет последние транзакции. Синхронная (
synchronous_standby_names) подтверждает коммит после записи на реплике, ценой задержки; - автоматическое переключение: сам PostgreSQL его не делает. Нужен внешний менеджер: Patroni поверх etcd или Consul, в Kubernetes оператор вроде CloudNativePG, в облаке managed-сервис;
- точка входа: HAProxy, PgBouncer или виртуальный IP, чтобы приложение не знало адрес текущего лидера;
- бэкапы и PITR: базовые копии плюс архив WAL через pgBackRest или WAL-G. Реплика бэкап не заменяет.
Со стороны Java нужна конкретика. pgJDBC принимает несколько хостов: jdbc:postgresql://db1,db2/app?targetServerType=primary. HikariCP с разумными connectionTimeout и maxLifetime быстро избавляется от мёртвых соединений. Операции должны переживать повтор: идемпотентные ключи, ретраи через Spring Retry или Resilience4j только для безопасных действий. Чтение можно уводить на реплики, помня о задержке репликации.
Если сами не настраивали, так и скажите и опишите, как это было устроено у вас и что вы проверяли со стороны приложения.
Где спотыкаются
Считают репликацию бэкапом. Ошибочный DELETE или удаление таблицы доедет до всех реплик за секунды, спасает только PITR.
Думают, что PostgreSQL сам переключится на реплику при падении основного сервера. Без Patroni или аналога реплика так и останется в режиме только для чтения.
Забывают про приложение: соединения к старому лидеру висят, транзакции падают, а повтор неидемпотентной операции списывает деньги дважды.