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

Реконфигурация Pangolin из standalone в кластерное решение

В данном разделе описан процесс реконфигурации СУБД Pangolin из standalone конфигурации в кластерное решение, а так же рассмотрено подключение к кластеру дополнительных реплик. Процесс реконфигурации СУБД Pangolin представлен в связке Pangolin Manager и Pangolin DCS и с применением Pangolin Manager и etcd. В статье приведены примеры команд для Platform V SberLinux OS Server (SLO) 9.6 и версии продукта 6.7.6.

Обозначение параметров

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

  • узел мастера: {master_host} и {master_ip};
  • узел реплики: {replica_host} и {replica_ip};
  • узел арбитра: {arbiter_host}.

Также имеются другие обозначения:

  • {base_version} – базовая версия продукта (текущая: 6);
  • {short_version} – короткая версия продукта (текущая: 6.7);
  • {cluster_id} – ID кластера;
  • {version_component} – версия поставляемого расширения;
  • {OS} – наименование операционной системы и ее версия.

Реконфигурация СУБД с установкой и настройкой компонентов Pangolin Manager и Pangolin DCS

Установка и настройка Pangolin Manager и Pangolin DCS

Сведения

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

  1. Установите rpm/deb-пакеты компонента pangolin-manager и его зависимость pangolin-manager-venv:

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

    Пример команды:

       sudo yum install -y "/tmp/distr/distributive/3rdparty/pangolin-manager-venv/pangolin-manager-venv-2.1.19-sberlinux8.x86_64.rpm"
    sudo yum install -y "/tmp/distr/distributive/pangolin-manager-2.1.19-sberlinux8.x86_64.rpm"
  2. Создайте директории, измените привилегии:

    sudo mkdir /pgdata/0{base_version}/raft_data
    sudo mkdir /pgdata/0{base_version}/raft_dump
    sudo chmod -R 770 /pgdata/0{base_version}/raft_data
    sudo chmod -R 770 /pgdata/0{base_version}/raft_dump
    sudo chown postgres:postgres /pgdata/0{base_version}/raft_data
    sudo chown postgres:postgres /pgdata/0{base_version}/raft_dump
    sudo mkdir -p /pgerrorlogs/0{base_version}/raft
    sudo mkdir -p /pgerrorlogs/0{base_version}/pangolin-manager
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  3. При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл .bash_profile с помощью текстового редактора. Пример заполнения .bash_profile:

    .bash_profile
    # .bash_profile

    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

    # User specific environment and startup programs
    export PG_LICENSE_PATH=/opt/pangolin_license
    export PGHOME=/usr/pangolin-{short_version}
    export PGHOME_CLIENT=/usr/pangolin-dbms-client-{short_version}
    export PGDATABASE=postgres
    export PGUSER=postgres
    export PGHOST=$(hostname -i)
    export PGPORT=5433
    export PGCLIENTENCODING=UTF8
    NOW=$(date +"%Y-%m-%d")
    export PGDATA=/pgdata/0{base_version}/data
    export MANPATH=$MANPATH:$PGHOME/share/man
    alias errors="ls -t /pgerrorlogs/0{base_version}/postgresql-$NOW*.log | head -1 | xargs tail -F | grep -E 'WARNING|ERROR|FATAL|ПРЕДУПРЕЖДЕНИЕ|ОШИБКА|ВАЖНО'"
    alias hba='nano $PGDATA/pg_hba.conf'
    alias pglog='ls -t /pgerrorlogs/0{base_version}/postgresql-$NOW*.log | head -1 | xargs tail -n 300'
    alias pgver="psql -c 'select version();' | sed \"s| on | (\$(psql --single-line --no-align -c 'select product_version();' | sed '2q;d' )) on |\""
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    # pangolin-manager
    export PATH=$PATH:/opt/pangolin-manager/bin/
    alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLNAME'
    alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLNAME'
    alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLNAME'
    alias pgconfig='curl -k -s -m 3 https://$(hostname -f):8008/config | jq'
    alias ptlog='ls -t /pgerrorlogs/0{base_version}/pangolin-manager/pangolin-manager*.log | head -1 | xargs tail -n 300'
    alias ptver="pangolin-manager-ctl version"
    alias reload='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload $CLNAME'
    alias restart='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLNAME'
    alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLNAME'
    umask 022
    export CLNAME=clustername
    # pangolin-manager-dcs
    alias rlog='cat /pgerrorlogs/0{base_version}/raft/raft.log'
    alias members="pangolin-dcs-ctl member list"
    alias elist="pangolin-dcs-ctl endpoint status --endpoints='{master_host}:8009,{replica_host}:8009,{arbiter_host}:8009'"
    alias health="pangolin-dcs-ctl endpoint health --endpoints='{master_host}:8009,{replica_host}:8009,{arbiter_host}:8009"
  4. Отредактируйте конфигурационный файл postgres.yml на каждом узле СУБД:

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

    Ниже приведены инструкции по заполнению основных блоков файла postgres.yml:

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

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

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

    Мастер
    scope: clustername
    name: {master_host}

    restapi:
    listen: 0.0.0.0:8008
    connect_address: {master_host}:8008
    allowlist: []
    allowlist_include_members: true
    ciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1
    verify_client: optional
    certfile: /pg_ssl/patroni_server.crt
    keyfile: /pg_ssl/patroni_server.key
    cafile: /pg_ssl/root.crt
    capath: /pg_ssl/root_dir
    crlpath: /pg_ssl/crl
    crlfile: /pg_ssl/crl/intermediate.crl
    authentication:
    username: patroniyml
    password: password
    pangolin_dcs:
    self_addr: {master_host}:2481 #Адрес текущего узла
    partner_addrs: {replica_host}:2481,{arbiter_host}:2481 #Список адресов остальных узлов кластера
    data_dir: /pgdata/0{base_version}/raft_data #Путь к директории для хранения журнала операций и текущих значений ключей;
    journal_max_size: 10485760
    journal_wait_timeout: 10
    memory_journal_size: 10000
    journal_force_read_wait: true
    dump_dir: /pgdata/0{base_version}/raft_dump
    dump_interval: 300
    dump_wait_timeout: 10
    logfile: /pgerrorlogs/0{base_version}/raft/raft.log
    log_max_size: 20971520
    log_rotation_period: 1d
    heartbeat_interval: 1000
    election_timeout: 5000
    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
    verify_client: optional
    verify_server: true
    no_tls1_3: false
    ctl:
    retry_timeout: 10
    restapi:
    listen: 0.0.0.0:8009
    connect_address: {master_host}:8009
    partner_address: {replica_host}:8009,{arbiter_host}:8009
    allowlist: []
    allowlist_include_members: true
    authentication:
    username: patronietcd
    password: password
    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
    log:
    dir: /pgerrorlogs/0{base_version}/pangolin-manager
    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
    destination: file
    file_mode: 600
    redirect_min_size: 10
    bootstrap:
    dcs:
    ttl: 135
    retry_timeout: 60
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
    synchronous_mode_strict: false
    postgresql:
    parameters:
    max_connections: '110'
    max_worker_processes: '32'
    max_prepared_transactions: '12'
    wal_level: replica
    wal_log_hints: on
    track_commit_timestamp: off
    wal_keep_size: 1GB
    max_wal_senders: '10'
    max_replication_slots: '10'
    logical_decoding_work_mem: 64MB
    auth_activity_period: '60'
    authentication_max_workers: '16'
    use_pg_rewind: true
    use_slots: true
    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF-8
    postgresql:
    listen: 0.0.0.0:5433
    bin_dir: /usr/pangolin-{short_version}/bin
    bin_dir_client: /usr/pangolin-dbms-client-{short_version}/bin
    connect_address: {master_host}:5433
    data_dir: /pgdata/0{base_version}/data/
    create_replica_methods:
    - basebackup
    basebackup:
    format: plain
    wal-method: fetch
    authentication:
    replication:
    username: patroni
    password: password
    database: replication
    sslmode: verify-ca
    sslcrldir: /pg_ssl/crl
    sslcrl: /pg_ssl/crl/intermediate.crl
    sslkey: /pg_ssl/patroni.key
    sslcert: /pg_ssl/patroni.crt
    sslrootcert: /pg_ssl/root.crt
    sslrootpath: /pg_ssl/root_dir
    superuser:
    username: patroni
    password: password
    sslmode: verify-ca
    sslcrldir: /pg_ssl/crl
    sslcrl: /pg_ssl/crl/intermediate.crl
    sslkey: /pg_ssl/patroni.key
    sslcert: /pg_ssl/patroni.crt
    sslrootcert: /pg_ssl/root.crt
    sslrootpath: /pg_ssl/root_dir
    callbacks:
    on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    parameters:
    {}
    pg_hba:
    - host all postgres 127.0.0.1/32 scram-sha-256
    - host all profile_tuz 127.0.0.1/32 scram-sha-256
    - host all patroni 127.0.0.1/32 scram-sha-256
    - host all postgres {replica_ip}/32 scram-sha-256
    - host all patroni {replica_ip}/32 scram-sha-256
    - host all profile_tuz {replica_ip}/32 scram-sha-256
    - host all postgres {master_ip}/32 scram-sha-256
    - host all patroni {master_ip}/32 scram-sha-256
    - host all profile_tuz {master_ip}/32 scram-sha-256
    - host replication patroni 127.0.0.1/32 scram-sha-256
    - host replication patroni {replica_ip}/32 scram-sha-256
    - host replication patroni {master_ip}/32 scram-sha-256
    - host all +as_TUZ, backup_user 0.0.0.0/0 scram-sha-256
    tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

    Список параметров из секции pangolin_dcs и их описание:

