0Pricing
SQL Academy · Урок

Реплики для чтения и маршрутизация соединений

Направляйте трафик только для чтения на реплики с помощью PgBouncer или интеллектуального драйвера и учитывайте компромисс, связанный с неактуальностью данных

«Реплики для чтения и маршрутизация соединений» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Зачем нужны реплики для чтения?

Рабочие нагрузки с преобладанием чтения можно перенести на реплики:

  • Основной сервер обрабатывает записи
  • Реплики обрабатывают большую часть чтений
  • Горизонтальное масштабирование чтения без шардинга

Оговорка о согласованности в конечном счёте

Реплики отстают от основного сервера. Пользователь, только что разместивший заказ, может пока не увидеть его на реплике. Возможные решения:

  • Направлять чтение после записи на основной сервер
  • Дождаться, пока реплика догонит основной сервер
  • Кэшировать состояние после записи в приложении

Стратегии маршрутизации

  1. Маршрутизация на уровне приложения — код приложения выбирает основной сервер или реплику
  2. Маршрутизация на уровне драйвера — JDBC, pgjdbc и pgxpool выбирают сервер с учётом основного сервера и реплик
  3. Маршрутизация на уровне прокси — 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 = on

HAProxy с проверками 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 — локальная установка не требуется.

Все уроки этого курса

  1. Потоковая репликация и WAL
  2. Логическая репликация для шардинга
  3. Переключение при сбое и выбор лидера (Patroni, Stolon)
  4. Реплики для чтения и маршрутизация соединений
← Назад к SQL Academy