Перейти к основному содержимому

Пошаговая установка по инструкции

Сведения

При переходе к данному разделу предполагается, что процесс подготовки к установке уже пройден.

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

Порядок установки

Шаги процесса ручной пошаговой установки:

  1. Подготовка дистрибутива.
  2. Проверить готовность к ручной установке.
  3. Установка необходимых rpm/deb пакетов.
  4. Создание системных директорий необходимых для работы СУБД.
  5. Импорт лицензии.
  6. Подготовка переменных окружения в .bash_profile.
  7. Развертывание экземпляра СУБД (c окружением 1C или без).
  8. Корректировка конфигурационных параметров\файлов.
  9. Запуск СУБД.
  10. Проверка результата процесса установки.
Подсказка

Все блоки подготовки и самого процесса установки являются обязательными.

При ручной установке не будут настроены различные параметры, в том числе присущие только Pangolin:

  • настройки конфигурационных файлов (postgresql.conf, pg_hba.conf);
  • настройки кластерной конфигурации;
  • будут отсутствовать компоненты Pangolin (etcd, Pangolin Manager, Pangolin Pooler, и другие);
  • настройки ролевой модели;
  • настройки расширений;
  • настройки ротации журналов;
  • и другие.

Для автоматизированной настройки данных параметров при развертывании СУБД Pangolin используйте автоматизированный сценарий.

Подсказка

Для развертывания СУБД Pangolin на окружении 1С выполните шаги с пометкой «для окружения 1С», вместо «обычное окружение».

Предусловия

Выполните распаковку дистрибутива с помощью вспомогательного скрипта unpacker-distrib.sh (с ключом --not-pack) и скопируйте полученный каталог дистрибутива на конечный хост СУБД.

Подготовка к ручной установке

  1. Проверьте что порт для работы СУБД (по умолчанию 5432) не заблокирован на уровне сети или виртуальной машины.

  2. Проверьте существование системного пользователя postgres:

    getent passwd | grep postgres

    Необходимо, чтобы postgres имел возможность фиксацию логов и имел свою home-директорию.

  3. Проверьте занятость uid/gid. Для установки экземпляра СУБД Pangolin по умолчанию используется: uid/gid: 26 для postgres и uid/gid: 126 для kmadmin_pg. Пример команды проверки:

    getent passwd | grep 26
    getent passwd | grep 126

    В случае занятости данных uid/gid переопределите переменные через изменение значений. Пример изменения uid/gid для пользователя postgres:

    sudo POSTGRES_USER_GUID=111 POSTGRES_GROUP_GUID=111 dnf install pangolin-dbms-6.5

    Изменение актуально для ОС Astra Linux, в связи с занятостью uid: 26 пользователем tape.

    Список переменных использующий uid/gid:

    POSTGRES_USER_GUID             # изменение uid пользователя postgres (по умолчанию 26)
    POSTGRES_GROUP_GUID # изменение guid группы postgres (по умолчанию 26)
    KMADMIN_PG_USER_GUID # изменение uid пользователя kmadmin_pg (по умолчанию 126)
    KMADMIN_PG_GROUP_GUID # изменение guid группы kmadmin_pg (по умолчанию 126)
    PANGOLIN_USERS_GROUP_GUID # изменение guid группы pangolin_users (по умолчанию 226)
  4. Проверьте, что виртуальные машины, которые будут использоваться для установки СУБД, находятся в области видимости. Воспользуйтесь командой ping.

    Сведения

    Выполните данный пункт в случае установки кластерной конфигурации (cluster).

    Замените переменные на значения DNS\IP-адресов хостов и выполните команды:

    ping <dns/ip-address master>
    ping <dns/ip-address replica>
    ping <dns/ip-address arbiter>

Процесс установки СУБД Pangolin

Данный раздел предназначен для описания сценария процесса ручной установки СУБД Pangolin на операционные системы (ОС), такие как:

  • Platform V SberLinux OS Server;
  • РЕД ОС;
  • Red Hat Enterprise Linux;
  • CentOS;
  • Astra Linux;
  • Альт СП.

Для уточнения поддерживаемых версий указанных ОС обратитесь к списку в разделе «Подготовка окружения».

Обозначения

Далее в разделе, в приведенных блоках кода, будут указаны следующие обозначения:

  • {OS} - операционная система;
  • {version_OS} - версия операционной системы;
  • {path} - путь к директории или путь к дистрибутиву;
  • {product_version} - версия продукта (текущая версия: 6.5.0);
  • {short_version} - короткая версия продукта (текущая: 6.5);
  • {base_version} - основная версия продукта (текущая: 6);
  • {version_component} - версия компонента.

Скорректируйте переменные относительно реализуемого сценария установки.

Шаг 1. Установка rpm/deb-пакетов

Установите пакеты серверной и клиентской части СУБД, а также пакет утилиты Pangolin Tuner:

Примечание

Данный шаг установки пакетов может упростить использование мета-пакетов. Особенно в случае, когда необходима дальнейшая дополнительная установка каких-либо компонентов.

sudo dnf install pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm
sudo dnf install pangolin-dbms-{short_version}-{product_version}-client-{OS}.x86_64.rpm

sudo dnf install utilities/pangolin-tuner-{version_component}-{OS}.x86_64.rpm
Подсказка

Пример заполненной команды:

cd distributive