Параметр

Описание

self_addr

Адрес текущего узла в формате IP-Address:port

partner_addrs

Список адресов остальных узлов в формате IP-Address1:port1, IP-Address2: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 МБ, минимальное значение 8192 байт

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

Пример postgres.yml для разных узлов кластера, без сертификатов:

Мастер
scope: clustername
name: {master_host}

restapi:
listen: 0.0.0.0:8008
connect_address: {master_host}:8008
allowlist: []
allowlist_include_members: true
authentication:
username: patroniyml
password: password
pangolin_dcs:
self_addr: {master_host}:2481
partner_addrs: {replica_host}:2481,{arbiter_host}:2481
data_dir: /pgdata/0{base_version}/raft_data
journal_max_size: 10485760
journal_wait_timeout: 10
memory_journal_size: 10000
journal_force_read_wait: true
dump_dir: /pgdata/0{base_version}/raft_dump
dump_interval: 300
dump_wait_timeout: 10
logfile: /pgerrorlogs/0{base_version}/raft/raft.log
log_max_size: 20971520
log_rotation_period: 1d
heartbeat_interval: 1000
election_timeout: 5000
ctl:
retry_timeout: 10
restapi:
listen: 0.0.0.0:8009
connect_address: {master_host}:8009
partner_address: {replica_host}:8009,{arbiter_host}:8009
allowlist: []
allowlist_include_members: true
authentication:
username: pangolindcs
password: password
log:
dir: /pgerrorlogs/0{base_version}/pangolin-manager
file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
destination: file
file_mode: 600
redirect_min_size: 10
bootstrap:
dcs:
ttl: 135
retry_timeout: 60
loop_wait: 10
maximum_lag_on_failover: 1048576
synchronous_mode: true
synchronous_mode_strict: false
postgresql:
parameters:
max_connections: '110'
max_worker_processes: '32'
max_prepared_transactions: '12'
wal_level: replica
wal_log_hints: on
track_commit_timestamp: off
wal_keep_size: 1GB
max_wal_senders: '10'
max_replication_slots: '10'
logical_decoding_work_mem: 64MB
auth_activity_period: '60'
authentication_max_workers: '16'
use_pg_rewind: true
use_slots: true
initdb:
- encoding: UTF8
- data-checksums
- locale: en_US.UTF-8
postgresql:
listen: 0.0.0.0:5433
bin_dir: /usr/pangolin-{short_version}/bin
bin_dir_client: /usr/pangolin-dbms-client-{short_version}/bin
connect_address: {master_host}:5433
data_dir: /pgdata/0{base_version}/data/
create_replica_methods:
- basebackup
basebackup:
format: plain
wal-method: fetch
authentication:
replication:
username: patroni
password: password
database: replication
superuser:
username: patroni
password: password
callbacks:
on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
parameters:
{}
pg_hba:
- host all postgres 127.0.0.1/32 scram-sha-256
- host all profile_tuz 127.0.0.1/32 scram-sha-256
- host all patroni 127.0.0.1/32 scram-sha-256
- host all postgres {replica_ip}/32 scram-sha-256
- host all patroni {replica_ip}/32 scram-sha-256
- host all profile_tuz {replica_ip}/32 scram-sha-256
- host all postgres {master_ip}/32 scram-sha-256
- host all patroni {master_ip}/32 scram-sha-256
- host all profile_tuz {master_ip}/32 scram-sha-256
- host replication patroni 127.0.0.1/32 scram-sha-256
- host replication patroni {replica_ip}/32 scram-sha-256
- host replication patroni {master_ip}/32 scram-sha-256
- host all +as_TUZ, backup_user 0.0.0.0/0 scram-sha-256
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
  1. Добавьте пользователя patroni:

    CREATE USER "patroni" WITH ENCRYPTED PASSWORD 'password' NOINHERIT;
    ALTER ROLE "patroni" LOGIN SUPERUSER REPLICATION NOINHERIT VALID UNTIL 'infinity' CONNECTION LIMIT 5;
  2. Включите сервис Pangolin Manager для автоматического запуска после перезагрузки ОС:

    sudo systemctl enable pangolin-manager

