27.2. Подготовка BiHA-кластера #

Подготовка BiHA-кластера выполняется при помощи утилиты bihactl. Есть несколько сценариев использования утилиты:

Прежде чем начать подготовку BiHA-кластера, внимательно изучите Подраздел 27.2.1.

27.2.1. Предварительные требования и особенности #

Прежде чем начать подготовку BiHA-кластера, прочитайте следующую информацию и выполните необходимые действия:

  • Обеспечьте сетевую связность между всеми узлами вашего будущего BiHA-кластера.

    Если необходима изоляция сети, при которой управляющий канал и передача WAL работают в одной сети, а клиентские сеансы с базой данных — в другой, настройте BiHA-кластер следующим образом:

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

    • Добавьте IP-адрес для клиентских соединений в параметр конфигурации listen_addresses.

  • Чтобы избежать проблем с biha-background-worker, связанных с настройкой времени на узлах кластера, настройте синхронизацию времени на всех узлах.

  • Не рекомендуется выполнять команды bihactl в каталоге PGDATA. Утилита bihactl может создавать файлы biha_init.log и biha_add.log в том каталоге, откуда запускается. Однако для корректного выполнения команд bihactl целевой каталог PGDATA должен быть пустым.

  • Пароль для роли biha_replication_user в файле паролей должен быть одинаковым на всех узлах кластера BiHA. Это необходимо для обеспечения связи между лидером и последователями. Пароль можно указать одним из следующих способов:

    • Безопасный и рекомендуемый способ — добавить отдельную строку для каждого узла:

      echo 'имя_узла:порт:biha_db:biha_replication_user:пароль' >> ~/.pgpass
      
      echo 'имя_узла:порт:replication:biha_replication_user:пароль' >> ~/.pgpass
    • Простой способ — добавить одну строку для всех узлов:

      echo '*:*:*:biha_replication_user:пароль' >> ~/.pgpass
  • Во время работы biha создаёт следующие служебные файлы в каталоге данных:

    • standby.signal — файл, при наличии которого узел запускается в режиме резервного сервера. Файл необходим для того, чтобы сделать расширение biha доступным только для чтения при запуске Postgres Pro. Файл удаляется с лидера, когда он переходит в состояние LEADER_RW.

    • файлы biha.state и biha.conf — в каталоге pg_biha, необходимые для сохранения внутреннего состояния и конфигурации расширения biha.

  • Во время работы biha использует собственный механизм, чтобы динамически изменять конфигурацию Postgres Pro. Некоторые параметры Postgres Pro управляются расширением biha и изменить их с помощью ALTER SYSTEM невозможно, так как они критичны для работы biha. К таким параметрам относятся:

    Эти параметры хранятся в файле pg_biha/biha.conf, а также в разделяемой памяти процесса biha. Когда эти параметры изменяются, biha отправляет сигнал SIGHUP, чтобы проинформировать другие процессы об изменениях. Если в это время изменить какие-либо другие параметры и не перечитать конфигурацию, изменённые параметры могут быть перечитаны неожиданно.

    Postgres Pro ведёт себя вышеописанным образом, только когда расширение biha загружено и настроено, т.е. когда библиотека указана в переменной shared_preload_libraries и установлены необходимые параметры biha.*. В других случаях Postgres Pro работает, как обычно.

  • При инициализации BiHA-кластера расширение biha изменяет конфигурацию Postgres Pro в postgresql.conf и pg_hba.conf. Изменения сначала вносятся в служебные файлы biha postgresql.biha.conf и pg_hba.biha.conf, а затем обрабатываются сервером после указания следующих директив включения в postgresql.conf и pg_hba.conf соответственно:

    include 'postgresql.biha.conf'
    include "pg_hba.biha.conf"
  • В некоторых операционных системах управление сеансами пользователей может осуществляться менеджером служб systemd. В этом случае, если сервер запущен с использованием pg_ctl и управляется удалённо, имейте в виду, что при завершении SSH-сеанса все фоновые процессы, инициированные в нём, будут также завершены демоном systemd. Чтобы избежать такого поведения, выполните одно из следующих действий:

    • Воспользуйтесь файлом службы postgrespro-ent-17 менеджера systemd для запуска сервера СУБД на узле кластера.

    • Измените конфигурацию службы управления сеансами пользователей systemd-logind в файле /etc/systemd/logind.conf, а именно установите значение no для параметра KillUserProcesses.

27.2.2. Подготовка BiHA-кластера с нуля #

Чтобы подготовить BiHA-кластер с нуля, выполните следующие действия.

Предварительные требования

  1. На всех узлах будущего кластера установите пакет postgrespro-ent-17-contrib. Не создавайте экземпляры баз данных.

  2. Убедитесь, что вы выполняете команду bihactl от имени пользователя, который будет запускать сервер Postgres Pro Enterprise.

    Например, если вы запускаете сервер как пользователь postgres, команда bihactl должна также выполняться пользователем postgres.

  3. Если вы планируете использовать pg_probackup с biha, установите пакет pg-probackup-ent-17.