sudo dnf -y install pangolin-dbms-6.5-6.5.0-sberlinux8.x86_64.rpm
sudo dnf -y install pangolin-dbms-6.5-client-6.5.0-sberlinux8.x86_64.rpm

sudo dnf -y install utilities/pangolin-tuner-1.0.0-sberlinux8.x86_64.rpm

Шаг 2. Создание системных директорий необходимых для работы СУБД

Создайте директории $PGDATA(/pgdata), /pgerrorlogs и /opt/pangolin_license:

sudo mkdir -p /pgdata/
sudo chown -R postgres:postgres /pgdata/
sudo mkdir -p /pgerrorlogs/
sudo chown postgres:postgres /pgerrorlogs/
sudo mkdir -p /opt/pangolin_license/
sudo chown postgres:postgres /opt/pangolin_license/

Шаг 3. Импорт лицензии

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

Пример

class: info Лицензия поставляется вместе с дистрибутивом в личном кабинете клиента. В случае ее отсутствия, обратитесь к менеджеру.

Добавьте файл с лицензией license.json в папку /opt/pangolin_license/ с правами postgres:postgres:

sudo mv /{path}/license.json /opt/pangolin_license/
sudo chown postgres:postgres /opt/pangolin_license/license.json

Шаг 4. Подготовка переменных окружения

  1. Переключитесь на пользователя postgres:

    sudo su - postgres
  2. Измените файл .bash_profile (в случае ОС Astra Linux - .profile) при помощи текстового редактора, добавив следующие строки с переменными окружения (замените переменные в скобках { } на актуальные значения):

    umask 022
    export LD_LIBRARY_PATH=/usr/pangolin-{short_version}/lib
    export PATH=$PATH:/usr/pangolin-{short_version}/bin
    export PG_PLUGINS_PATH=/usr/pangolin-{short_version}/lib
    export PGHOME=/usr/pangolin-{short_version}
    export PGDATABASE=postgres
    export PGUSER=postgres
    export PGHOST=127.0.0.1
    export PGPORT=5433
    export PGCLIENTENCODING=UTF8
    export CLNAME=clustername
    export PGDATA=/pgdata/0{base_version}/data
    export MANPATH=$MANPATH:$PGHOME/share/man
  3. Перечитайте переменные окружения для .bash_profile/.profile. Пример команды:

    . ~/.bash_profile

Шаг 5. Развертывание экземпляра СУБД

Разверните СУБД:

  • обычное окружение:

    initdb --locale en_US.UTF-8 -k -D /pgdata/0{base_version}/data/
  • окружение с 1С:

    initdb --locale ru_RU.UTF-8 -k -D /pgdata/0{base_version}/data/

    Для окружения с 1С крайне важно указать локаль, в будущем она будет использоваться для инициализации БД, которая создает 1С.

Ошибка initdb: error loading libraries: libjsoncpp.so.1

В случае возникновения ошибки:

initdb: error while loading shared libraries: libjsoncpp.so.1: cannot open shared object file: No such file or directory

Необходимо установить пакет:

sudo <package_manager> install libjsoncpp1

Шаг 6. Корректировка конфигурационных файлов

  1. Отредактируйте конфигурационный файл $PGDATA/postgresql.conf:

    1. Запустите утилиту с необходимыми настройками и сконфигурируйте файл под нужный профиль:

      примечание

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

      Предупреждение!

      Запуск утилиты Pangolin Tuner в Docker должен выполняться с опциональными параметрами, определяющими количество CPU и памяти, для корректного расчета значений. Это связано с особенностью вычисления значений утилитой этих характеристик. Формируемое значение соответствует общей памяти сервера и CPU, на котором развернут контейнер, а не значениям конкретного контейнера.

      • Профиль OLTP:

        /opt/pangolin-tuner/bin/pangolin-tuner --config /pgdata/0{base_version}/data/postgresql.conf --profile oltp --output-file /pgdata/0{base_version}/data/postgresql.conf.oltp
      • Профиль OLAP:

        /opt/pangolin-tuner/bin/pangolin-tuner --config /pgdata/0{base_version}/data/postgresql.conf --profile olap --output-file /pgdata/0{base_version}/data/postgresql.conf.oltp
      • Профиль 1C (для окружения 1С):

        /opt/pangolin-tuner/bin/pangolin-tuner --config /pgdata/0{base_version}/data/postgresql.conf --profile 1c --output-file /pgdata/0{base_version}/data/postgresql.conf.oltp
    2. Примените созданный конфигурационный файл:

      mv /pgdata/0{base_version}/data/postgresql.conf.oltp /pgdata/0{base_version}/data/postgresql.conf
      Сведения

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

      Описание параметров, по которым утилита Pangolin Tuner формирует значение, расположено в разделе «Тюнинг параметров» документа «Руководство администратора».

  2. Отредактируйте конфигурационный файл $PGDATA/pg_hba.conf с помощью текстового редактора (добавьте в конец файла):

    local   all           all                                peer
    host all all 0.0.0.0/0 trust

Шаг 7. Запуск СУБД

Запустите экземпляр СУБД Pangolin:

pg_ctl -D /pgdata/0{base_version}/data/ -l /pgerrorlogs/0{base_version}/postgresql.log start

Проверка результата

После завершения процесса установки рекомендуется ознакомиться с информацией в разделе «Чек-лист проверки корректности работы».