Добавление реплики в кластер

Сведения

Добавление новых узлов в кластер предполагает наличие на них СУБД Pangolin.

  1. Установите rpm/deb-пакеты компонента pangolin-manager и его зависимость pangolin-manager-venv, как указано в первом пункте раздела «Установка и настройка Pangolin Manager и Pangolin DCS».

  2. Создайте директории и измените привилегии:

    sudo mkdir /pgdata/0{base_version}/raft_data
    sudo mkdir /pgdata/0{base_version}/raft_dump
    sudo chown postgres:postgres /pgdata/0{base_version}/raft_data
    sudo chown postgres:postgres /pgdata/0{base_version}/raft_dump
    sudo chmod -R 770 /pgdata/0{base_version}/raft_data
    sudo chmod -R 770 /pgdata/0{base_version}/raft_dump
    sudo mkdir /pgerrorlogs/0{base_version}/raft
    sudo mkdir /pgerrorlogs/0{base_version}/pangolin-manager
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  3. При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл .bash_profile с помощью текстового редактора. Пример заполнения .bash_profile:

    .bash_profile
    # .bash_profile

    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    # User specific environment and startup programs
    export PG_LICENSE_PATH=/opt/pangolin_license
    export PGHOME=/usr/pangolin-{short_version}
    export PGHOME_CLIENT=/usr/pangolin-dbms-client-{short_version}
    export PGDATABASE=postgres
    export PGUSER=postgres
    export PGHOST=$(hostname -i)
    export PGPORT=5433
    export PGCLIENTENCODING=UTF8
    NOW=$(date +"%Y-%m-%d")
    export PGDATA=/pgdata/0{base_version}/data
    export MANPATH=$MANPATH:$PGHOME/share/man
    alias errors="ls -t /pgerrorlogs/0{base_version}/postgresql-$NOW*.log | head -1 | xargs tail -F | grep -E 'WARNING|ERROR|FATAL|ПРЕДУПРЕЖДЕНИЕ|ОШИБКА|ВАЖНО'"
    alias hba='nano $PGDATA/pg_hba.conf'
    alias pglog='ls -t /pgerrorlogs/0{base_version}/postgresql-$NOW*.log | head -1 | xargs tail -n 300'
    alias pgver="psql -c 'select version();' | sed \"s| on | (\$(psql --single-line --no-align -c 'select product_version();' | sed '2q;d' )) on |\""
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    # pangolin-manager
    export PATH=$PATH:/opt/pangolin-manager/bin/
    alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLNAME'
    alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLNAME'
    alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLNAME'
    alias pgconfig='curl -k -s -m 3 https://$(hostname -f):8008/config | jq'
    alias ptlog='ls -t /pgerrorlogs/0{base_version}/pangolin-manager/pangolin-manager*.log | head -1 | xargs tail -n 300'
    alias ptver="pangolin-manager-ctl version"
    alias reload='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload $CLNAME'
    alias restart='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLNAME'
    alias status='systemctl --user status pangolin-manager --no-pager --full'
    alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLNAME'
    umask 022
    export CLNAME=clustername
    # pangolin-manager-dcs
    alias rlog='cat /pgerrorlogs/0{base_version}/raft/raft.log'
    alias members="pangolin-dcs-ctl member list"
    alias elist="pangolin-dcs-ctl endpoint status --endpoints='{master_host}:8009,{replica_host}:8009,{arbiter_host}:8009'"
    alias health="pangolin-dcs-ctl endpoint health --endpoints='{master_host}:8009,{replica_host}:8009,{arbiter_host}:8009'"
  4. Отредактируйте конфигурационный файл Pangolin Manager /etc/pangolin-manager/postgres.yml, пример представлен в пункте 4 раздела «Установка и настройка Pangolin Manager и Pangolin DCS».

  5. Если экземпляр СУБД запущен на реплике, то остановите СУБД командой pg_ctl stop.

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

    sudo systemctl enable pangolin-manager

