Описание резервирования
Для обеспечения высокой доступности сервер лицензирования Offline ELM поддерживает функционал резервирования баз данных средствами PostgreSQL.
В продукте ELM используются два понятия для обозначения экземпляров серверов: нода (node) и инсталляция (Instance ID). В контексте продукта данные понятия равнозначны, но чаще используется понятие "нода". По умолчанию при запуске сервера Offline ELM используется значение node1, а для подключения резервной ноды необходимо в переменных окружения ELM_INSTANCE_ID в файле .env указать значение node2.
Рекомендуется запускать резервную ноду на отдельном физическом сервере. Запуск нескольких нод на одной операционной системе невозможен.
Настройка логической репликации
Настройка резервирования баз данных с помощью логической репликации PostgreSQL состоит из следующих шагов:
- Создание публикации на node1.
- Активация триггеров для разрешения конфликтов на node2.
- Создание подписки на остальных нодах на node2 на публикацию, созданную на node1.
- Активация триггеров для разрешения конфликтов на node1.
- Создание подписки на остальных нодах на node1 на публикацию, созданную на node2.
Настройка публикации таблиц
Публикация — это набор изменений, выделяемых в таблице или в группе таблиц (может также называться набором репликации), изменения в которых должны реплицироваться с использованием логической репликации.
Создание публикации
Для создания публикации нужно или подключиться к командной строке контейнера с БД Offline ELM
$ docker compose exec elmi-offline-db bash -c "psql -U elm"
и далее выполнить команду создания самой публикации в БД postgresql:
CREATE PUBLICATION [publication_name] FOR TABLE paramdata, licenseinfo, devices, issues, hosts, softsessions, files, certificates, iprules, commands, settings, users;
или просто выполнить одну команду:
$ docker compose exec elmi-offline-db psql -U elm -с "CREATE PUBLICATION [publication_name] FOR TABLE paramdata, licenseinfo, devices, issues, hosts, softsessions, files, certificates, iprules, commands, settings, users"
Далее для краткости будут приведены просто команды SQL. Данные команды необходимо выполнить на всех нодах, но указать разные publication_name, например, для node1 — elm_pub_node1 или в другом удобном формате, чтобы исключить путаницу с многосерверной конфигурацией репликации БД. Также следует запомнить publication_name, т. к. оно понадобится при создании подписки.
Удаление публикации
Если публикация больше не нужна, то ее можно удалить следующей командой, но перед этим рекомендуется удалить подписку:
DROP PUBLICATION [publication_name]; SELECT pg_drop_replication_slot('[subscription_name]');
Активация триггеров для репликации
Так как триггеры не работают для реплицируемых данных, необходимо их включить отдельно для каждой таблицы с указанием имени триггера до создания подписки. При создании подписки копируются данные, и поэтому нужны работающие триггеры для разрешения конфликтов. Для удобства в проект Offline ELM был добавлен SQL-скрипт для активации всех триггеров на таблицы. Для его применения выполнить команду:
\i /etc/postgresql/enable_triggers.sql
Настройка подписки для ELM
Подписка — это принимающая сторона логической репликации. Узел, на котором определяется подписка, называется подписчиком, а в свойствах подписки определяется подключение к другой базе данных и публикации, на которые подписчик хочет подписаться. Как упоминалось ранее, сначала должна быть создана публикация, и должна быть установлена связь между публикующей нодой и подписывающей.
Создание подписки
Для создания подписки на созданную ранее публикацию на node2, куда будут передаваться реплицируемые данные, выполнить следующую команду:
CREATE SUBSCRIPTION [subscription_name] CONNECTION 'host=[ELM_DB_HOST] port=[ELM_DB_PORT] user=elm password=[password] dbname=elm' PUBLICATION [publication_name] WITH (origin = NONE);
где:
[subscription_name] — имя подписки;
[ELM_DB_HOST] — IP-адрес или доменное имя хоста с БД, где создана подписка [publication_name];
[ELM_DB_PORT] — порт для подключения к БД, где создана подписка [publication_name];
user=elm и dbname=elm — для ELM используются указанные имя пользователя и название БД, если пользователь и/или имя БД изменены, указать актуальные значения;
[password] — пароль для подключения указанного пользователя к указанной БД;
origin = NONE — настройка, которая определяет, будет ли для данной подписки запрашиваться передача изменений, не отмеченных источником репликации, или всех изменений независимо от источника. Для ELM origin значение указать как none, то есть для подписки будет запрашиваться передача изменений, не отмеченных источником репликации. Если задать для origin значение any (является значением по умолчанию), публикующий сервер отправляет все изменения независимо от их источника, для master-master репликации это приведет к циклической передачи одних и тех же данных;
copy_data=true — определяет, должны ли копироваться уже существующие данные в публикациях, на которые оформляется подписка, сразу после начала репликации.
Данную команду необходимо выполнить на всех нодах, куда нужно передавать данные. Например, для двухсерверной конфигурации, если на node1 создана публикация publication_name, то на резервной ноде (node2) нужно выполнить команду создания подписки на эту публикацию.
Удаление подписки
Для удаления подписки выполнить команду:
ALTER SUBSCRIPTION [subscription_name] DISABLE; ALTER SUBSCRIPTION [subscription_name] SET (slot_name = NONE); DROP SUBSCRIPTION [subscription_name];
Пример настройки репликации для двух нод
Для настройки репликации ниже приведена последовательность команд в очередности их выполнения и наименование ноды, на какой нужно их выполнить:
# node1 CREATE PUBLICATION elm_pub_node1 FOR TABLE paramdata, licenseinfo, devices, issues, hosts, softsessions, files, certificates, iprules, commands, settings, users; # node2 \i /etc/postgresql/enable_triggers.sql CREATE SUBSCRIPTION elm_sub_node2 CONNECTION 'host=192.168.1.1 port=5432 user=elm password=elm dbname=elm' PUBLICATION elm_pub_node1 WITH (origin = NONE); CREATE PUBLICATION elm_pub_node2 FOR TABLE paramdata, licenseinfo, devices, issues, hosts, softsessions, files, certificates, iprules, commands, settings, users; # node1 \i /etc/postgresql/enable_triggers.sql CREATE SUBSCRIPTION elm_sub_node1 CONNECTION 'host=192.168.1.2 port=5432 user=elm password=elm dbname=elm' PUBLICATION elm_pub_node2 WITH (origin = NONE);
В параметрах host и port устанавливаются адрес и порт контейнера elmi-offline-db, которые задаются при запуске данного контейнера в переменных окружения ELM_DB_HOST и ELM_DB_PORT в файле .env.
Проверка подключения
- Запустить CLI Offline ELM (подробно описано в разделе Запуск и остановка CLI Offline ELM).
- Выполнить команду "show elm" на обеих нодах. Убедиться, что в выводе команды содержится информация об обеих нодах. Если информация в поле "Last updated" обновляется своевременно (согласно полю "Next update"), значит всё настроено корректно.
elmi> show elm ELM hosts: 1. Instance: node1 Hostname: ELM standalone Build version: Version 1.4, build 1, date 29-07-2024 14:52:47 +0700 Status: work Last updated: 1724212000 (2024-08-21 10:46:40) Next update: 1724212300 (2024-08-21 10:51:40) Certificate info: Valid from: 1724148728 (2024-08-20 17:12:08) Expiry: 1724571996 (2024-08-25 14:46:36) Token serial number: 429b439b 2. Instance: node2 Hostname: ELM standalone Build version: Version 1.4, build 1, date 29-07-2024 14:52:47 +0700 Status: work Last updated: 1724212020 (2024-08-21 10:47:00) Next update: 1724212320 (2024-08-21 10:52:00) Certificate info: Valid from: 1724211600 (2024-08-21 10:40:00) Expiry: 1724571996 (2024-08-25 14:46:36) Token serial number: 429b3c49 elmi>
Настройка репликации для двух нод в случае повторного подключения чистой базы к существующей
Если у вас была настроена репликация между двумя нодами, но по какой-то причине одна из баз была развернута с нуля, требуется удалить существующие подписки и публикации, и повторно повторить пункты по их созданию.
На рабочей БД выполните пункты Удаление публикации и Удаление подписки.
Затем на обеих нодах выполните пункты Создание публикации и Создание подписки.
Ссылки на официальную документацию
Для более детального изучения вопроса с логической репликацией, прилагаются ссылки на официальную документацию: