Read replicas на собеседовании системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем read replicas

Primary handles writes. Replicas — reads.

Reads dominate (95% queries) → distribute load.

Scale read capacity. Take pressure off primary.

Replication lag

Replicas behind primary — milliseconds, sometimes seconds.

Time T: write to primary.
Time T+50ms: replica catches up.

Stale reads. If user reads replica между T и T+50ms — sees old data.

Lag growing. Replica overloaded или network slow. Monitor pg_stat_replication.

Read-your-writes

User writes — immediately wants read it.

Problem. Write goes к primary. Read goes к replica → maybe stale → user sees old value.

Solutions:

  • Sticky session. Recently-written user reads from primary для N seconds.
  • Causality tracking. Note timestamp write, ensure replica caught up.
  • Read from primary для that user temporarily.
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Routing strategies

Application-level. App sends reads / writes к different connection pools.

read_db = create_engine("postgres://replica:5432/...")
write_db = create_engine("postgres://primary:5432/...")

Proxy. Connection pooler (pgbouncer / pgcat) routes.

Tools. PgBouncer + Patroni для primary failover.

Application logic часто complex. ORMs (SQLAlchemy, Django) поддерживают routing decorators.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на documentation Postgres / MySQL replication.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.