Добавление арбитра в кластер

Сведения

На арбитре не требуется наличие установленной СУБД.

  1. Пройдите первые два пункта раздела «Установка и настройка Pangolin Manager и Pangolin DCS».

  2. Установите файл лицензии:

    sudo mkdir /opt/pangolin_license
    sudo cp /путь/до/лицензии/license.json /opt/pangolin_license/license.json
    sudo chown -R postgres:pangolin_users /opt/pangolin_license
    sudo chmod -R 770 /opt/pangolin_license
  3. При необходимости изменить пути, наименования и адреса будущих узлов кластера добавьте переменные окружения, выполните пункт 3 раздела «Установка и настройка Pangolin Manager и Pangolin DCS».

  4. Отредактируйте конфигурационный файл Pangolin Manager /etc/pangolin-manager/postgres.yml, пример представлен в пункте 4 раздела «Установка и настройка Pangolin Manager и Pangolin DCS».

  5. Включите сервис Pangolin Manager, для автоматического запуска после перезагрузки ОС:

    sudo systemctl enable pangolin-manager

Завершающие действия

  1. Выполните запуск сервиса Pangolin Manager поочередно, на всех узлах кластера начиная с мастера:

    sudo systemctl start pangolin-manager
  2. Проверьте статус сервиса на всех узлах:

    sudo systemctl status pangolin-manager

    Пример успешного статуса мастера:

    Успешный статус мастера
       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 Mon 2025-09-29 05:25:19 MSK; 16s ago
    Process: 158989 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
    Process: 158987 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
    Main PID: 158991 (pangolin-manage)
    Tasks: 22 (limit: 500662)
    Memory: 207.7M
    CGroup: /system.slice/pangolin-manager.service
    ├─158991 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─159070 /usr/pangolin-{short_version}/bin/postgres -D /pgdata/0{base_version}/data/ --config-file=/pgdata/0{base_version}/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=clustername --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=12 --max_locks_per_t>
    ├─159081 postgres: clustername: logger
    ├─159082 postgres: clustername: checkpointer
    ├─159083 postgres: clustername: background writer
    ├─159085 postgres: clustername: idle sessions terminator
    ├─159086 postgres: clustername: integrity check launcher
    ├─159087 postgres: clustername: license checker
    ├─159088 postgres: clustername: authproc
    ├─159089 postgres: clustername: password policy cache
    ├─159118 postgres: clustername: patroni postgres 127.0.0.1(55644) idle
    ├─159136 postgres: clustername: walwriter
    ├─159137 postgres: clustername: autovacuum launcher
    ├─159138 postgres: clustername: autounite launcher
    ├─159139 postgres: clustername: pg_cron launcher
    └─159141 postgres: clustername: logical replication launcher

    Sep 29 05:25:19 {replica_host} systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...
    Sep 29 05:25:19 {replica_host} systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.
    Sep 29 05:25:19 {replica_host} pangolin-manager.bin[158991]: 2025-09-29 05:25:19,928 INFO: LOG output redirection: new log destination is /pgerrorlogs/0{base_version}/pangolin-manager/pangolin-manager-2025-09-29_052519.log
    Sep 29 05:25:27 {replica_host} sudo[159125]: postgres : TTY=unknown ; PWD=/opt/pangolin-manager ; USER=root ; COMMAND=/bin/systemctl restart pangolin-pooler
  3. Проверьте готовность dcs-кластера. Для этого выполните:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list clustername

    Или командой list, если есть соответствующий alias.

    Ожидаемый вывод команды:

    + Cluster: clustername ({cluster_id}) ------+---------+----+-----------+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +----------------+---------------------+--------------+-----------+----+-----------+
    | {master_host} | {master_host}:5433 | Sync Standby | streaming | 4 | 0 |
    | {replica_host} | {replica_host}:5433 | Leader | running | 4 | |
    +----------------+---------------------+--------------+-----------+----+-----------+

    Возможны ситуации, когда кластер потребует перезагрузки или перечитать параметры. При выводе команды list это отображается так:

    [postgres@srv-name ~]$ list

    + Cluster: clustername ({cluster_id}) -----+---------+---------+------+-------+-----------------+
    | Member | Host | Role | State | TL | Lag in MB | Pending restart |
    +-----------------+----------------------+---------+---------+----+-----------+-----------------+
    | {master_host} | {master_host}:5433 | Leader | running | 2 | | * |
    | {replica_host} | {replica_host}:5433 | Replica | running | 2 | 0 | |
    +-----------------+----------------------+---------+---------+----+-----------+-----------------+

    В таком случае от имени пользователя postgres необходимо выполнить restart, если есть соответствующий alias или команду:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername

    Выполните команду health или команду:

    pangolin-dcs-ctl endpoint health --endpoints='{master_host}:8009,{replica_host}:8009,{arbiter_host}:8009'

    Где endpoints – узлы кластера.

    Ожидаемый вывод команды:

    {master_host}:2481 is healthy
    {replica_host}:2481 is healthy
    {arbiter_host}:2481 is healthy
  4. Если возникла ошибки вида CRITICAL: system ID mismatch, node srv-name belongs to a different cluster: {cluster_id} != {cluster_id} – это означает, что добавляемая реплика была инициализирована до включения в кластер, для устранения проблемы необходимо выполнить очистку директории /pgdata/0{base_version}/data и /pgdata/0{base_version}/data/tablespaces.

