Налаштування PostgreSQL високої доступності через repmgr

Кластер на одній машині працює рівно до першого збою, а позаплановий простій коштує дорожче за планове оновлення. Ми налаштовуємо PostgreSQL високої доступності під ключ: проєктуємо схему реплікації, перевіряємо перемикання на живому контурі й передаємо регламенти. Заміри до та після показують, у скільки разів скорочується час простою.
Часті запитання

Налаштування PostgreSQL HA: де саме ламається відмовостійкість

Відмовостійкість бази даних не з'являється від того, що поруч з основним сервером поставили другий. Формально репліка є, потік змін іде, але команду на перемикання віддає черговий інженер — і все впирається в те, хто першим помітив проблему о четвертій ранку.

Налаштування PostgreSQL HA починається не зі встановлення пакетів, а з чесного переліку точок відмови кластера: що саме перестане працювати, якщо вузол вийде з ладу.

Падіння основного вузла рідко буває єдиною проблемою.

Порядок перемикання, кворум і керуючий вузол — такі самі точки відмови: за ручного перемикання вузла простій розтягується на час реакції чергового, а автоматика без узгодження ризикує тим, що два вузли одночасно оголосять себе головними. Розбіжні дані відновлювати довше, ніж перечекати саму відмову.

Третя точка — репліка, про яку ніхто не знає. Вона відстає за затримкою реплікації, на ній давно не вистачає місця під журнали, а готовність до підвищення ніхто не перевіряв. Поки основний тримається, цього не видно.

У годину пік падіння основного розкриває, що на резервному вузлі немає частини останніх змін, а привести його в робочий стан швидко не вдасться.

Розбираємо, як це закривається: узгодження замість ручного перемикання, регулярна перевірка придатності реплік до підвищення, контроль затримки та запасу місця під журнали — плюс інструмент на кшталт repmgr, який бере на себе перемикання ролей і веде історію змін топології кластера.

Що дає відмовостійкий PostgreSQL на практиці

Відмовостійкий кластер PostgreSQL змінює не стільки архітектуру, скільки характер експлуатації: перемикання на резервний вузол перестає бути аварійною нічною операцією.

repmgr стежить за станом вузлів і в разі втрати лідера піднімає репліку автоматично — застосунок повертається до роботи за десятки секунд, а не за десятки хвилин ручного розбору.

Клас усунених відмов — те, що раніше гарантовано зупиняло сервіс: падіння вузла, відмова диска, обрив зв'язку між майданчиками, завислий процес бази.

Кожен такий випадок вимагав ручного втручання; тепер типові сценарії закриває автоматика, а черговий отримує повідомлення вже за фактом відновлення.

Під навантаженням важливо не просто підняти резерв, а не втратити підтверджені транзакції.

Режим синхронної реплікації з кворумом зберігає їх мінімум на двох вузлах ціною невеликого зростання затримки запису; параметр підбирається під профіль навантаження, а читальні запити йдуть на репліки й розвантажують лідера.

Доступність бази даних стає вимірюваною часткою часу, а не обіцянкою. Арбітражний вузол захищає від розщеплення кластера під час розділення мережі, колишній лідер повертається в стрій без перезбирання, моніторинг показує відставання реплік та історію перемикань. Перевіряємо це тренуваннями: гасимо вузол під навантаженням і фіксуємо фактичний час відновлення.

Варіанти відмовостійкого кластера: порівняння режимів

Вибір схеми визначається не «бажанням надійності», а допустимим часом простою і тим, чи готовий бізнес втратити останні транзакції. Нижче — чотири схеми, між якими реально обирають, та їхня ціна в термінах перемикання й збереження даних.

Відмінності зводяться до трьох питань: де лежить копія, хто підтверджує запис і хто ухвалює рішення про перемикання.

Синхронна реплікація дає нульову втрату підтверджених транзакцій, але зростає час відповіді; асинхронна тримає швидкість, зате в разі відмови ведучого частина останніх записів може не дійти до резерву.

Варіант Коли підходить Обмеження
Один вузол + резервні копії Невелике навантаження, простій у межах години допустимий Відновлення — від хвилин до годин, точка втрати — момент останньої копії
Два вузли + вузол-арбітр Потрібен автоматичний режим перемикання без ручного втручання Арбітр дані не зберігає, він лише голосує: у разі розділення мережі можливий неправильний вибір
Синхронна реплікація Втрата транзакцій неприпустима: платежі, склад, фінанси Зростає затримка відповіді, у разі відмови резерву запис блокується або деградує
Асинхронна реплікація Пріоритет — швидкість відгуку, втрата секунд даних прийнятна Останні підтверджені записи можуть не дійти до резерву в разі відмови ведучого