Результат

В результате выполнения пошаговой установки по инструкции формируется:

  • Готовый к работе экземпляр СУБД в конфигурации standalone.
  • Настроенный файл конфигурации (postgresql.conf) адаптированный под нужный профиль использования (OLAP/OLTP/1C).
  • Возможность самостоятельно адаптировать СУБД под индивидуальные требования (настройка расширений, функциональностей и пр.).

Дальнейшие шаги

По окончанию ручной установки доступно:

Установка компонентов продукта СУБД Pangolin

Установка Pangolin Pooler

Компонент Pangolin Pooler – это доработанная версия pgbouncer, а именно программа, управляющая пулом соединений Pangolin DBMS. Любое конечное приложение может подключиться к Pangolin Pooler, как если бы это был непосредственно сервер DBMS, и Pangolin Pooler создаст подключение к реальному серверу, либо задействует одно из ранее установленных подключений. Предназначение Pangolin Pooler — минимизировать издержки, связанные с установлением новых подключений к Pangolin DBMS.

Шаг 1. Установка пакета pangolin-pooler

Выполните установку компонента Pangolin Pooler:

sudo dnf install pangolin-pooler-{version_component}-{OS}.x86_64.rpm

Пример заполненной команды:

sudo yum install pangolin-pooler-1.1.0-rhel8.7.x86_64.rpm

Шаг 2. Конфигурирование Pangolin Pooler

Отредактируйте файл pangolin-pooler.ini:

sudo -iu postgres
sudo vi /etc/pangolin-pooler/pangolin-pooler.ini

Если файл с дефолтным конфигурационным файлом не создался во время установки, создайте его самостоятельно и отредактируйте:

sudo -iu postgres
sudo mkdir -p /etc/pangolin-pooler
sudo chown postgres:postgres /etc/pangolin-pooler
sudo chmod 0700 /etc/pangolin-pooler

sudo vi /etc/pangolin-pooler/pangolin-pooler.ini
sudo chown postgres:postgres /etc/pangolin-pooler/pangolin-pooler.ini
sudo chmod 0600 /etc/pangolin-pooler/pangolin-pooler.ini
Пример файла pangolin-pooler.ini

[databases]
* = host=<ip адрес хоста> port=5433 auth_port=5544 auth_pool_size=1

[pgbouncer]
 listen_port = 6544
 listen_addr = *
 auth_type = scram-sha-256
 auth_file = /etc/pangolin-pooler/userlist.txt
 auth_proxy = on
 auth_failure_threshold = 3
 auth_inactivity_period = 60
 auth_last_size = 10
 log_audit = 1
 logfile = /pgerrorlogs/06/pangolin-pooler/pangolin-pooler.log
 pidfile = /var/run/user/984/pangolin-pooler/pangolin-pooler.pid
 admin_users = pgbouncer
 max_client_conn = 400
 pool_mode = transaction
 min_pool_size = 0
 default_pool_size = 105
 max_db_connections = 105
 max_user_connections = 105
 ignore_startup_parameters = extra_float_digits
 unix_socket_dir =
 ndc_suspending_timeout = 0

 client_tls_crl_path = /pg_ssl/crl
 server_tls_crl_path = /pg_ssl/crl
 client_tls_crl_file = /pg_ssl/crl/intermediate.crl
 server_tls_crl_file = /pg_ssl/crl/intermediate.crl
#  TLS settings
 server_tls_protocols = secure
 server_tls_ciphers = secure
 server_tls_sslmode = verify-full
 client_tls_protocols = secure
 client_tls_ciphers = secure
 client_tls_sslmode = prefer
 server_tls_pkcs12_config_path = /pg_ssl/intermediate/pgbouncer.p12.cfg
 client_tls_pkcs12_config_path = /pg_ssl/intermediate/server.p12.cfg

Шаг 3. Конфигурирование userlist.txt

  1. Измените файл userlist.txt (путь до файла /etc/pangolin-pooler/userlist.txt) при помощи текстового редактора, добавив следующие строки:

    "<user>" "<password>"

    Пример файла userlist.txt:

    "user" "qwerty"

    Или в зашифрованном виде:

    "user" "md5175c641eaed0b6c05ae8444b73d789f0"
  2. Измените права и владельца файла:

    sudo chown postgres:postgres /etc/pangolin-pooler/userlist.txt
    sudo chmod 0600 /etc/pangolin-pooler/userlist.txt

Шаг 4. Настройка ротации журналов

  1. Выполните конфигурирование ротации журналов. Содержимое файла pangolin-pooler перенесите из аналогичного файла на мастере:

    sudo -iu postgres
    sudo vi /etc/logrotate.d/pangolin-pooler

    Пример файла pangolin-pooler:

    /pgerrorlogs/06/pangolin-pooler/pangolin-pooler.log {
    rotate 10
    su postgres postgres
    missingok
    sharedscripts
    notifempty
    compress
    daily
    create 0600 postgres postgres
    postrotate
    /bin/kill -HUP `cat /var/run/user/984/pangolin-pooler/pangolin-pooler.pid 2> /dev/null` 2>/dev/null ||true
    endscript
    }
  2. Назначьте права:

    sudo chown postgres:postgres /etc/logrotate.d/pangolin-pooler
    sudo chmod 0644 /etc/logrotate.d/pangolin-pooler