Реконфигурация СУБД с установкой и настройкой компонентов Pangolin Manager и etcd

Установка и настройка Pangolin Manager и etcd

Сведения

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

  1. Установите rpm/deb-пакеты компонентов etcd, pangolin-manager:

    sudo yum install etcd

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

    Пример команды:

    sudo yum install -y /путь/к/утилите/pangolin-manager-{version_component}-sberlinux8.x86_64.rpm
  2. Отредактируйте файл конфигурации etcd, в нем необходимо указать адреса будущих узлов кластера, ниже приведен пример с настройками TLS:

    etcd.conf
    sudo nano /etc/etcd/etcd.conf

    ETCD_NAME="{master_host}"
    ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="https://{master_host}:2379"
    ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://{master_host}:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd_clustername"
    ETCD_INITIAL_CLUSTER="{master_host}=https://{master_host}:2380,{replica_host}=https://{replica_host}:2380,{arbiter_host}=https:// {arbiter_host}: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_LOG_OUTPUTS="/pgerrorlogs/0{base_version}/etcd/etcd.log"
    # TLS settings
    ETCD_CIPHER_SUITES="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
    ETCD_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_PEER_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_PEER_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_CLIENT_CERT_AUTH="true"
    ETCD_PEER_CRL_FILE=""

  3. Запуск etcd будет осуществляться под пользователем postgres. Владельца и права на каталоги c хранилищем etcd измените в зависимости от пользователя:

    sudo chown postgres:postgres /var/lib/etcd
    sudo chmod -R 700 /var/lib/etcd
    sudo chown -R postgres:postgres /etc/etcd
    sudo chmod -R 700 /etc/etcd

    Создайте директории для хранения логов:

    sudo mkdir -p /pgerrorlogs/0{base_version}/etcd
    sudo mkdir /pgerrorlogs/0{base_version}/pangolin-manager
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  4. Отредактируйте unit файл службы etcd (измените поле User в файле etcd.service на того, от кого имени будет запущен сервис, в примере указан postgres):

    sudo nano /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
  5. Отредактируйте конфигурационный файл Pangolin Manager /etc/pangolin-manager/postgres.yml, ниже представлены примеры с использованием сертификатов:

    Мастер
    scope: clustername
    name: {master_host}

    restapi:
    listen: 0.0.0.0:8008
    connect_address: {master_host}.:8008
    allowlist: []
    allowlist_include_members: true
    ciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1
    verify_client: optional
    certfile: /pg_ssl/patroni_server.crt
    keyfile: /pg_ssl/patroni_server.key
    cafile: /pg_ssl/root.crt
    capath: /pg_ssl/root_dir
    crlpath: /pg_ssl/crl
    crlfile: /pg_ssl/crl/intermediate.crl
    authentication:
    username: patroniyml
    password: pass
    etcd:
    hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379
    protocol: https
    cacert: /pg_ssl/root.crt
    cert: /pg_ssl/patronietcd.crt
    key: /pg_ssl/patronietcd.key
    username: patronietcd
    password: pass
    log:
    dir: /pgerrorlogs/0{base_version}/pangolin-manager
    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
    destination: file
    file_mode: 600
    redirect_min_size: 10
    bootstrap:
    dcs:
    ttl: 135
    retry_timeout: 60
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
    synchronous_mode_strict: false
    postgresql:
    parameters:
    max_connections: '110'
    max_worker_processes: '32'
    max_prepared_transactions: '12'
    wal_level: replica
    wal_log_hints: on
    track_commit_timestamp: off
    wal_keep_size: 1GB
    max_wal_senders: '10'
    max_replication_slots: '10'
    logical_decoding_work_mem: 64MB
    auth_activity_period: '60'
    authentication_max_workers: '16'
    use_pg_rewind: true
    use_slots: true
    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF-8
    postgresql:
    listen: 0.0.0.0:5433
    bin_dir: /usr/pangolin-{short_version}/bin
    bin_dir_client: /usr/pangolin-dbms-client-{short_version}/bin
    connect_address: {master_host}:5433
    data_dir: /pgdata/0{base_version}/data/
    create_replica_methods:
    - basebackup
    basebackup:
    format: plain
    wal-method: fetch
    authentication:
    replication:
    username: patroni
    password: pass
    database: replication
    sslmode: verify-ca
    sslcrldir: /pg_ssl/crl
    sslcrl: /pg_ssl/crl/intermediate.crl
    sslkey: /pg_ssl/patroni.key
    sslcert: /pg_ssl/patroni.crt
    sslrootcert: /pg_ssl/root.crt
    sslrootpath: /pg_ssl/root_dir
    superuser:
    username: patroni
    password: pass
    sslmode: verify-ca
    sslcrldir: /pg_ssl/crl
    sslcrl: /pg_ssl/crl/intermediate.crl
    sslkey: /pg_ssl/patroni.key
    sslcert: /pg_ssl/patroni.crt
    sslrootcert: /pg_ssl/root.crt
    sslrootpath: /pg_ssl/root_dir
    callbacks:
    on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    parameters:
    {}
    pg_hba:
    - host all postgres 127.0.0.1/32 scram-sha-256
    - host all profile_tuz 127.0.0.1/32 scram-sha-256
    - host all patroni 127.0.0.1/32 scram-sha-256
    - host all postgres {replica_ip}/32 scram-sha-256
    - host all patroni {replica_ip}/32 scram-sha-256
    - host all profile_tuz {replica_ip}/32 scram-sha-256
    - host all postgres {master_ip}/32 scram-sha-256
    - host all patroni {master_ip}/32 scram-sha-256
    - host all profile_tuz {master_ip}/32 scram-sha-256
    - host replication patroni 127.0.0.1/32 scram-sha-256
    - host replication patroni {replica_ip}/32 scram-sha-256
    - host replication patroni {master_ip}/32 scram-sha-256

    - host all +as_TUZ, backup_user 0.0.0.0/0 scram-sha-256

    tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

    Пример файла postgres.yml без использования сертификатов:

    Мастер
    scope: clustername
    name: {master_host}

    restapi:
    listen: 0.0.0.0:8008
    connect_address: {master_host}:8008
    allowlist: []
    allowlist_include_members: true
    authentication:
    username: patroniyml
    password: pass
    etcd:
    hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379
    protocol: http
    username: patronietcd
    password: pass
    log:
    dir: /pgerrorlogs/0{base_version}/pangolin-manager
    file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
    destination: file
    file_mode: 600
    redirect_min_size: 10
    bootstrap:
    dcs:
    ttl: 135
    retry_timeout: 60
    loop_wait: 10
    maximum_lag_on_failover: 1048576
    synchronous_mode: true
    synchronous_mode_strict: false
    postgresql:
    parameters:
    max_connections: '110'
    max_worker_processes: '32'
    max_prepared_transactions: '12'
    wal_level: replica
    wal_log_hints: on
    track_commit_timestamp: off
    wal_keep_size: 1GB
    max_wal_senders: '10'
    max_replication_slots: '10'
    logical_decoding_work_mem: 64MB
    auth_activity_period: '60'
    authentication_max_workers: '16'
    use_pg_rewind: true
    use_slots: true
    initdb:
    - encoding: UTF8
    - data-checksums
    - locale: en_US.UTF-8
    postgresql:
    listen: 0.0.0.0:5433
    bin_dir: /usr/pangolin-{short_version}/bin
    bin_dir_client: /usr/pangolin-dbms-client-{short_version}/bin
    connect_address: {master_host}:5433
    data_dir: /pgdata/0{base_version}/data/
    create_replica_methods:
    - basebackup
    basebackup:
    format: plain
    wal-method: fetch
    authentication:
    replication:
    username: patroni
    password: pass
    database: replication
    superuser:
    username: patroni
    password: pass
    callbacks:
    on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    parameters:
    {}
    pg_hba:
    - host all postgres 127.0.0.1/32 scram-sha-256
    - host all profile_tuz 127.0.0.1/32 scram-sha-256
    - host all patroni 127.0.0.1/32 scram-sha-256
    - host all postgres {replica_ip}/32 scram-sha-256
    - host all patroni {replica_ip}/32 scram-sha-256
    - host all profile_tuz {replica_ip}/32 scram-sha-256
    - host all postgres {master_ip}/32 scram-sha-256
    - host all patroni {master_ip}/32 scram-sha-256
    - host all profile_tuz {master_ip}/32 scram-sha-256
    - host replication patroni 127.0.0.1/32 scram-sha-256
    - host replication patroni {replica_ip}/32 scram-sha-256
    - host replication patroni {master_ip}/32 scram-sha-256

    - host all +as_TUZ, backup_user 0.0.0.0/0 scram-sha-256

    tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
  6. Создайте пользователя Patroni:

    psql
    CREATE USER "patroni" WITH ENCRYPTED PASSWORD 'Password' NOINHERIT;
    ALTER ROLE "patroni" LOGIN SUPERUSER REPLICATION NOINHERIT VALID UNTIL 'infinity' CONNECTION LIMIT 5;
    \q

    Выполните остановку СУБД:

    pg_ctl stop

