Кластер PostgreSQL

В этой инструкции рассматривается развёртывание отказоустойчивого кластера PostgreSQL средствами, включёнными в состав дистрибутива Геном.

Пропустите этот шаг, если отказоустойчивость СУБД не требуется, либо для подсистемы мониторинга будет использоваться внешний сервер.

Доступ к мастеру PostgreSQL выполняется через VIP. Для автоматического переназначения VIP на узлах кластера развёртываются службы vip-manager и etcd.

Для отслеживания состояния узлов кластера и автоматического выбора нового мастера используется Patroni.

В Patroni мастер PostgreSQL называется лидером.

Системные требования

Для развёртывания отказоустойчивого кластера PostgreSQL требуются минимум три узла с характеристиками не ниже указанных:

Параметр Значение

Количество ядер CPU

4

Объём оперативной памяти, ГБ

16

Дисковое пространство, ГБ

100

Скорость работы сетевого интерфейса, ГБит/с

1

Операционные системы

Узлы для развёртывания на них PostgreSQL должны работать под управлением одной из ОС:

  • Альт Сервер c10f1;

  • Альт Сервер c10f2.

Сеть

Для корректной работы кластера должны быть открыты соответствующие сетевые порты. Список портов и протоколов приводятся в описании компонентов подсистемы мониторинга:

Подготовка узлов кластера

Для развёртывания кластера PostgreSQL понадобятся три узла. Чтобы подготовить их к работе:

  1. Убедитесь, что настройки sudo разрешают группе wheel выполнение любых команд.

    Как правило, достаточно выполнить команду visudo и в конце файла раскомментировать строку:

    WHEEL_USERS ALL=(ALL:ALL) ALL
  2. Убедитесь, что пользователь root состоит в группе wheel.

  3. Убедитесь, что настройки сервера SSH на узлах разрешают подключение с авторизацией по ключам.

  4. Убедитесь, что необходимые репозитории пакетов подключены и актуальны.

Установка

После подготовительных работ переходите к установке:

  1. Загрузите на один из узлов будущего кластера архив ansible-ha-pg-cluster-2025-12-12.tar.gz. Этот узел будет использоваться в качестве установочного. Приведённые ниже команды выполняйте на нём.

  2. Распакуйте загруженный архив:

    tar xf ansible-ha-pg-cluster-2025-12-12.tar.gz
  3. Если виртуальное окружение Python /opt/skala-r/vision/server/vision_venv/ существует, активируйте его:

    source /opt/skala-r/vision/server/vision_venv/bin/activate

    Об успешной активации свидетельствует изменившееся приглашение интерпретатора командной строки, например:

    (vision_venv) [root@server /tmp]#
  4. Если виртуальное окружение Python /opt/skala-r/vision/server/vision_venv/ не существует:

    1. Загрузите на узел архив ansible-ha-victoria-cluster-37.tar.gz.

    2. Распакуйте загруженный архив:

      tar xf ansible-ha-victoria-cluster-37.tar.gz
    3. Запустите скрипт создания и активации виртуального окружения:

      sh ansible-ha-victoria-cluster-37/venv/activate_venv.sh
  5. Заполните инвентарь Ansible inventory.yml, например:

    all:
      hosts:
        pg-1.example.com:
          ansible_host: 192.168.0.21
          hostname: pg-1.example.com
        pg-2.example.com:
          ansible_host: 192.168.0.22
          hostname: pg-2.example.com
        pg-3.example.com:
          ansible_host: 192.168.0.23
          hostname: pg-3.example.com
      vars:
        ansible_user: root
        ansible_ssh_pass: "<password>"
    
        cluster_name: patroni
        ip_master: 192.168.0.24/24
        pgdata: /pgdata
        pgport: 5432
        secrets: /root/patroni_secrets
    
        service_users:
          - name: admin
            password: "<admin_password>"
            flags: SUPERUSER

    В значении переменной service_users укажите учётные данные администратора СУБД.

    Особое внимание обратите на то, что подключение к узлам выполняется от имени пользователя root, а секреты Patroni хранятся в его домашнем каталоге.

  6. Если узлы кластера работают под управлением ОС Альт Сервер c10f1, добавьте в блок vars дополнительную переменную packages_to_install:

    ---
    # ...
      vars:
        # ...
        packages_to_install:
          - postgresql15-server
          - postgresql15-contrib
          - etcd
          - patroni
          - python3-module-psycopg2
  7. Запустите плейбук развёртывания кластера PostgreSQL:

    ansible-playbook -i inventory.yml ansible-ha-pg-cluster-2025-12-12/cluster.yml
  8. Деактивируйте виртуальное окружение:

    deactivate

Инициализация

  1. Используя VIP, подключитесь к мастеру кластера PostgreSQL через SSH.

  2. Запустите интерпретатор PostgreSQL:

    sudo -u postgres psql
  3. Создайте отдельные роли для подсистем управления и мониторинга:

    CREATE ROLE <role_name> WITH
      LOGIN
      PASSWORD '<role_password>'
      CREATEDB
      SUPERUSER;

    Здесь:

    • <role_name> — название роли. Для подсистемы мониторинга рекомендуется использовать название vision.

    • <role_password> — пароль роли.

  4. Создайте базы данных для подсистем управления и мониторинга:

    CREATE DATABASE <db_name>
      OWNER <db_owner>
      ENCODING 'UTF8'
      LC_COLLATE 'ru_RU.UTF-8'
      LC_CTYPE 'ru_RU.UTF-8'
      TEMPLATE template0;

    Здесь:

    • <db_name> — название базы данных. Для подсистемы мониторинга рекомендуется использовать название vision_db.

    • <db_owner> — название роли владельца базы.

  5. Завершите работу с интерпретатором:

    \q
  6. Отключитесь от мастера PostgreSQL.

Проверка корректности

Проверьте корректность развёртывания кластера:

  1. На любом узле кластера выполните команду:

    patronictl -c /etc/patroni/config.yml topology

    Ожидаемый результат выполнения команды:

    • Один узел с ролью Leader.

    • Один узел с ролью Sync Standby.

    • Один узел с ролью Replica.

  2. На лидере выполните команду:

    ip -br a

    Ожидаемый результат выполнения команды: VIP привязан к одному из сетевых интерфейсов.

  3. Убедитесь в возможности подключения к кластеру с не входящих в него узлов:

    psql -h <vip> -U <admin> -p 5432 -d postgres

    Здесь:

    • <vip> — VIP лидера;

    • <admin> — название учётной записи администратора СУБД.

    Подключение должно быть успешным.

  4. Выполните дополнительные проверки:

    • Убедитесь, что на лидере запрос возвращает значение f:

      SELECT pg_is_in_recovery();
    • Получите список БД:

      \l+
    • Убедитесь, что на лидере выводится информация о репликах:

      SELECT * FROM pg_stat_replication \gx
    • Проверьте значение настройки archive_mode. По умолчанию её значение равно off.

      SHOW archive_mode