Целью данной статьи является описание возможных способов построения отказоустойчивого кластера на PostgreSQL для систем на базе «1С:Предприятие» по аналогии с группами доступности Always On для MS SQL Server.
Реализация отказоустойчивости на PostgreSQL является нетривиальной задачей, т.к. в стандартной поставке он не предоставляет возможностей для автоматического переключения на резервный сервер и создания единой точки входа со стороны клиентских приложений.
В рамках данной статьи будут обзорно описаны возможные варианты реализации отказоустойчивого кластера с автоматическим переключением на базе Patroni и Postgres Pro BiHA и инструменты для создания единой точки входа со стороны «1С:Предприятие». Кроме того, будут рассмотрены возможные варианты переключения на резервный сервер вручную, т.к. в автоматическом переключении может не быть особой потребности.
Статья может быть полезна для принятия решения о том, какие инструменты оптимальнее использовать для реализации отказоустойчивости в зависимости от потребностей бизнеса.
Для того, чтобы правильно выбрать решение по отказоустойчивости, важно определить потребности бизнеса, в первую очередь, технические требования к системе, а также определить решение каких задач имеет ценность:
Ответы на пункты из списка выше в сочетании с анализом критериев выбора, описанных далее, позволят выбрать более подходящий вариант решения по отказоустойчивости с точки зрения затрат и ценности для бизнеса.
Имеются два варианта переключения на резервный сервер: ручное и автоматическое. Основные критерии выбора приведены ниже.
Примеры:
Конфигурации и настройки кластера с ручным и автоматическим переключением будут рассмотрены в рамках отдельных статей, при этом будет рассмотрено несколько возможных решений для каждого варианта.
Реплики могут создаваться для различных задач, и их настройка в зависимости от предназначения может меняться. Ниже представлены настройки сценариев горячего резерва (для целей высокой доступности) и оптимальные настройки для переноса части читающей нагрузки на реплику.
Основная цель – возможность быстро перейти на резервный сервер без потери данных. Высокая доступность при этом обеспечивается возможностями синхронной репликации, которая гарантирует одновременную фиксацию транзакций на основном и резервном сервере.
При использовании таких решений как Patroni или Postgres Pro BiHA синхронная репликация настраивается автоматически для всего отказоустойчивого кластера путем включения и настройки параметров самих инструментов.
При использовании только типового функционала Postgres, параметры нужно будет настраивать вручную для каждого узла:
Основная цель – перенос на резервный сервер длительных запросов на чтение, например, формирование отчетов с помощью механизма 1С создания копий баз данных.
Механизм копий БД можно настроить на реплику, т.е. обновление реплики будет выполняться средствами PostgreSQL, а не платформой 1С, пример настройки такого решения будет рассмотрена в рамках отдельной статьи.
В данном случае предполагается ручное переключения на резервный сервер, например, силами администраторов. Самой сложной частью здесь является создание единой точки входа со стороны клиентских приложений, т. е. чтобы «1С: Предприятие» могло без перенастройки подключаться к текущему мастеру. Для этих целей могут использоваться такие инструменты как PgBouncer или HAProxy.
При использовании PgBouncer сервер 1С подключается не к конкретному серверу Postgres, а к PgBouncer, который может быть установлен на том же самом хосте, далее PgBouncer перенаправляет запрос на нужный сервер баз данных. Путь к текущему ведущему серверу задается в файле конфигурации PgBouncer.
Основным преимуществом PgBouncer является возможность поставить текущие клиентские соединения на паузу при плановом переключении, т. е. пользователи не получат ошибки о недоступности сервера, на время пока осуществляется переход на новый сервер.
Настройка сервера 1С для работы с HAProxy аналогичная, т.е. сервер 1С подключается к HAProxy, затем соединения переадресуется на нужный сервер баз данных.
Отличие HAProxy от PgBouncer в том, что HAProxy с помощью проверочного скрипта может автоматически понять к какому серверу нужно подключаться, т.е. не нужно вносить изменения и файл настроек. Но здесь есть один важный момент - во избежание Split Brain (разделения данных в кластере), доступным для подключения должен быть только один мастер, поэтому скрипт в случае доступности нескольких серверов должен это учитывать, например, делать недоступными для подключения оба мастера.
Непосредственно репликация в данном случае реализована стандартными средствами PostgreSQL и каких-то особенностей при ее настройке для работы с «1С: Предприятие» здесь нет.
Для реализации автоматического переключения на резервный сервер можно использовать такие инструменты как Patroni и BiHA, а также HAProxy или расширенный формат строки подключения для создание единой точки входа со стороны «1С: Предприятие».
Patroni является внешним сервисом по отношению к Postgres и выполняет роль менеджера кластера. Основной задачей Patroni является обеспечение надежного переключения роли ведущего узла на резервный узел.
Для максимальной доступности СУБД в кластере Patroni необходимо хранить и при необходимости изменять информацию о роли узлов. Для этого используется DCS (Distributed Configuration System), которое реализуется с помощью etcd или consul и представляет собой распределенное хранилище конфигурации ключ/значение.
Ключевые особенности:
BiHA - это расширение Postgres Pro, которое управляется утилитой bihactl и функциями из состава расширения. В сочетании с доработками ядра, SQL интерфейсом и служебным процессом biha-worker, координирующим узлы кластера, BiHA превращает несколько узлов в кластер с физической репликацией Postgres и встроенным аварийным переключением узлов, отказоустойчивостью и автоматическим восстановлением после отказа.
Ключевые особенности:
В качестве краткого вывода по сравнению Patroni и BiHA можно сказать, что с точки зрения функциональных возможностей Patroni и BiHA похожи, главным отличием здесь является то, что Patroni является внешним сервисом по отношению к Postgres и поэтому может не всегда правильно реагировать на временную недоступность сервера для клиентских запросов, например, когда сервер перегружен, т. е. возможны ложные срабатывания.
BiHA существует внутри PostgreSQL ,и поэтому вероятность ложных срабатываний ниже, т. к. она может гораздо точнее отлеживать текущее состояние каждого узла кластера.
Единая точка входа со стороны 1С при использовании Patroni может быть настроена через HAProxy, используя REST API Patroni (через проверку hhtp-статуса patroni в конфигурационном файле haproxy.cfg)
По аналогии с Patroni для BiHA в качестве единой точки входа можно использовать HAProxy, но для определения текущего состояния узлов кластера нужно использовать возможность HAProxy выполнять в качестве проверки внешний скрипт. Скрипт должен возвращать «0» для разрешенных подключений и «1» для реплик, а также недоступных серверов.
При этом существует и более простой вариант подключения со стороны 1С к отказоустойчивым кластерам Patroni или BiHA, без использования дополнительного программного обеспечения, с помощью формата расширенной строки библиотеки libpq.
Информация из документации по расширенной строке подключения:
https://postgrespro.ru/docs/postgresql/15/libpq-connect#LIBPQ-CONNSTRING
В строке подключения можно задать несколько узлов (host), к которым клиент будет пытаться подключиться в заданном порядке. Первый доступный узел становится выбранным для подключения, остальные узлы уже не рассматриваются. Кроме того, могут быть указаны дополнительные параметры подключения, например, target_session_attrs.
1С поддерживает такую возможность в формате ключ/значение, но формат будет несколько отличаться от того, что описан в документации. Для отказоустойчивого кластера, состоящего из трех узлов (pgnode-01, pgnode-02, pgnode-03), в качестве строки подключения к серверу нужно указать:
pgnode-01, pgnode-02, pgnode-03 port=5432 target_session_attrs=read-write
Параметр target_session_attrs=read-write позволяет выполнять подключение только к серверам, которые находятся в режиме чтения-записи, игнорируя реплики.