Як розподілити запити між кількома репліками?
Розподіл запитів між кількома репліками - це ключова частина архітектури з реплікацією, яка дозволяє розвантажити основний сервер (master) і підвищити масштабованість системи.
Ось основні підходи:
1. Балансувальник навантаження (load balancer)
Використовується програмний чи апаратний балансувальник, який спрямовує запити на читання (SELECT) до різних реплік.
Популярні рішення:
- PgBouncer, HAProxy, Pgpool-II (для PostgreSQL),
- ProxySQL (для MySQL). Балансувальник стежить за станом реплік і рівномірно розподіляє трафік. Підходить для автоматизації й високої стійкості до відмов.
2. Логіка на рівні застосунку
Застосунок сам вирішує, куди відправляти запит. Наприклад:
- усі записи (
INSERT,UPDATE,DELETE) ідуть на master; - усі
SELECT-запити - випадковим чином чи циклічно на одну з реплік. Плюс: гнучкість. Мінус: ускладнює код застосунку й вимагає відстежувати стан реплік.
3. DNS-балансування
Кожній репліці присвоюється той самий домен (наприклад, read-db.example.com), а DNS-сервер повертає різні IP на запити.
Плюс: простота налаштування.
Мінус: немає контролю над розподілом навантаження й часом відповіді.
4. Розумні проксі й middleware
Сучасні проксі можуть аналізувати тип SQL-запиту й автоматично спрямовувати:
- операції запису - на master,
- операції читання - на репліки. Приклад: Pgpool-II, ProxySQL.
Підсумок: На практиці найчастіше використовують PgBouncer / HAProxy / Pgpool-II, які беруть на себе маршрутизацію й балансування читання між репліками, забезпечуючи при цьому стійкість до відмов і прозорість для застосунку.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.