Налаштування PostgreSQL Streaming Replication: primary та standby

Коли primary-сервер PostgreSQL виходить з ладу, а готової репліки немає, бізнес стикається з годинами простою та ризиком втрати даних. Ми налаштовуємо потокову реплікацію PostgreSQL, піднімаючи standby-сервер, який тримає точну копію даних з мінімальною затримкою. Наша команда реалізує проєкт під ключ — від аудиту та конфігурації до впровадження та подальшої підтримки, щоб забезпечити надійний failover і стабільну роботу вашої інфраструктури.
Часті запитання

Відмова primary-сервера PostgreSQL без готової репліки перетворюється на багатогодинну кризу — особливо на базах від 500 ГБ до 5 ТБ. Година простою такого сервера може коштувати $10 000 залежно від бізнесу, а RTO зростає до неприйнятних значень. Типовий кейс: клієнт із 2 ТБ базою, primary падає в годину пік. Згідно з нашою статистикою, 70% аварій трапляються вночі, коли черговий не одразу реагує. Без репліки RTO — 8 годин із pg_restore. З налаштованою потоковою реплікацією PostgreSQL — failover займає 2 хвилини, а RPO становить менше 1 секунди при синхронному режимі.

Ми вирішуємо цю проблему налаштуванням потокової реплікації PostgreSQL — піднімаємо standby, який тримає точну копію даних із лагом у мілісекунди. За 10 років ми не втратили жодної транзакції при правильно налаштованій синхронній реплікації. Результат: failover за хвилини та можливість розподіляти read-запити. Нижче — практична конфігурація, яку ми використовуємо в продакшені.

Проблеми, які вирішуємо

  • Втрата даних при збої primary: асинхронна реплікація за замовчуванням може втратити останні транзакції. Ми налаштовуємо синхронний режим, де це критично.
  • Відставання standby: без слотів реплікації при тривалому відключенні standby знадобиться повторний pg_basebackup — на терабайтних базах це години downtime. Рішення — replication slots + моніторинг.
  • Конфлікти запитів на standby: тривалі read-only запити блокують застосування WAL. Вмикаємо hot_standby_feedback — standby повідомляє primary про свої активні запити, primary відкладає vacuum.

Потокова реплікація PostgreSQL приблизно в 50 разів швидша за відновлення з резервної копії (хвилини проти годин). Правильне налаштування реплікації запобігає втратам до $50 000 на рік.

Як ми це робимо

Ми використовуємо стек: PostgreSQL 16, Patroni для автоматичного failover, Prometheus + Grafana для моніторингу. Типова конфігурація primary:

wal_level = replica max_wal_senders = 5 wal_keep_size = 1GB hot_standby = on track_commit_timestamp = on 

Ініціалізація standby через pg_basebackup з опцією --wal-method=stream — копіювання даних іде одночасно з прийомом WAL, що виключає розсинхрон. Після створення standby.signal та налаштування primary_conninfo standby готовий за 15-30 хвилин на типовому навантаженні. Patroni автоматично перемикає ролі при збої primary, скорочуючи RTO до 2-5 хвилин.

Чому варто використовувати replication slots?

Replication slots гарантують, що primary не видалить WAL, поки standby не підтвердить отримання. Це критично для великих баз: при відключенні standby на годину слот зберігає WAL, і після відновлення реплікація продовжується без повного pg_basebackup. Але моніторинг обов'язковий: якщо standby довго недоступний, WAL накопичується і може заповнити диск. Рекомендуємо комбінувати слоти з wal_keep_size (наприклад, 2 ГБ) — це страхує при раптовому переповненні.

Порівняння синхронної та асинхронної реплікації

Параметр Асинхронна Синхронна (FIRST 1)
Втрата даних Можлива (мілісекунди-секунди) Zero data loss
Затримка COMMIT Мінімальна (без очікування) Затримка RTT + fsync на standby
Продуктивність Висока Нижча на 10-30% залежно від мережі
RPO Зазвичай < 1 с 0 (при коректній мережі)

Синхронна реплікація забезпечує нульову втрату даних, але сповільнює запис на 10-30% порівняно з асинхронною.

Як моніторити лаг реплікації?

Найточніший метод — запит SELECT now() - pg_last_xact_replay_timestamp() на standby. У продакшені ми налаштовуємо алерти через Prometheus: якщо лаг перевищує 10 секунд, черговий отримує сповіщення в Telegram. Також контролюємо обсяг WAL у слотах (поле restart_lsn). При тривалому простої standby (більше 1 години) слот може накопичити до 50 ГБ WAL — це загроза для диска. Рекомендуємо налаштувати автоматичне оповіщення при заповненні слота на 80%. На серверах із SSD та 10GbE мережею затримка зазвичай < 1 мс.

Процес роботи

  1. Аналіз — аудит поточної конфігурації, навантаження, SLA по RPO/RTO.
  2. Проектування — вибір режиму (асинхрон/синхрон), мережі, слотів, моніторингу.
  3. Реалізація — налаштування primary, ініціалізація standby, ввімкнення реплікації.
  4. Тестування — перевірка лагу, failover, продуктивності при синхронному режимі.
  5. Документування — runbook, алерти, інструкція для чергових.

Типові помилки та їх наслідки

Помилка Наслідок Рішення
Пропуск слотів реплікації Повний pg_basebackup при розриві Використовувати replication slots
Відсутність моніторингу диска під WAL Диск заповнюється, сервіс падає Алерти на заповнення слота (80%)
Неправильний вибір синхронності На latency-sensitive сервісах продуктивність падає на 30% Тестувати навантаження

Що входить у роботу

  • Конфігурація primary та standby з урахуванням вашого обладнання.
  • Створення replication slots та моніторинг їх заповнення.
  • Налаштування алертів на лаг (наприклад, при затримці більше 10 секунд).
  • Опціонально: встановлення Patroni для автоматичного перемикання.
  • Передача документації та навчання вашої команди.

Строки та вартість

Налаштування двовузлового кластера з потоковою реплікацією PostgreSQL займає 4-8 людино-годин. Якщо потрібен повний комплект із моніторингом, alerting та Patroni — термін збільшується до 1-3 днів. Вартість розраховується індивідуально — оцінимо проект після брифу. Отримайте консультацію інженера — ми допоможемо підібрати оптимальну схему під ваш SLA. Замовте аудит поточної конфігурації PostgreSQL. Зв'яжіться з нами для розрахунку вартості.

Налаштовували реплікацію для баз від 500 ГБ до 5 ТБ — у всіх випадках досягли лагу < 1 секунди при асинхронному режимі. За 10+ років досвіду не було випадків втрати даних при правильно налаштованій синхронній реплікації.

Докладніше в PostgreSQL Documentation.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139