Migsoft
0

Отказоустойчивый кластер PostgreSQL: Patroni или BiHA

У PostgreSQL нет встроенного автоматического переключения при сбое: потоковая репликация даст горячий standby, но failover остаётся внешней задачей. Поэтому отказоустойчивый кластер PostgreSQL строят двумя способами — внешним оркестратором Patroni или средствами самой СУБД, как BiHA в Postgres Pro. Разбираем обе архитектуры: как работают, где сложно и во что обходится владение.

Виталий Куренков
Специалист по лицензированию СУБД Postgres Pro в МИГСОФТ, рассчитывает кластерные конфигурации для юрлиц
14 августа 2026 · 9 минут чтения · Обновлено 6 октября
Содержание

«Сделать кластер, чтобы база переживала отказ сервера» — задача, которая рано или поздно прилетает каждому DBA. Документация PostgreSQL честно предупреждает: средств обнаружения сбоя ведущего сервера и автоматического переключения СУБД не предоставляет, это отдано внешним инструментам. Отсюда два пути: поставить рядом с СУБД внешний оркестратор — де-факто стандарт здесь Patroni — или взять СУБД, в ядро которой кластерная логика уже встроена, как BiHA в Postgres Pro. Ниже — оба пути без агитации, с архитектурой, слабыми местами и деньгами.

Patroni или BiHA: сравнение в одной таблице

Критерий Patroni BiHA (Postgres Pro)
Где живёт логика failover во внешнем Python-демоне на каждом узле в ядре СУБД: расширение biha и служебные процессы
Что нужно кроме СУБД кластер DCS из 3–5 узлов: etcd, Consul, ZooKeeper или Kubernetes ничего: узлы общаются напрямую по TCP
Защита от split-brain кворум в DCS, для строгого фенсинга — watchdog настраиваемый кворум, изоляция старого лидера в read-only, узел-рефери
Каскадная и георепликация возможна, настраивается администратором штатные режимы кластера, включая геораспределённые
Обновления согласование версий PostgreSQL, Patroni и DCS вместе с СУБД; мажорный апгрейд — утилитой bihactl
Кто отвечает при аварии ваша команда и сообщество вендор по SLA: реакция от 15 минут
Сертификация ФСТЭК нет — открытый проект есть: Certified-редакции Standard и Enterprise
Стоимость софт бесплатен (MIT), платите инфраструктурой и экспертизой входит в лицензию СУБД; рефери — без лицензии

Если выбор — BiHA, кластер входит в лицензию Postgres Pro. Какая редакция нужна:

Рекомендуем под ваш сценарий
Лицензия СУБД Postgres Pro Standard на 1 ядро x86-64
Бессрочная лицензия на ядро x86-64; лицензируются все серверы кластера и реплики, рефери без пользовательских баз — нет.
195 006 ₽
Рекомендуем под ваш сценарий
Лицензия СУБД Postgres Pro Enterprise на 1 ядро x86-64
Бессрочная лицензия на ядро x86-64.
716 344 ₽

Как устроена репликация PostgreSQL

И Patroni, и BiHA управляют одной и той же механикой — физической потоковой репликацией PostgreSQL. Ведущий сервер непрерывно передаёт журнал предзаписи (WAL) на резервные, и каждый standby держит байт-в-байт копию всего экземпляра. Режим по умолчанию — асинхронный: реплика немного отстаёт, и при аварии последние транзакции могут не доехать. Синхронная репликация (synchronous_standby_names) не подтверждает коммит, пока его не примет реплика, — надёжнее, но каждая запись платит сетевой задержкой. Реплики при этом открыты на чтение (hot standby), а слоты репликации не дают ведущему удалить WAL, который ещё не забрала отставшая реплика.

Отдельный инструмент — логическая репликация: публикации и подписки переносят изменения выбранных таблиц на уровне строк и работают между разными мажорными версиями. Для failover она не используется — её место в миграциях и обновлениях; BiHA, например, задействует её при мажорном апгрейде кластера.

Но сама настройка репликации кластером ещё не является. Кластер — это ответ на четыре вопроса, которых нет в ядре PostgreSQL: кто следит за живостью лидера, кто и когда повышает реплику, как переключаются клиенты и как гарантировать, что писать не начнут два узла одновременно. Дальше — два способа ответить на эти вопросы.

Путь 1: Patroni — внешний оркестратор

Patroni — открытый проект под лицензией MIT, начатый в Zalando как форк Governor и ставший де-факто стандартом высокой доступности для ванильного PostgreSQL; поддерживаются версии с 9.3 по 18. На каждом узле рядом с PostgreSQL работает Python-демон: он запускает и конфигурирует СУБД, а состояние кластера хранит во внешнем распределённом хранилище конфигурации (DCS) — etcd, Consul, ZooKeeper или Kubernetes API. Лидерство определяется ключом лидера в DCS: пока ведущий успевает его обновлять, он лидер; ключ протух — оставшиеся узлы проводят выборы, и параметр maximum_lag_on_failover не даст повыситься слишком отставшей реплике.