Инициализация кластера

Используйте команду bihactl init, чтобы инициализировать кластер и создать узел-лидер.

  1. Выполните команду bihactl init с необходимыми параметрами:

    bihactl init \
         --biha-node-id=1 \
         --host=узел_1 \
         --port=порт_узла \
         --biha-port=порт_biha \
         --nquorum=количество_узлов \
         --pgdata=каталог_PGDATA_лидера

    Запускается утилита initdb, редактируются файлы postgresql.conf и pg_hba.conf.

    При инициализации BiHA-кластера генерируется «магическая» строка. Об использовании «магической» строки читайте в Подразделе 27.2.6.

  2. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_лидера -l файл_журнала_лидера
  3. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

Добавление узла-последователя

  1. Убедитесь, что узел-лидер находится в состоянии LEADER_RO или LEADER_RW.

  2. Убедитесь, что пароль роли biha_replication_user в файле паролей совпадает с паролем этой роли на узле-лидере.

  3. Выполните команду bihactl add с необходимыми параметрами:

    bihactl add \
        --biha-node-id=2 \
        --host=узел_2 \
        --port=порт_узла \
        --biha-port=порт_biha \
        --use-leader "host=узел_лидер port=порт_лидера biha-port=порт_лидера_biha" \
        --pgdata=каталог_PGDATA_последователя

    Создаётся резервная копия узла-лидера при помощи pg_basebackup или pg_probackup в зависимости от значения, переданного в параметре --backup-method. Также редактируются файлы postgresql.conf и pg_hba.conf.

    Примечание

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

    Также можно добавить данные для подключения к узлу-лидеру с помощью «магической» строки. За дополнительной информацией об использовании «магической» строки обратитесь к Подразделу 27.2.6.

  4. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_последователя -l файл_журнала_последователя
  5. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

27.2.3. Преобразование существующего кластера с потоковой репликацией в BiHA-кластер #

Преобразуйте существующий кластер Postgres Pro Enterprise 17 с потоковой репликацией и настроенным экземпляром базы данных в BiHA-кластер. В результате ведущий узел кластера станет лидером, а ведомые — последователями.

Предварительные требования

Если текущий кластер синхронный, то есть у него задано значение параметра synchronous_standby_names (например, synchronous_standby_names=walreceiver), выполните следующие шаги перед конвертацией в BiHA-кластер:

  1. Сбросьте параметр synchronous_standby_names:

    ALTER SYSTEM RESET synchronous_standby_names;
  2. Из файла postgresql.conf и всех его директив включения, вручную удалите значения synchronous_standby_names.

Преобразование ведущего узла в узел-лидер

  1. Остановите существующий ведущий узел:

    pg_ctl stop -D каталог_PGDATA_ведущего_узла
  2. Выполните команду bihactl init с параметром --convert:

    bihactl init --convert \
        --biha-node-id=1 \
        --host=узел_1 \
        --port=порт_PostgresPro \
        --biha-port=порт_biha \
        --nquorum=количество_узлов \
        --pgdata=каталог_PGDATA_лидера

    Во время преобразования кластера генерируется «магическая» строка. За дополнительной информацией об использовании «магической» строки обратитесь к Подразделу 27.2.6.

  3. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_лидера -l файл_журнала_лидера
  4. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

Преобразование ведомого узла в узел-последователь

  1. Убедитесь, что пароль роли biha_replication_user в файле паролей совпадает с паролем этой роли на узле-лидере.

  2. Остановите ведомый узел:

    pg_ctl stop -D каталог_PGDATA_ведомого_узла
  3. Выполните команду bihactl add с параметром --convert-standby:

    bihactl add --convert-standby \
      --biha-node-id=2 \
      --host=узел_2 \
      --port=порт_PostgresPro \
      --biha-port=5435 \
      --use-leader "host=адрес_узла_лидера port=порт_лидера biha-port=порт_лидера_biha" \
      --pgdata=каталог_PGDATA_последователя

    При преобразовании существующего ведомого узла в узел-последователь biha создаёт файлы каталог_PGDATA_последователя/pg_biha/biha.conf и каталог_PGDATA_последователя/pg_biha/biha.state, необходимые для подключения узла к кластеру, и редактирует файлы postgresql.conf и pg_hba.conf.

    Также можно добавить данные для подключения к узлу-лидеру с помощью «магической» строки. За дополнительной информацией об использовании «магической» строки обратитесь к Подразделу 27.2.6.

  4. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_последователя -l файл_журнала_последователя
  5. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

27.2.4. Подготовка BiHA-кластера из существующего сервера баз данных #