Схеми комбінують: синхронний резерв у сусідній зоні доступності плюс асинхронний — у віддалений центр. Вузол-арбітр дані не зберігає, він лише бере участь у голосуванні під час перемикання, тому під нього достатньо мінімальної машини — у repmgr це окрема роль вузла-свідка.

Порядок упровадження: аудит, схема, реплікація, перевірка

Кластер високої доступності — це не пакети, встановлені на кількох серверах, а послідовність перевірок, де кожен крок підтверджується фактом: роллю вузла, станом потоку реплікації, результатом перемикання. Нижче — порядок робіт, за яким ми йдемо.

  1. Аудит конфігурації бази. Дивимося версію та збірку, режим журналу попереднього запису, наявні репліки, стан резервних копій і профіль навантаження. На виході — перелік вузьких місць і рішень щодо топології.
  2. Проєктування топології. Визначаємо кількість вузлів, потребу в кворумному свідку, де допустима асинхронна реплікація, а де обов'язкова синхронна, і які відмови кластер має переживати без ручного втручання.
  3. Налаштування реплікації. Піднімаємо резервні вузли, вмикаємо потокову передачу журналу, задаємо політики підтвердження запису й ліміт відставання — втрата сервера не повинна означати втрату вже підтверджених даних.
  4. Автоматичне перемикання. Налаштовуємо repmgr: стеження за ролями, підвищення резервного вузла, захист від розщеплення в разі втрати зв'язку між майданчиками, метрики й оповіщення про лаг і зміну ролі.
  5. Перевірка перемикання. Виконуємо планове перемикання та імітацію аварії основного вузла, заміряємо час відновлення сервісу, звіряємо дані після підвищення репліки. Без цієї перевірки кластер не можна вважати готовим.
  6. Передача в експлуатацію. Віддаємо схему топології, регламент перемикань і оновлень, інструкцію для чергової зміни та порядок дій у нештатній ситуації — щоб черговий відрізняв штатний лаг від деградації без дзвінка інженеру.

Що передаємо на руки: конфігурації, схеми, регламенти

Артефакти передаємо в репозиторії, а не «на словах»: кожен файл версіонується, зміни проходять рев'ю, а розгортання відтворюється на чистому середовищі. Нижче — комплект, який закриває і повсякденну роботу, і нічний інцидент, коли черговий інженер уперше бачить кластер.

  • Конфігурації вузлів: параметри PostgreSQL, керування перемиканням і таймаутів — окремо для основного та резервного вузла, з поясненням до кожного нестандартного значення.
  • Схема кластера: топологія, ролі вузлів, порядок просування резерву, точки відмови та їхній зв'язок із мережевою сегментацією.
  • Правила доступу: ролі та привілеї в базі, доступ до моніторингу й логів реплікації, порядок надання та відкликання прав.
  • Регламент відновлення: покрокові сценарії перемикання в разі відмови основного вузла, повернення вузла в стрій і відновлення з резервної копії — з контрольними точками та очікуваним часом.
  • Інструкція для чергової зміни: що перевіряти на початку зміни, яке відставання реплікації вважати тривожним, кому й як ескалювати.
  • Карта моніторингу: які перевірки налаштовані, на що спрацьовує оповіщення, як відрізнити хибне спрацювання від реальної деградації.
  • Протокол тренувань: план перевірки перемикання, журнал прогонів і результати — відмова не повинна перевірятися вперше в бою.

Документація живе разом із конфігурацією: якщо правило змінили в кластері, але не у файлі — це дефект, який закривається на рев'ю.

Як скоротили простій: заміри до та після на живому кластері

До: кожен збій будив чергового

Кластер із трьох вузлів жив на ручному перемиканні: майстер падав уночі, черговий інженер підключався, дивився журнали реплікації, піднімав репліку в режимі майстра, правив точки підключення в застосунку й лише потім перевіряв, що дані не розійшлися.

Відновлення займало від 40 до 70 хвилин, а в разі розсинхронізації копій розтягувалося до кількох годин — паралельно доводилося вручну звіряти відсталі записи.

Окрема ціна такої схеми — людський фактор. Порядок дій тримався в голові чергового та в інструкції на вікі; одна пропущена команда призводила до того, що застосунок ішов писати в старий майстер після його повернення.

Після: перемикання за десятки секунд

Ми поставили repmgr поверх потокової реплікації: менеджер стежить за станом вузлів, сам підвищує репліку до майстра й розсилає іншим нову топологію.

Застосунок підключається за рядком із переліком хостів і перепідключається на живий вузол без правки конфігурації та без перезапуску.

Метрика До Після
Тривалість простою 40–70 хвилин 20–40 секунд
Збої, закриті без чергового поодинокі 9 із 10
Втрата підтверджених записів можлива виключена

