Реплики для чтения и маршрутизация соединений
Направляйте трафик только для чтения на реплики с помощью PgBouncer или интеллектуального драйвера и учитывайте компромисс, связанный с неактуальностью данных
«Реплики для чтения и маршрутизация соединений» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужны реплики для чтения?
Рабочие нагрузки с преобладанием чтения можно перенести на реплики:
- Основной сервер обрабатывает записи
- Реплики обрабатывают большую часть чтений
- Горизонтальное масштабирование чтения без шардинга
Оговорка о согласованности в конечном счёте
Реплики отстают от основного сервера. Пользователь, только что разместивший заказ, может пока не увидеть его на реплике. Возможные решения:
- Направлять чтение после записи на основной сервер
- Дождаться, пока реплика догонит основной сервер
- Кэшировать состояние после записи в приложении
Стратегии маршрутизации
- Маршрутизация на уровне приложения — код приложения выбирает основной сервер или реплику
- Маршрутизация на уровне драйвера — JDBC, pgjdbc и pgxpool выбирают сервер с учётом основного сервера и реплик
- Маршрутизация на уровне прокси — pgpool, pgbouncer и HAProxy определяют операции чтения и записи
Маршрутизация приложения
Два пула подключений, по одному для каждой роли:
const primary = new Pool({ host: 'primary', ... });
const replica = new Pool({ host: 'replica', ... });
// reads go to replica:
await replica.query('SELECT ...');
// writes (and read-your-writes) go to primary:
await primary.query('INSERT ...');PgPool-II
Прокси-сервер, который разбирает SQL и направляет SELECT на реплики, а операции записи — на primary. Поддерживает балансировку нагрузки и пулы подключений:
# pgpool.conf
backend_hostname0 = 'primary'
backend_hostname1 = 'replica1'
load_balance_mode = onHAProxy с проверками pg_isready
HAProxy не понимает SQL, но может маршрутизировать запросы по порту: один внешний интерфейс — для записи (на primary), другой — для чтения (на реплики с проверками состояния):
frontend writes
bind *:5432
default_backend primary_pool
frontend reads
bind *:5433
default_backend replicas_pool
balance roundrobinКонечные точки AWS RDS
RDS предоставляет одну конечную точку для записи и одну для чтения, которая распределяет нагрузку между всеми репликами. Это самый простой вариант в облаке.
Учет задержки репликации
Отслеживайте задержку и не направляйте запросы на реплики, которые слишком сильно отстают:
-- On primary:
SELECT client_addr, replay_lag FROM pg_stat_replication;
-- HAProxy / pgpool can use a custom health check that fails if replay_lag > threshold.Шаблон закрепления сеанса
Чтобы пользователь «видел собственные записи», закрепите его сеанс за primary на N секунд после операции записи. Или сохраните LSN записи и дождитесь воспроизведения на реплике перед отправкой ответа.
Ожидание на основе LSN
После записи сохраните LSN; перед чтением с реплики дождитесь, пока реплика воспроизведет данные до этого LSN:
-- After write on primary:
SELECT pg_current_wal_lsn(); -- save this
-- Before read on replica:
SELECT pg_last_wal_replay_lsn() >= $saved_lsn;
-- spin or wait until trueКэширование в качестве реплики
Иногда Redis или Memcache выступает в роли «реплики» для масштабирования чтения — для часто запрашиваемых ключей это намного быстрее, чем еще один экземпляр PostgreSQL.
Когда НЕ следует использовать реплики
Если в вашей рабочей нагрузке преобладают операции записи, реплики в основном увеличивают расходы, не повышая скорость. Если чтение на primary уже достаточно быстрое, они могут Вам не понадобиться.
Аварийное восстановление и масштабирование чтения
Реплики для переключения при сбое HA решают другую задачу, чем реплики для масштабирования чтения. Часто используются оба типа.
Итоги
Реплики для чтения масштабируют чтение, но сопровождаются задержкой.
- Маршрутизация на уровне приложения, драйвера или прокси
- Задержка репликации = согласованность в конечном счете
- Закрепление за primary или ожидание LSN для чтения собственных записей
- Отслеживайте задержку и возвращайтесь к primary, если реплика слишком сильно отстает
Быстрая проверка
Пользователь публикует комментарий и сразу обновляет страницу. Страница читает данные с реплики и не показывает комментарий. В чем проблема и как можно ее исправить?
Часто задаваемые вопросы
Урок «Реплики для чтения и маршрутизация соединений» бесплатный?
Да — полный текст урока «Реплики для чтения и маршрутизация соединений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Реплики для чтения и маршрутизация соединений»?
Направляйте трафик только для чтения на реплики с помощью PgBouncer или интеллектуального драйвера и учитывайте компромисс, связанный с неактуальностью данных Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Реплики для чтения и маршрутизация соединений»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Потоковая репликация и WAL
- Логическая репликация для шардинга
- Переключение при сбое и выбор лидера (Patroni, Stolon)
- Реплики для чтения и маршрутизация соединений