Если существующий сервер Postgres Pro Enterprise 17 с настроенной базой данных состоит только из одного узла, вы можете преобразовать его в узел-лидер, а затем добавить остальные узлы в BiHA-кластер с помощью команды bihactladd.

Преобразование существующего узла в узел-лидер

  1. Остановите узел:

    pg_ctl stop -D каталог_PGDATA_сервера
  2. Выполните команду bihactl init с параметром --convert:

    bihactl init --convert \
        --biha-node-id=1 \
        --host=узел_1 \
        --port=порт_PostgresPro \
        --biha-port=порт_biha \
        --nquorum=количество_узлов \
        --pgdata=каталог_PGDATA_лидера

    Редактируются файлы postgresql.conf и pg_hba.conf.

    Во время преобразования узла генерируется «магическая» строка. За дополнительной информацией об использовании «магической» строки обратитесь к Подразделу 27.2.6.

  3. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_лидера -l файл_журнала_лидера
  4. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

Добавление узла-последователя

  1. Убедитесь, что узел-лидер находится в состоянии LEADER_RO или LEADER_RW.

  2. Убедитесь, что пароль роли biha_replication_user в файле паролей совпадает с паролем этой роли на узле-лидере.

  3. Выполните команду bihactl add с необходимыми параметрами:

     bihactl add \
         --biha-node-id=2 \
         --host=узел_2 \
         --port=порт_узла \
         --biha-port=порт_biha \
         --use-leader "host=адрес_узла_лидера port=порт_лидера biha-port=порт_biha_лидера" \
         --pgdata=каталог_PGDATA_последователя
     

    Создаётся резервная копия узла-лидера при помощи pg_basebackup или pg_probackup в зависимости от значения, переданного в параметре --backup-method. Также редактируются файлы postgresql.conf и pg_hba.conf.

    Также можно добавить данные для подключения к узлу-лидеру с помощью «магической» строки. За дополнительной информацией об использовании «магической» строки обратитесь к Подразделу 27.2.6.

  4. Запустите СУБД:

    pg_ctl start -D каталог_PGDATA_последователя -l файл_журнала_последователя
  5. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

27.2.5. Подготовка узла-рефери в BiHA-кластере #

Узел-рефери участвует в выборах и помогает разрешить проблемы разделения кластера.

Примечание

  • При добавлении в кластер узла-рефери можно использовать только pg_basebackup.

  • На узел-рефери копируются только база данных biha_db и системные таблицы. База данных postgres и пользовательские данные не копируются.

Чтобы подготовить узел-рефери:

  1. Выполните команду bihactl add с соответствующим значением параметра --mode:

    bihactl add \
          --biha-node-id=3 \
          --host=узел_3 \
          --port=порт_узла \
          --biha-port=порт_biha \
          --use-leader "host=адрес_узла_лидера port=порт_лидера biha-port=порт_лидера_biha" \
          --pgdata=каталог_PGDATA_рефери \
          --mode=referee

    или

    bihactl add \
          --biha-node-id=3 \
          --host=узел_3 \
          --port=порт_узла \
          --biha-port=порт_biha \
          --use-leader "host=адрес_узла_лидера port=порт_лидера biha-port=порт_лидера_biha" \
          --pgdata=каталог_PGDATA_рефери \
          --mode=referee_with_wal
  2. Запустите экземпляр Postgres Pro с настроенным узлом-рефери:

    pg_ctl start -D каталог_PGDATA_рефери
  3. Проверьте статус узла в представлении biha.status_v:

    SELECT * FROM biha.status_v;

27.2.6. Использование «‎‎магической» строки (необязательно) #

«Магическая» строка — это специальная строка, которая автоматически генерируется при инициализации BiHA-кластера. «Магическая» строка используется в скриптах подготовки BiHA-кластера. Строка содержит данные, необходимые для подключения узлов-последователей к узлу-лидеру.

Вы можете использовать «магическую» строку, чтобы при добавлении узлов-последователей не вводить данные для подключения к узлу-лидеру вручную.

Далее приведён пример использования «магической» строки:

  1. При инициализации кластера перенаправьте вывод bihactl в файл:

    bihactl init \
       --biha-node-id=1 \
       --host=узел_1 \
       --port=порт_узла \
       --biha-port=порт_biha \
       --nquorum=количество_узлов \
       --pgdata=каталог_PGDATA_лидера > /tmp/magic-file
  2. При добавлении узла-последователя выполните следующие действия:

    1. Установите переменную окружения:

      export MAGIC_STRING="$(cat /tmp/magic-file)"
    2. Добавьте параметр --magic-string в bihactl add:

      bihactl add \
          --biha-node-id=2 \
          --host=узел_2 \
          --port=порт_узла \
          --biha-port=порт_biha \
          --magic-string=$MAGIC_STRING \
          --pgdata=каталог_PGDATA_последователя

    Узел-последователь будет использовать закодированные данные из «магической» строки для подключения к узлу-лидеру.