Три задачи discovery при работе с PostgreSQL master/replica — и как их решить
krylosov-aa 12 минут назад Три задачи discovery при работе с PostgreSQL master/replica — и как их решить Простой 17 мин 321 PostgreSQL * Python * Базы данных * Высоконагруженные системы * Веб-разработка * Туториал Когда...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. krylosov-aa 12 минут назад Три задачи discovery при работе с PostgreSQL master/replica — и как их решить Простой 17 мин 321 PostgreSQL * Python * Базы данных * Высоконагруженные системы * Веб-разработка * Туториал Когда у приложения появляется несколько хостов PostgreSQL, начинается головная боль: нужно динамически находить мастера после failover, выбирать реплику с нужным отставанием и гарантировать что пользователь не увидит устаревшие данные после своей же записи. DNS кешируется минутами, libpq не знает про lag, HAProxy не слышал про LSN. Разбираем как устроены существующие решения и как закрыть все три задачи через лёгкий HTTP сервис — pg-status.
Мастер и реплики PostgreSQLВ жизни приложений часто наступает момент, когда одного хоста PostgreSQL не достаточно. Я выделю основные две причины:УстойчивостьОдин хост может упасть или стать недоступным по сети. Если в приложении всего один хост PostgreSQL — это может означать полный отказ приложения.
Технические детали
Чтобы переживать отказ одного из хостов, поднимают несколько хостов по схеме мастер-реплика. Эта схема означает: есть один мастер-хост, который принимает пользовательские запросы на запись. И есть один или несколько хостов-реплик, которые принимают только пользовательские запросы на чтение.
Данные на реплику попадают через потоковую репликацию (streaming replication): реплика подключается к мастеру и непрерывно воспроизводит его WAL-журнал (Write-Ahead Log) — лог всех изменений данных, который PostgreSQL ведёт на мастере. Из этого сразу следует важное свойство: реплика всегда немного отстаёт от мастера. Между фиксацией транзакции на мастере и её воспроизведением на реплике есть задержка — она называется replication lag.
Обычно это миллисекунды, но при высокой нагрузке или сетевых проблемах может вырасти до секунд и больше. Это нормально и ожидаемо — именно поэтому важно понимать, насколько реплика отстаёт, прежде чем читать с неё. В такой схеме мастер может стать недоступным, но можно назначить одну из реплик новым мастером — и приложение переживёт этот инцидент.
Отраслевые последствия
Это называется failover. Важно: сам по себе failover не происходит автоматически — его нужно организовать. Для этого существуют инструменты оркестрации, которые следят за состоянием кластера и при падении мастера автоматически выбирают новый из числа реплик и перенастраивают репликацию.
Без такого инструмента переключение придётся делать вручную. Даже без failover, если приложение читает с реплик, можно продолжать обслуживать read-only функциональность пока мастер недоступен. Пропускная способностьПриложение может стать настолько нагруженным, что узким горлышком становится PostgreSQL-хост.
Это не распределённая СУБД, и её непросто масштабировать горизонтально. Но в большинстве приложений 80–90% запросов к базе данных — это чтение. Если направить их на реплики, мастер разгружается именно там где больно: CPU на обработку запросов и I/O на чтение данных с диска.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