Шаг 5. Запуск Pangolin Pooler

Перезапустите службу Pangolin Pooler:

sudo systemctl restart pangolin-pooler

Установка Pangolin Manager

Компонент Pangolin Manager – это доработанная версия patroni, python-приложения для создания и управления Pangolin DBMS-кластеров работающих на основе потоковой репликации.

Pangolin Manager - это оркестратор кластера Pangolin, который преобразует систему из двух и более узлов Pangolin в высокодоступный кластер с поддержкой контролируемого и аварийного переключения. Также он автоматизирует добавление, обновление и удаление реплик, и реализует одновременное изменение конфигурации Pangolin на всех узлах кластера.

Далее представлены шаги для установки Pangolin Manager. Предполагается, что выбран тип конфигурации cluster, так как данный компонент используется в кластерной конфигурации.

Подсказка

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

Шаг 1. Установка пакета pangolin-manager

  1. Установите пакет pangolin-manager-venv, обязательную зависимость пакета pangolin-manager:

    sudo dnf install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm

    Пример заполненной команды:

    cd distributive 
    sudo dnf install pangolin-manager-venv-1.1.0-sberlinux8.x86_64.rpm
  2. Установите пакет pangolin-manager:

    sudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpm

    Пример заполненной команды:

    cd distributive 
    sudo dnf install pangolin-manager-2.1.4-sberlinux8.x86_64.rpm
  3. Дальнейшие действия удобнее выполнять под системным пользователем postgres. Переключитесь на системного пользователя postgres:

    su -iu postgres

Шаг 2. Настройка перезагрузки компонентов (опциональный)

Важно

Выполните данный шаг в случае конфигурации с Pangolin Pooler.

  1. Перейдите в каталог /etc/pangolin-manager:

    postgres ~ % cd /etc/pangolin-manager
  2. Создайте скрипт reload_pangolin_pooler.sh, который будет использоваться Pangolin Manager при перезагрузке кластера для перезагрузки Pangolin Pooler (reload):

    #!/bin/sh
    sudo systemctl restart pangolin-pooler

Шаг 3. Оформление конфигурационного файла postgres.yml

При установке пакета pangolin-manager создается конфигурационный файл Pangolin Manager - /etc/pangolin-manager/postgres.yml, содержащий значения переменных по умолчанию.

Отредактируйте конфигурационный файл Pangolin Manager /etc/pangolin-manager/postgres.yml или используйте скрипт генерации postgres.yml на основе уже существующих переменных окружения ($HOSTNAME; $CLNAME; $PGHOME; $PGDATA) системного пользователя postgres.

Параметры СУБД необходимо перенести в конфигурационный файл postgres.yml вручную из уже существующих pg_hba.conf и postgresql.conf (которые расположены в $PGDATA) в соответствии с назначением секций конфигурационного файла postgres.yml.

Файл postgres.yml состоит из следующих блоков:

  • restapi – укажите настройки для доступа к API самого Pangolin Manager (hash пароля можно создать через команду pg_auth_password enc -t);
  • etcd – укажите данные для доступа к etcd, пользователь: patronietcd (был создан при настройке etcd) и пароль (захешировать можно через pg_auth_password enc -t);
  • bootstrap – параметры из данного блока записываются в etcd /<namespace>/<scope>/config только при первом старте кластера, поэтому их так же необходимо заполнить на основе текущих конфигурационных файлов PostgreSQL;
  • postgresql – исправьте записи на основе конфигурационного файла postgresql.conf;
  • pg_hba – исправьте записи на основе конфигурационного файла pg_hba.conf;
  • tags – оставьте без изменения, как в скрипте генерации, для обычного использования достаточно выставить все параметры блока tags в false;
  • scope – необходимо указать имя кластера (cluster), в name имя текущего сервера (hostname).

Шаг 4. Создание пользователя для репликации

  1. Создайте пользователя для работы репликации в СУБД Pangolin с паролем согласно парольной политике:

    CREATE USER patroni WITH ENCRYPTED PASSWORD '<password>';
  2. Отключите срок действия пароля и выставьте лимит подключений:

    ALTER ROLE patroni LOGIN SUPERUSER REPLICATION VALID UNTIL 'infinity' CONNECTION LIMIT 5;

Шаг 5. Добавление пользователей в шифрованное хранилище паролей (опциональный)

Важно

При использовании функциональности шифрования паролей выполните данный шаг.

Добавьте пользователей, созданных в предыдущем пункте, в криптохранилище Pangolin:

postgres ~ % pg_auth_config add -h $HOSTNAME -p 5433 -U patroni -d postgres
postgres ~ % pg_auth_config add -h $HOSTNAME -p 5433 -U patroni -d replication
postgres ~ % pg_auth_config add -h localhost -p 5433 -U patroni -d postgres
postgres ~ % pg_auth_config add -h localhost -p 5433 -U patroni -d replication

Шаг 6. Настройка правил в pg_hba.conf для репликации

Для репликации и корректной работы Pangolin Manager добавьте дополнительные правила в pg_hba.conf:

host all patroni 127.0.0.1/32 scram-sha-256
host all patroni $PGHOST/32 scram-sha-256

host replication patroni 127.0.0.1/32 scram-sha-256
host replication patroni $PGHOST/32 scram-sha-256