Добавление реплики в кластер

Сведения

Добавление новых узлов в кластер предполагает наличие на них СУБД Pangolin.

  1. Установите rpm/deb-пакеты компонентов etcd, pangolin-manager как указано в первом пункте раздела «Установка и настройка Pangolin Manager и etcd».

  2. Отредактируйте файл конфигурации etcd, ниже приведен пример с настройками TLS:

    etcd.conf
    sudo nano /etc/etcd/etcd.conf

    ETCD_NAME="{replica_host}"
    ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="https:/{replica_host}:2379"
    ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https:/{replica_host}:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd_clustername"
    ETCD_INITIAL_CLUSTER="{master_host}=https:/{master_host}:2380,{replica_host}=https:/{replica_host}:2380,{arbiter_host}=https:// {arbiter_host}: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_LOG_OUTPUTS="/pgerrorlogs/0{base_version}/etcd/etcd.log"
    # TLS settings
    ETCD_CIPHER_SUITES="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
    ETCD_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_PEER_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_PEER_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_CLIENT_CERT_AUTH="true"
    ETCD_PEER_CRL_FILE=""
  3. Запуск etcd будет осуществляться под пользователем postgres. Поэтому необходимо поправить владельцев и права на каталоги c хранилищем etcd, конфигурацией etcd:

    sudo chown postgres:postgres /var/lib/etcd
    sudo chmod -R 700 /var/lib/etcd
    sudo chown -R postgres:postgres /etc/etcd
    sudo chmod -R 700 /etc/etcd

    Создайте директории для хранения логов:

    sudo mkdir -p /pgerrorlogs/0{base_version}/etcd
    sudo mkdir /pgerrorlogs/0{base_version}/pangolin-manager
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  4. Отредактируйте unit файл службы etcd (измените поле User в файле etcd.service):

    sudo nano /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
  5. Отредактируйте конфигурационные файлы pangolin-manager. Пример представлен в пункте 5 раздела «Установка и настройка Pangolin Manager и etcd», вкладка replica.