Синхронна реплікація закрила залишковий ризик: транзакція вважається завершеною лише після підтвердження від копії, тому перемикання не відкочує вже прийняті замовлення.

Раз на квартал проводимо тренування — примусово гасимо майстер і звіряємо фактичний час перемикання з цільовим.

Що робити, якщо кластер уже розгорнуто на одній машині?

Наявний кластер на одній машині — це контур без репліки: відмова диска закривається відновленням із копії, тобто годинами недоступності.

Міграція без простою такого контуру можлива, але починати її з перемикання ролі не можна — спочатку будується другий вузол, і лише потім роль основного передається. Порядок робіт якраз і визначає, скільки сервіс стоїть на паузі.

Першим кроком — винесення репліки: на другому сервері розгортається копія вузла, вмикається потокова реплікація, вузол реєструється в repmgr як резервний. Основний продовжує приймати запис, ми стежимо за відставанням до нуля.

На третьому, найдешевшому вузлі піднімається арбітр: дані він не зберігає, але бере участь у голосуванні й не дає двом вузлам одночасно вважати себе головними в разі втрати зв'язку між ними.

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

Застосунок підключається через пул з'єднань або віртуальну адресу, тому розрив в обслуговуванні вимірюється секундами, а не хвилинами.

Далі колишній основний стає резервним, а в регламент додаються контроль відставання, резервне копіювання та планові тренування з перемикання — щоб наступна відмова відпрацьовувалася автоматично, без ручних рішень у момент аварії.

Технічні сумніви: реплікація, перемикання, відновлення

Сумніви на цьому етапі передбачувані: як поводитиметься репліка в разі розходження з майстром, хто ухвалює рішення в разі втрати зв'язку між вузлами, чим підтверджується працездатність перемикання.

Нижче — механізми, а не обіцянки: усе описане перевіряється на стенді до виведення кластера в робочий контур.

Репліка розійшлася з майстром — що тоді?

Вузол, що розійшовся, не підвищується до майстра: він позначається зламаним і виводиться з ротації. Повертаємо його через pg_rewind, а в разі глибокого розходження — перестворюємо з базової копії. Кластер увесь цей час працює на поточному майстрі.

Навіщо в кластері арбітр?

Третій вузол без даних бере участь у голосуванні й не дає двом вузлам одночасно вважати себе майстром у разі обриву зв'язку між ними. Без арбітра автоматичне підвищення за невизначеності вимикається, і рішення ухвалює інженер — це усвідомлений вибір, а не відмова.

Як переконатися, що перемикання спрацює?

Планове перемикання проганяємо на стенді: заміряємо час недоступності запису, дивимося, як застосунок відновлює з'єднання з новим майстром, розбираємо журнал реплікації. Потім перевіряємо повернення колишнього майстра в стрій і повторюємо прогін уже на реальному трафіку.

Репліка замінює резервну копію?

Ні: репліка повторює помилки майстра й не рятує від помилкового видалення даних. Тому тримаємо базові копії та архів журналів, а відновлення на окремому стенді відпрацьовуємо регулярно, а не в момент аварії.

Скільки простою займають планові роботи?

Перемикання на справну репліку — одиниці секунд недоступності запису, застосунок перепідключається сам. Оновлення та зміна налаштувань реплік ідуть по черзі, по одному вузлу, без зупинки сервісу.

Обговоримо задачу: схема, терміни, план упровадження

Щоб повернутися з оцінкою робіт і планом упровадження, нам потрібен зріз вашої конфігурації — не загальний опис, а конкретика щодо вузлів, навантаження та регламентів. Нижче список того, що дає максимальну точність розрахунку: якщо частини даних під рукою немає, відновимо разом.

  • Поточна топологія: одиночний вузол, потокова реплікація, каскад або кластер під керуванням repmgr; кількість вузлів та їхнє розміщення.
  • Обсяг бази, добовий приріст і профіль навантаження — частка запису, довгі транзакції, пікові вікна.
  • Вимоги до збереження та часу відновлення: допустима втрата даних і цільовий час перемикання на репліку.
  • Спосіб установлення й обслуговування: пакети з репозиторію, контейнери, ручне збирання; як оновлюєте мажорні версії.
  • Мережеві сегменти, правила доступу, наявність пулу з'єднань і балансувальника перед базою.
  • Моніторинг: що вже збирається, куди йдуть метрики, хто отримує сигнал про деградацію.
  • Регламент обслуговування: вікна, хто має право ініціювати перемикання, чи є план відкатів.

Після обговорення задачі повернемося зі схемою кластера, покроковим планом упровадження, термінами робіт та оцінкою обсягу. Опишіть задачу — звіримо її з вашою інфраструктурою.

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

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

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