Шаг 7. Завершающие действия

  1. Остановите PostgreSQL:

    systemctl stop postgresql
  2. Перечитайте обновленную конфигурацию Pangolin (reload):

    sudo -iu postgres
    psql -c 'SELECT pg_reload_conf();'
    exit
  3. Активируйте сервис Pangolin Manager (под системным пользователем, например, root) для автоматического запуска после перезагрузки ОС:

    sudo systemctl enable pangolin-manager
  4. Запустите сервис:

    sudo systemctl start pangolin-manager
  5. Проверьте корректность запуска и состояния сервиса. Пример статуса:

    sudo systemctl status pangolin-manager

    # stdout:
    pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
    Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; disabled; vendor preset: disabled)
    Active: active (running) since Tue 2023-12-12 01:00:31 MSK; 1 day 11h ago
    Process: 521932 ExecStartPre=/bin/chown -R postgres:postgres /var/run/pangolin-dbms (code=exited, status=0/SUCCESS)
    Process: 521930 ExecStartPre=/bin/mkdir -p /var/run/pangolin-dbms (code=exited, status=0/SUCCESS)
    Process: 521929 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
    Process: 521927 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
    Main PID: 521935 (pangolin-manage)
    Tasks: 47 (limit: 50662)
    Memory: 2.8G
    CGroup: /system.slice/pangolin-manager.service
    ├─521935 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─521956 /opt/pangolin/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=<IP-address> --port=5433 --cluster_name=clustername --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_sen>
    ├─521962 postgres: clustername: logger
    ├─521963 postgres: clustername: checkpointer
    ├─521964 postgres: clustername: background writer
    ├─521966 postgres: clustername: idle sessions terminator
    ├─521967 postgres: clustername: password policy cache
    ├─521968 postgres: clustername: performance insights
    ├─521970 postgres: clustername: authproc
    ├─521971 postgres: clustername: license checker
    ├─521982 postgres: clustername: patroni postgres 127.0.0.1(51650) idle
    ├─523949 postgres: clustername: walwriter
    ├─523950 postgres: clustername: autovacuum launcher
    ├─523951 postgres: clustername: autounite launcher
    ├─523952 postgres: clustername: pg_cron launcher
    ├─523953 postgres: clustername: file system checker
    ├─523954 postgres: clustername: logical replication launcher
    └─558349 postgres: clustername: walsender patroni <IP-address>(52080) streaming 0/D4000000

Шаг 8. Выбор распределенного хранилища конфигурации

Для установки распределенного хранилища конфигурации выберите одну из инструкций:

Установка модуля Pangolin DCS

Pangolin DCS — это модуль распределенного хранилища конфигурации внутри компонента Pangolin Manager, который реализует Raft-алгоритм.

Pangolin DCS является частью Pangolin Manager и может заменить сторонний компонент etcd. Развертывание Pangolin DCS происходит поэтапно.

