PostgreSQL

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

Визион может использовать для хранения служебной БД внешний сервер PostgreSQL. Если вы планируете использовать это решение, разверните Визион в конфигурации для одного узла, а затем выполните переключение, следуя инструкции Смена сервера PostgreSQL.

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

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

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

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

Плейбуки развёртывания PostgreSQL в кластерной конфигурации поддерживают ОС Альт Сервер c10f1 и Альт Сервер c10f2.

Сеть

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

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

Чтобы подготовить узлы будущего кластера PostgreSQL:

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

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

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

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

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

  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

Виртуальное окружение

Для установки некоторых компонентов необходимы коллекции Ansible. Они входят в состав виртуального окружения, включённого в архив ansible-ha-victoria-cluster-<version>.tar.gz.

Если виртуальное окружение /opt/skala-r/vision/server/vision_venv/ не существует:

  1. Распакуйте архив:

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

    sh ansible-ha-victoria-cluster-<version>/venv/activate_venv.sh

    Этот скрипт создаст виртуальное окружение /opt/skala-r/vision/server/vision_venv/ и активирует его, о чём свидетельствует изменившееся приглашение интерпретатора командной строки, например:

    (vision_venv) [root@server /tmp]#

Установка

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

  1. Активируйте виртуальное окружение:

    source /opt/skala-r/vision/server/vision_venv/bin/activate
  2. Запустите плейбук:

    ansible-playbook -i inventory.yml cluster.yml
  3. Деактивируйте виртуальное окружение:

    deactivate

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

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

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

    sudo -u postgres psql
  3. Создайте роль vision:

    CREATE ROLE vision WITH
      LOGIN
      PASSWORD 'vision'
      CREATEDB
      SUPERUSER;
  4. Создайте базу vision_db:

    CREATE DATABASE vision_db
      OWNER vision
      ENCODING 'UTF8'
      LC_COLLATE 'ru_RU.UTF-8'
      LC_CTYPE 'ru_RU.UTF-8'
      TEMPLATE template0;
  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