Управляется кластер утилитой patronictl — в том числе плановый switchover без потери данных, — а REST API каждого узла отдаёт health-чеки, по которым HAProxy или другой балансировщик направляет запись на лидера. Это зрелый инструмент, проверенный в тысячах инсталляций, и если он у вас уже работает — это рабочая схема, а не «легаси».

Честно о том, где сложно:

  • DCS — отдельный распределённый кластер из 3–5 узлов. Его тоже нужно развернуть, мониторить, обновлять и уметь чинить. На случай потери связи с DCS у Patroni есть отдельный режим DCS Failsafe Mode — но это ещё одна настройка, которую надо знать и тестировать.
  • Строгая защита от split-brain требует watchdog на узлах — иначе зависший, но формально живой лидер может не самоустраниться вовремя.
  • Patroni сам называет себя template — шаблоном, из которого HA-решение под свою инфраструктуру собираете вы. Это гибкость, но и обязанность держать экспертизу в команде: конфигурация, согласование обновлений трёх компонентов (PostgreSQL, Patroni, DCS) и регулярные учения по failover — на вашей стороне.

Сбой DCS — это сбой управления всем кластером БД: etcd или Consul придётся резервировать, мониторить и обслуживать так же тщательно, как саму СУБД.

Путь 2: BiHA — кластер внутри СУБД

BiHA (Built-in High Availability) — собственная разработка Postgres Professional: расширение biha и служебные процессы в ядре превращают Postgres Pro в кластер с физической репликацией, автоматическим аварийным переключением и восстановлением после отказа узлов. Внешних компонентов нет: узлы обмениваются состоянием напрямую по управляющему TCP-каналу, и каждый узел знает о состоянии всех остальных.

Кластер собирается утилитой bihactl: init создаёт лидера, add добавляет последователей, параметры репликации при этом настраиваются автоматически. Штатно поддерживается и преобразование уже работающей потоковой репликации в BiHA-кластер: ведущий становится лидером, реплики — последователями.

При недоступности лидера оставшиеся узлы выбирают нового голосованием, и в голосовании учитывается длина WAL: повышается минимально отставший узел, что при асинхронной репликации означает минимальную потерю данных. Кворум настраивается. Старый лидер, изолированный по сети, принимает только читающие запросы — двух пишущих узлов не возникает; вернувшись в кластер, он автоматически становится последователем (вернуть ему лидерство можно вручную функцией set_leader).

Что ещё умеет кластер по документации вендора:

  • Узел-рефери — арбитр для кластера из двух узлов, в том числе в режиме с репликацией данных: голосует в выборах и закрывает сценарий split-brain без третьего полноценного сервера.
  • Каскадная репликация — реплики получают WAL через промежуточные узлы, разгружая лидера и каналы между ЦОД.
  • Геораспределённость — BiHA-кластеры в разных площадках; многоуровневая катастрофоустойчивая схема (GDBiHA) пока помечена в документации как экспериментальная.
  • Сервисный режим — пауза кластерной логики, чтобы применить изменения конфигурации на всех узлах.
  • Мажорное обновление с минимальным простоем — bihactl автоматизирует миграцию кластера на новую основную версию: новый кластер догоняет старый по логической репликации и забирает нагрузку только после переключения.
  • Callback-обработчики — SQL-функции на события кластера (например, смену лидера) для интеграции с мониторингом и внешними сервисами.

Клиенты переключаются штатными средствами: в строке подключения libpq или JDBC перечисляются все узлы кластера с параметром target_session_attrs=read-write — при смене лидера драйвер сам переподключается к пишущему узлу, а значение read-only направляет читающие сессии на реплики. Привычные прокси, пулеры и балансировщики тоже работают.

Что происходит при отказе ведущего узла

Один и тот же сбой в кластере на Patroni и на BiHA.

Patroni

На каждом узле — демон Patroni, состояние кластера хранится во внешнем DCS.

  1. Лидер обновляет ключ в DCS

    Лидерство определяется ключом лидера в DCS — etcd, Consul, ZooKeeper или Kubernetes: пока ведущий успевает его обновлять, он лидер.

  2. Отказ лидера ключ лидера протух

    Ведущий перестал обновлять ключ — для остальных узлов это сигнал, что лидера больше нет.

  3. Выборы через DCS

    Оставшиеся узлы проводят выборы. Параметр maximum_lag_on_failover не даст повыситься слишком отставшей реплике.

  4. Новый лидер реплика повышена

    Patroni на выбранном узле повышает реплику до ведущего сервера.

  5. Клиенты запись через балансировщик

    REST API каждого узла отдаёт health-чеки, по которым HAProxy или другой балансировщик направляет запись на лидера.