Шаг 1. Настройка конфигурационных файлов

  1. Настройка Pangolin DCS осуществляется параметрами в конфигурационном файле postgres.yml. Ниже приведен пример настройки параметров секции pangolin_dcs. В конфигурационном файле этой секцией замените секцию etcd:

    pangolin_dcs:
    self_addr: srv-0-141:2481
    partner_addrs: srv-0-134:2481,srv-0-137:2481

    data_dir: /pgdata/06/raft_data
    journal_max_size: 10485760
    journal_wait_timeout: 10
    memory_journal_size: 10000
    journal_force_read_wait: true

    dump_dir: /pgdata/06/raft_dump
    dump_interval: 300
    dump_wait_timeout: 10

    logfile: /pgerrorlogs/6.5.0/raft/raft.log
    log_max_size: 20971520
    log_rotation_period: 1d

    heartbeat_interval: 1000
    election_timeout: 5000

    certfile: '/pg_ssl/patroni_server.crt'
    keyfile: '/pg_ssl/patroni_server.key'
    cafile: '/pg_ssl/root.crt'
    capath: '/pg_ssl'
    crlfile: /pg_ssl/crl/intermediate.crl
    crlpath: /pg_ssl/crl
    pkcs12_config_path: /pg_ssl/intermediate/patroni_server.p12.cfg
    verify_client: optional
    verify_server: true
    no_tls1_3: false
    Обозначение параметров

    Параметры:

    • обязательные параметры:

      • self_addr — адрес текущего узла в формате ip:port;

      • partner_addrs — список адресов остальных узлов в формате ip1:port1, ip2:port2;

      • data_dir — путь к директории для хранения журнала операций и текущих значений ключей;

    • необязательные параметры:

      • journal_max_size — максимальный размер в байтах для файла с журналом операций, по умолчанию 10 МБ;

      • journal_wait_timeout — время тайм-аута, по истечении которого операция записи/чтения журнала считается неуспешной, по умолчанию равен параметру loop_wait или 10с;

      • memory_journal_size — число максимально содержащихся в памяти последних записей журнала, по умолчанию 10000;

      • journal_force_read_wait — если равен true, то при рестарте службы pangolin-manager выполняется перечитывание журнала операций, по умолчанию true;

      • dump_dir — путь к директории для хранения дампа, по умолчанию равен data_dir;

      • dump_interval — интервал создания дампа, в секундах, по умолчанию равен 300;

      • dump_wait_timeout — время тайм-аута, по истечении которого операция записи/чтения дампа считается неуспешной, по умолчанию равен параметру loop_wait или 10 (секундам);

      • logfile — путь к файлу с логом от pangolin_dcs, по умолчанию равен data_dir/raft.log;

      • log_max_size — максимальный размер в байтах для файла с логом pangolin_dcs, по умолчанию равен 20мб;

      • log_rotation_period — интервал ротации файла с логом pangolin_dcs, по умолчанию раз в сутки, формат <число><{одно из: s, m, h, d}>, соответственно: секунда, месяц, час, день;

      • heartbeat_interval — время в миллисекундах, раз в которое мастер DCS-кластера будет сообщать о себе остальным узлам;

      • election_timeout — время в миллисекундах, по прошествии которого при неполучении heartbeat от мастера узел инициирует новое голосование;

      • certfile — серверный сертификат Pangolin DCS для установления SSL-подключений;

      • keyfile — закрытый ключ Pangolin DCS, соответствующий серверному сертификату;

      • keyfile_password — пароль для расшифровки закрытого ключа (если защищен паролем);

      • cafile — корневой сертификат УЦ (CA);

      • capath — директория, содержащая файлы с доверенными сертификатами УЦ (CA);

      • crlfile — файл со списком отозванных сертификатов (CRL);

      • crlpath — директория, содержащая файлы со списком отозванных сертификатов (CRL);

      • pkcs12_config_path — файл в формате JSON, содержащий данные для запроса сертификата из SecMan или парольную фразу для доступа к контейнеру PKCS#12 и путь к контейнеру;

      • verify_client — определяет, требуется ли запрашивать и проверять клиентский сертификат DCS. Возможные значения:

        • none — клиентский сертификат не запрашивается, проверка сертификата не выполняется;

        • optional — клиентский сертификат запрашивается и, если клиент отправляет сертификат, подвергается проверке;

        • required — клиентский сертификат запрашивается и, если клиент не отправляет сертификат, установка SSL-соединения завершается с ошибкой;

      • verify_server — определяет, требуется ли запрашивать и проверять серверный сертификат DCS (возможные значения: true/false);

      • no_tls1_3 — на серверах с установленным OpenSSL 1.1.0 и выше позволяет переключиться с протокола TLSv1.3 на TLSv1.2 (возможные значения: true/false, по умолчанию false).

  2. При старте кластера с Pangolin Manager с таким конфигурационным файлом, инициализируется Raft-кластер, который между своими узлами передает информацию по защищенному SSL-каналу.

    Заполните секции restapi и ssl как указано в примере:

    restapi:
    # секция заполняется как и для кластера с etcd
    listen: 0.0.0.0:8008
    connect_address: srv-1-0:8008
    allowlist: []
    allowlist_include_members: true
    pkcs12_config_path: /pg_ssl/intermediate/server.p12.cfg
    crlpath: /pg_ssl/crl
    crlfile: /pg_ssl/crl/intermediate.crl
    authentication:
    username: patroniyml
    password: $enc$....
    pangolin_dcs:
    # параметры описанные выше, self_addr и пр.

    # параметры для rest api pangolin_dcs
    restapi:
    listen: 0.0.0.0:0000
    connect_address: srv-0-1:0000
    allowlist: []
    #allowlist_include_members: true
    ciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1
    verify_client: optional

    cafile: /pg_ssl/root.crt
    capath: /pg_ssl/root_dir
    certfile: /pg_ssl/patroni_server.crt
    keyfile: /pg_ssl/patroni_server.key
    crlpath: /pg_ssl/crl
    crlfile: /pg_ssl/crl/intermediate.crl
    # параметры для аутентификации на Pangolin DCS через pangolin-manager-ctl
    authentication:
    username: pangolindcs
    password: $enc$....

    # параметры для команд к Pangolin DCS через pangolin-manager-ctl и pangolin-dcs-ctl
    ctl:
    retry_timeout: 10 # тайм-аут на выполнение запроса к Pangolin DCS

Шаг 2. Настройка авторизации внутри DCS при включенном SSL и pem-сертификатах (опциональный)

Выполните настройку авторизации внутри DCS:

  1. Добавьте пользователя root:

    curl -iS -XPUT --cert /pg_ssl/client.crt --key /pg_ssl/client.key https://srv-0-1:0000/v2/auth/users/root -d '{"password":"<Пароль root>"}'
  2. Добавьте «обычного» пользователя:

    curl -iS -XPUT --cert /pg_ssl/client.crt --key /pg_ssl/client.key https://srv-0-1:0000/v2/auth/users/test_user -d '{"password":"<Пароль пользователя>"}'
  3. Добавьте роль с правами на чтение и запись:

    curl -iS -XPUT --cert /pg_ssl/client.crt --key /pg_ssl/client.key https://srv-0-1:0000/v2/auth/roles/test_role -d '{"permissions": {"kv": {"read": ["/service/clustername/*"], "write": ["/service/clustername/*"]}}}'
  4. Назначьте роль «обычному» пользователю:

    curl -iS -XPUT --cert /pg_ssl/client.crt --key /pg_ssl/client.key https://srv-0-1:0000/v2/auth/users/test_user  -d '{"grant":["test_role"]}'
  5. Проверьте статус авторизации пользователя root:

    curl -iS -XGET --cert /pg_ssl/client.crt --key /pg_ssl/client.key -u root:<Пароль root> https://srv-0-1:0000/v2/auth/enable
  6. Включите авторизацию:

    curl -iS -XPUT --cert /pg_ssl/client.crt --key /pg_ssl/client.key https://srv-0-1:0000/v2/auth/enable
    Внимание!

    При включенной авторизации все запросы на изменение/просмотр ключей будут доступны только тому пользователю, у которого есть права на это.