Добавление арбитра в кластер

Сведения

На арбитре не требуется наличие установленной СУБД.

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

    sudo yum install etcd
  2. Создайте пользователя postgres, если он отсутствует на узле арбитра:

    sudo useradd -m -r -d /home/postgres \-s /bin/bash postgres

    Опции команды useradd:

    • -m - создать домашний каталог для пользователя;
    • -r - пользователь системный;
    • -d - каталог файловой системы, назначенный домашним для этого пользователя;
    • -s - назначить оболочку.

В примере обертка для зарегистрированного пользователя postgres - /bin/bash, так как ему потребуется возможность использования интерактивных сеансов Bash.

  1. Установить файл лицензии:

    sudo mkdir /opt/pangolin_license
    sudo cp /путь/до/лицензии/license.json /opt/pangolin_license/license.json
    sudo chown -R postgres:postgres /opt/pangolin_license
    sudo chmod -R 770 /opt/pangolin_license
  2. Отредактируйте файл конфигурации etcd, ниже приведен пример с настройками TLS:

    etcd.conf
    sudo nano /etc/etcd/etcd.conf

    ETCD_NAME="{arbiter_host}"
    ETCD_LISTEN_CLIENT_URLS="https://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="https:/{arbiter_host}:2379"
    ETCD_LISTEN_PEER_URLS="https://0.0.0.0:2380"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https:/{arbiter_host}:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd_clustername"
    ETCD_INITIAL_CLUSTER="{master_host}=https:/{master_host}:2380,{replica_host}=https:/{replica_host}:2380,{arbiter_host}=https:/ {arbiter_host}: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_LOG_OUTPUTS="/pgerrorlogs/0{base_version}/etcd/etcd.log"
    # TLS settings
    ETCD_CIPHER_SUITES="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
    ETCD_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_TRUSTED_CA_FILE="/pg_ssl/root.crt"
    ETCD_PEER_CERT_FILE="/pg_ssl/etcd.crt"
    ETCD_PEER_KEY_FILE="/pg_ssl/etcd.key"
    ETCD_PEER_CLIENT_CERT_AUTH="true"
    ETCD_PEER_CRL_FILE=""
  3. Запуск etcd будет осуществляться под пользователем postgres. Поэтому необходимо поправить владельцев и права на каталоги c хранилищем etcd, конфигурацией etcd:

    sudo chown postgres:postgres /var/lib/etcd
    sudo chmod -R 700 /var/lib/etcd
    sudo chown -R postgres:postgres /etc/etcd
    sudo chmod -R 700 /etc/etcd

    Создайте директории для хранения логов

    sudo mkdir -p /pgerrorlogs/0{base_version}/etcd
    sudo chown -R postgres:postgres /pgerrorlogs
    sudo chmod -R 770 /pgerrorlogs
  4. Отредактируйте unit файл службы etcd (измените поле User в файле etcd.service):

    sudo nano /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