Реплика стала лидером, запись идёт на неё. Кластер DCS из 3–5 узлов, watchdog и учения по failover — на стороне вашей команды. Итог — в конце сценария

BiHA

Кластерная логика в ядре Postgres Pro, внешних компонентов нет.

  1. Лидер узлы на связи по TCP

    Узлы обмениваются состоянием напрямую по управляющему TCP-каналу, и каждый узел знает о состоянии всех остальных.

  2. Отказ лидера лидер недоступен

    Ведущий узел перестал отвечать остальным узлам кластера.

  3. Голосование учитывается длина WAL

    Оставшиеся узлы выбирают нового лидера голосованием, кворум настраивается. В кластере из двух узлов голосует узел-рефери.

  4. Новый лидер минимально отставший узел

    Повышается узел с минимальным отставанием — при асинхронной репликации это означает минимальную потерю данных.

  5. Клиенты драйвер переподключается сам

    В строке подключения libpq или JDBC перечислены все узлы с target_session_attrs=read-write — при смене лидера драйвер сам переходит на пишущий узел.

  6. Старый лидер вернулся последователем

    Изолированный по сети старый лидер принимает только читающие запросы, а вернувшись в кластер, автоматически становится последователем.

Новый лидер — минимально отставший узел, двух пишущих узлов не возникает. Внешнего кластера DCS нет. Итог — в конце сценария

Схема упрощена: асинхронная репликация, отказ ведущего сервера целиком.

BiHA доступен не только в старшей редакции: расширение biha входит в поставку Postgres Pro Standard версий 17 и 18 и в Postgres Pro Enterprise. Active-active мультимастер — отдельная функциональность и только в Enterprise.

Что выбрать: три типовые ситуации

Есть команда с опытом Patroni. Если инфраструктура уже живёт на Patroni, учения по failover проходят штатно и экспертиза в команде есть, сам по себе BiHA — не повод ломать работающее. Тем более что техподдержка Postgres Professional покрывает и внешние средства кластеризации — Patroni, Stolon, Corosync/Pacemaker — когда СУБД у вас Postgres Pro.

Нужен один ответственный. Когда кластер строится с нуля и держать экспертизу по etcd и оркестратору некому, встроенный кластер снимает целый слой инфраструктуры: один вендор отвечает и за СУБД, и за failover, обновления приходят одним пакетом, а по инцидентам действует SLA техподдержки — для высшего приоритета реакция 15 минут и решение от 4 часов в режиме 24х7.

Регулируемый контур. Для госсистем и субъектов КИИ по 187-ФЗ решает сертификация: у Postgres Pro есть сертифицированные ФСТЭК редакции (Certified на базе Standard и Enterprise), и BiHA в них входит. Patroni — внешний открытый компонент, в сертифицированные конфигурации СУБД он не входит.

И честно: когда кластер не нужен. Если сервис переживёт простой в час и потерю нескольких минут транзакций, достаточно реплики с ручным повышением и выверенного резервного копирования. Автоматический failover сам добавляет сложность и точки отказа — включать его стоит там, где минуты простоя стоят дороже, чем сопровождение кластера.

Отдельный частый случай — кластер под базы 1С: про выбор редакции СУБД и особенности платформы есть отдельный разбор PostgreSQL для 1С.

Сколько стоит отказоустойчивый кластер

Patroni бесплатен, но владение — нет. К кластеру добавляются три узла DCS, стенд для учений и время инженеров на сопровождение трёх компонентов и дежурства. Это нормальная цена за гибкость — просто её надо честно закладывать в сравнение, а не сопоставлять «бесплатно» с ценой лицензии.

BiHA отдельно не покупается — это часть СУБД. Postgres Pro лицензируется по ядрам: считаются физические ядра сервера (для виртуальной машины — vCPU), включение Hyper-Threading количество лицензий не меняет, минимум на один сервер — 2 ядра. В отказоустойчивой конфигурации лицензируются все серверы кластера и все реплики — синхронные и асинхронные. Узел-рефери без пользовательских баз не лицензируется.

Пример расчёта: кластер «лидер + две реплики» на серверах по 8 ядер — это 24 ядерные лицензии. Схема «лидер + реплика + рефери» на тех же серверах — уже 16 лицензий: арбитр бесплатный. Бессрочная лицензия Postgres Pro Standard на ядро x86-64 стоит 195 006 ₽.

Узел-рефери, на котором нет пользовательских баз данных, лицензировать не нужно — по правилам лицензирования вендора голосующий узел приобретения лицензий не требует.

Для типовых нагрузок кластера достаточно Standard:

Товар Postgres Pro Standard от 35 818 ₽ Смотреть →

Active-active мультимастер, автоматическое исправление повреждённых страниц с реплики и встроенный прокси Proxima, который сам находит лидера BiHA-кластера, — это уже Enterprise:

Товар Postgres Pro Enterprise от 358 172 ₽ Смотреть →

Чем Standard отличается от Enterprise и от ванильного PostgreSQL по всем осям, а не только по кластеру, — в обзорной статье серии Postgres Pro или PostgreSQL.

Как купить Postgres Pro на юрлицо

Лицензии Postgres Pro для организаций продаёт ООО «МИГСОФТ»: счёт в рублях по безналичному расчёту, договор, закрывающие документы и комплект для тендера. СУБД входит в реестр российского ПО, поэтому лицензии продаются без НДС — как устроена льгота, разобрано в статье про НДС на программное обеспечение.

Лицензирование кластера — самое частое место ошибок в заявках: реплики лицензируются все, рефери — нет, на каждый сервер действует минимум в 2 ядра, у виртуализации свои правила. Пришлём расчёт лицензий под вашу конфигурацию кластера — бесплатно, в течение рабочего дня.

Самая частая позиция для кластера — бессрочная лицензия Postgres Pro Standard, считается по ядрам:

Лицензия СУБД Postgres Pro Standard на 1 ядро x86-64
Рекомендуем в статье Лицензия СУБД Postgres Pro Standard на 1 ядро x86-64
PPT-86-LIC
195 006 ₽ НДС не облагается (ст. 149 НК РФ) — позиция в реестре российского ПО
В корзине Подробнее →
Документы для тендера
КП с печатью, счёт, УПД, номера реестра в спецификации.
Сверка совместимости
Проверим вашу конфигурацию по базе вендора до оплаты — бесплатно.

Частые вопросы

Нужно ли лицензировать реплики Postgres Pro? +

Да, все. По правилам лицензирования вендора в отказоустойчивой конфигурации лицензируются все серверы кластера и все серверы реплик — независимо от того, синхронная репликация или асинхронная и есть ли каскадные уровни.

Лицензируется ли узел-рефери? +

Нет, если на нём не размещаются пользовательские базы данных. Голосующий узел участвует в выборах лидера и защищает кластер из двух узлов от split-brain, а лицензий не требует — это прямо зафиксировано в правилах лицензирования Postgres Pro.

BiHA работает только в Enterprise? +

Нет. Расширение biha входит в поставку Postgres Pro Standard версий 17 и 18 — встроенный отказоустойчивый кластер доступен уже в Standard. В Enterprise к нему добавляются active-active мультимастер, Proxima и другие расширенные механизмы доступности.

Можно ли перейти с Patroni на BiHA? +

Да. И Patroni, и BiHA управляют обычной физической репликацией PostgreSQL, а bihactl штатно преобразует существующий кластер с потоковой репликацией в BiHA-кластер: ведущий становится лидером, реплики — последователями. Сам переход — это переход на Postgres Pro, ведь BiHA входит в СУБД; поможем спланировать его вместе с расчётом лицензий.

Виталий Куренков
Специалист по лицензированию СУБД Postgres Pro в МИГСОФТ, рассчитывает кластерные конфигурации для юрлиц

Читайте дальше

Корпоративная почта для компании: как выбрать сервис Гайды по продуктам Корпоративная почта для компании: как выбрать сервис Как выбрать корпоративную почту для компании: облако или свой сервер, что сравнивать в тарифах и чем отличаются Яндекс 360 и VK WorkSpace — с ценами за пользователя и порядком оформления на юрлицо. 7 октября 2026 · 8 мин чтения Контроль USB и флешек в организации: как выбрать программу Киберпротект · Гайды по продуктам Контроль USB и флешек в организации: как выбрать программу Программа контроля USB решает, какие флешки, диски, телефоны и принтеры можно подключать к рабочим компьютерам и кому что на них записывать. Разбираем, где хватает групповых политик Windows, что требует ФСТЭК от контроля съёмных носителей и как выбрать между Кибер Протего, Secret Net Studio и Kaspersky Endpoint Security. 6 октября 2026 · 9 мин чтения Своё S3-хранилище: облако или собственные серверы Киберпротект · Гайды по продуктам Своё S3-хранилище: облако или собственные серверы Своё S3-хранилище даёт тот же программный интерфейс, что и облако, но данные остаются на ваших серверах. Разбираем, когда это оправдано, какие российские программно-определяемые хранилища есть, что даёт сертификат ФСТЭК и как считается лицензия по объёму. 6 октября 2026 · 8 мин чтения
Лицензия СУБД Postgres Pro Standard на 1 ядро x86-64
195 006 ₽
В корзине