Шаг 3. Настройка параметров доступа

В связи с добавлением утилит безопасности (setup_kms_credentials, pg_auth_password, pg_certs_rotate_agent) в основной пакет Pangolin Manager, на узле арбитра необходима установка файла лицензии. Утилита pangolin-auth-reencrypt копируется из дистрибутива Pangolin, на узле арбитра производится настройка аналогично узлам с DBMS — создание пользователя безопасности kmadmin_pg и настройка каталогов с утилитами.

Ниже приведены каталоги с настроенными правами доступа:

/etc/postgres - drwxrwx--x   2 postgres   kmadmin_pg
/opt/pangolin-common - drwx--x--- 3 postgres kmadmin_pg
/opt/pangolin_license - drwxr-x--- 2 postgres kmadmin_pg
/opt/pangolin-manager-2.1.0 - drwx---r-x------ 5 postgres postgres
/opt/pangolin-manager-2.1.0/bin - drwx-----x 3 postgres postgres
/opt/pangolin-manager-2.1.0/lib - drwx---r-x 4 postgres postgres
/opt/pangolin-manager-2.1.0/lib/plugins - drwx---r-x 2 postgres postgres

Шаг 4. Удаление дубликатов бинарных файлов

Так же после установки нового rpm-пакета необходимо удалить дубликаты бинарных файлов с узлов мастера и реплики, расположенных по пути:

/opt/pangolin-manager-2.1.0/bin/pg_auth_password
/opt/pangolin-manager-2.1.0/bin/pg_certs_rotate_agent
/opt/pangolin-manager-2.1.0/bin/setup_kms_credentials

Шаг 5. Состав кластера

На узле арбитра находится служба pangolin-manager, работающая в упрощенном режиме и принимающая только запросы, связанные с DCS-модулем. Конфигурационный файл postgres.yml в таком случае выглядит так (без секции postgresql и других значений в секции tags):

scope: clustername
name: srv-0-141

restapi:
# обычное заполнение секции

pangolin_dcs:
self_addr: srv-0-141:2480
partner_addrs: ['srv-0-134:2480', 'srv-0-137:2480']
data_dir: /home/postgres/raft_data_dir
heartbeat_interval: 1000
election_timeout: 5000

bootstrap:
dcs:
# обычное заполнение секции

tags:
nofailover: true # так как здесь нет pangolin, на этот узел нельзя совершить failover
nosync: true # так как этот узел не может стать репликой

Пример файла конфигурации службы pangolin-manager.service:

[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple
User=postgres
Group=postgres

# Read in configuration file if it exists, otherwise proceed

Environment="PG_LICENSE_PATH=/opt/pangolin_license"
Environment="PG_LD_LIBRARY_PATH=/opt/pangolin-dbms/lib"
Environment="PG_PLUGINS_PATH=/opt/pangolin-dbms/lib"
Environment="PATRONI_PLUGINS_PATH=/opt/pangolin-manager/lib/postgresql_se_libs"
Environment="LD_LIBRARY_PATH=/opt/pangolin-manager/lib/postgresql_se_libs"
Environment="PYTHONPATH=/opt/pangolin-manager/lib/python3/site-packages:/opt/pangolin-manager/lib64/python3/site-packages:/opt/pangolin-manager/lib/python3.6/site-packages:/opt/pangolin-manager/lib64/python3.6/site-packages"
LimitNOFILE=65536

# Pre-commands to start watchdog device
# Uncomment if watchdog is part of your patroni setup
PermissionsStartOnly=true
ExecReload=/bin/kill -HUP $MAINPID

WorkingDirectory=/opt/pangolin-manager
ExecStart=/opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
Restart=on-failure
KillMode=process

# Disable restart limits
StartLimitInterval=0

[Install]

Установка etcd

В кластере Pangolin для хранения информации о состоянии Pangolin Manager используется хранилище etcd. Поддерживаема версия пакета под разных ОС указана на странице «Системные требования».

Etcd - это строго согласованное, распределенное хранилище информации в формате ключ-значение.

Внимание!

Существует модуль Pangolin DCS, который является частью Pangolin Manager и может заменить компонент etcd.

В кластерной конфигурации (Pangolin Manager+etcd) etcd устанавливается из стандартных репозиториев ОС. Все действия по установке etcd выполняются под системным пользователем root.

Далее представлены шаги для установки компонента etcd.

Подсказка

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

Шаг 1. Установка пакета etcd

Важно

Важно чтобы версия etcd на всех устанавливаемых машинах была одинаковая.

Установите пакет etcd:

sudo dnf install etcd

Шаг 2. Заполнение конфигурационного файла etcd.conf

С помощью текстового редактора установите следующие параметры в файл конфигурации по пути /etc/etcd/etcd.conf:

ETCD_NAME="$(hostname -s)"
ETCD_LISTEN_CLIENT_URLS="http://<IP-address>:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://$(hostname):2379"
ETCD_LISTEN_PEER_URLS="http://<IP-address>:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://$(hostname):2380"
ETCD_INITIAL_CLUSTER_TOKEN="single"
ETCD_INITIAL_CLUSTER="$(hostname -s)=http://$(hostname):2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ENABLE_V2="true"
Обозначения

Описание параметровetcd.conf:

  • ETCD_LISTEN_CLIENT_URLS — список ссылок, с которых собирается трафик клиентов;
  • ETCD_ADVERTISE_CLIENT_URLS — список ссылок клиентов этого элемента кластера для публичной передачи. Передаваемые ссылки клиентов будут доступны системам, взаимодействующим с кластером etcd. Клиентские библиотеки обрабатывают эти ссылки для подключения к кластеру etcd;
  • ETCD_LISTEN_PEER_URLS — список ссылок, с которых собирается трафик одноранговых узлов;
  • ETCD_INITIAL_ADVERTISE_PEER_URLS — список ссылок пиров этого элемента кластера для передачи другим элемента кластера;
  • ETCD_INITIAL_CLUSTER — исходная конфигурация кластера для начальной загрузки. Т.е все узлы и их url (конструкция выглядит следующим образом «host_name_1=http://ip_iddress:2379,host_name_2=http://ip_iddress:2379,host_name_3=http://ip_iddress:2379);
  • ETCD_INITIAL_CLUSTER_STATE — исходное состояние кластера (new или existing);
  • ETCD_INITIAL_CLUSTER_TOKEN — исходный токен кластера etcd во время начальной загрузки. При использовании нескольких кластеров позволяет избежать непреднамеренного взаимодействия между ними;
  • ETCD_DATA_DIR - каталог, в котором находится база данных etcd, wal-ы и снепшоты Etcd;
  • ETCD_HEARTBEAT_INTERVAL — время (мс) периода проверки (heartbeat);
  • ETCD_ELECTION_TIMEOUT — время (в мс) тайм-аута алгоритма выбора;
  • ETCD_ENABLE_V2 - поддержка версии API v2.

Шаг 3. Создание service-файла etcd

  1. Отредактируйте файл etcd.service по пути /usr/lib/systemd/system/ со следующим содержимым:

    Сведения

    Если файл etcd.service не был создан при установке пакета, создайте вручную.

    '[Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target

    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    EnvironmentFile=-/etc/etcd/etcd.conf
    User=postgres
    ## set GOMAXPROCS to number of processors
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 /usr/bin/etcd"

    Restart=on-failure
    LimitNOFILE=65536

    [Install]
    WantedBy=multi-user.target'
  2. Перечитайте конфигурацию systemd после изменения сервиса:

    systemctl daemon-reload

Шаг 4. Активация автоматического запуска компонента

Включите сервис для автоматического запуска etcd после перезагрузки ОС:

systemctl enable etcd

Шаг 5. Завершающие действия

  1. Запустите etcd:

    systemctl start etcd
  2. Проверьте корректность запуска и состояния сервиса:

    systemctl status etcd

    etcd.service - Etcd Server
    Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
    Active: active (running) since Fri 2023-06-16 13:51:25 MSK; 1 months 3 days ago
    Main PID: 7723 (etcd)
    CGroup: /system.slice/etcd.service
    └─7723 /usr/bin/etcd
  3. Проверьте узлы кластера:

    etcdctl member list

    Более информативный вариант:

    etcdctl endpoint status --write-out=table --endpoints https://{{  replica_host }}:{Порт},https://{{ arbiter_host }}:{Порт},https://{{ master_host }}:{Порт}
  4. Проверьте состояние кластера etcd:

    # для доступа к api v2 используйте ETCDCTL_API=2 перед командой etcdctl, либо экспортируйте данный параметр в env
    etcdctl --endpoints https://{{ replica_host }}:{Порт},https://{{ arbiter_host }}:{Порт},https://{{ master_host }}:{Порт} endpoint healt

    http://{{ replica_host }}:{Порт}
    http://{{ arbiter_host }}:{Порт}
    http://{{ master_host }}:{Порт}
    cluster is healthy

Шаг 6. Дополнительные действия

Включите аутентификацию в etcd и добавьте необходимых пользователей и роли для работы Pangolin Manager:

# для доступа к api v2 используйте ETCDCTL_API=2 перед командой etcdctl, либо экспортируйте данный параметр в env
etcdctl user add root
etcdctl user add patronietcd
etcdctl role add patroni
etcdctl role grant-permission patroni readwrite '/service/*'
etcdctl user grant-role patronietcd patroni
etcdctl auth enable

Шаг 7. Проверка конфигурации etcd

При первом запуске Pangolin Manager должен определить запущенный экземпляр СУБД Pangolin и создать конфигурацию в etcd. Пример конфигурации в etcd:

root ~ % etcdctl --user root:ENTER_PASSWORD_HERE get /
Password:
/service
/service/clustername
/service/clustername/config
/service/clustername/status
/service/clustername/members
/service/clustername/members/srv-0-1
/service/clustername/initialize
/service/clustername/leader

Полезные функции etcd

Список полезных команд для использования функций etcd:

  • Для быстрого просмотра проблем с кластером:

    etcdctl --cluster=true endpoint health
  • Для просмотра всей структуры хранилища

    etcdctl get / --prefix --keys-only
  • Для получения значения из параметра:

    etcdctl get --write-out=json /service/clustername/leader
    etcdctl get --write-out=json /service/clustername/members/