Завершающие действия

  1. Запустите etcd последовательно, на всех узлах кластера, начиная с мастера:

    sudo systemctl daemon-reload
    sudo systemctl start etcd
  2. Проверьте состояние узлов кластера, пример команды:

    ETCDCTL_API=3 etcdctl --endpoints={master_host}:2379,{replica_host}:2379,{arbiter_host}:2379 --cert="/pg_ssl/etcd.crt" --key="/pg_ssl/etcd.key" --cacert="/pg_ssl/root.crt" endpoint status -w table --cluster

    +-----------------------------+--------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +-----------------------------+--------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | https://{arbiter_host}:2379 | {hash} | 3.5.21 | 20 kB | false | false | 2 | 1357138 | 1357138 | |
    | https://{replica_host}:2379 | {hash} | 3.5.21 | 20 kB | true | false | 2 | 1357138 | 1357138 | |
    | https://{master_host}:2379 | {hash} | 3.5.21 | 20 kB | false | false | 2 | 1357138 | 1357138 | |
    +-----------------------------+--------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  3. Если все узлы кластера работоспособны, добавьте etcd в автозапуск:

    sudo systemctl enable etcd
  4. Выполните запуск сервиса Pangolin Manager поочередно, на всех узлах кластера начиная с мастера:

    sudo systemctl start pangolin-manager
  5. Проверьте статус сервиса на всех узлах:

    sudo systemctl status pangolin-manager

    Пример успешного статуса с мастера:

    Успешный статус мастера
    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 2025-10-07 04:54:33 MSK; 3 days ago
    Process: 1575370 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
    Process: 1575368 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
    Main PID: 1575372 (pangolin-manage)
    Tasks: 22 (limit: 50662)
    Memory: 439.7M
    CGroup: /system.slice/pangolin-manager.service
    ├─1575372 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
    ├─2174410 /usr/pangolin-{short_version}/bin/postgres -D /pgdata/0{base_version}/data/ --config-file=/pgdata/0{base_version}/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=clustername --wal_level=replica --hot_standby=on --max_connections=20 --max_wal_senders=10 --max_prepared_transact>
    ├─2174413 postgres: clustername: logger
    ├─2174414 postgres: clustername: checkpointer
    ├─2174415 postgres: clustername: background writer
    ├─2174417 postgres: clustername: idle sessions terminator
    ├─2174418 postgres: clustername: walwriter
    ├─2174419 postgres: clustername: autovacuum launcher
    ├─2174420 postgres: clustername: autounite launcher
    ├─2174421 postgres: clustername: integrity check launcher
    ├─2174422 postgres: clustername: license checker
    ├─2174423 postgres: clustername: authproc
    ├─2174424 postgres: clustername: password policy cache
    ├─2174425 postgres: clustername: pg_cron launcher
    ├─2174426 postgres: clustername: logical replication launcher
    ├─2174439 postgres: clustername: patroni postgres 127.0.0.1(34508) idle
    └─2174472 postgres: clustername: walsender patroni {replica_ip}(48750) streaming 3/71019B20

    Oct 07 04:54:33 {master_host} systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...
    Oct 07 04:54:33 {master_host} systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.
    Oct 07 04:54:33 {master_host} pangolin-manager.bin[1575372]: 2025-10-07 04:54:33,639 INFO: LOG output redirection: new log destination is /pgerrorlogs/0{base_version}/pangolin-manager/pangolin-manager-2025-10-07_045433.log
    Oct 10 08:51:47 {master_host} sudo[2173528]: postgres : TTY=unknown ; PWD=/opt/pangolin-manager ; USER=root ; COMMAND=/bin/systemctl restart pangolin-pooler
  6. Проверьте состояние кластера. Для этого выполните:

/opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list clustername

Или выполните команду list, если есть соответствующий alias в .bash_profile. Ожидаемый вывод команды:


+ Cluster: clustername ({cluster_id}) ------+-------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------------+-------------------+--------------+-----------+----+-----------+
| {master_host} | {master_host}:5433 | Sync Standby | streaming | 4 | 0 |
| {master_host} | {master_host}:5433 | Leader | running | 4 | |
+----------------+-------------------+--------------+-----------+----+-----------+