Реконфигурация 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
Действия выполняются на мастере будущего кластера.
-
Установите rpm/deb-пакеты компонента
pangolin-managerи его зависимостьpangolin-manager-venv:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm
sudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpmsudo apt install pangolin-manager-venv-{version_component}_amd64.deb
sudo apt install pangolin-manager-{version_component}_amd64.debsudo apt-get install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpm
sudo apt-get 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" -
Создайте директории, измените привилегии:
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 -
При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл
.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" -
Отредактируйте конфигурационный файл
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Реплика
scope: clustername
name: {replica_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {replica_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: {replica_host}:2481 #Адрес текущего узла
partner_addrs: {master_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
restapi:
listen: 0.0.0.0:8009
connect_address: {replica_host}:8009
partner_address: {master_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: {replica_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Арбитр
scope: clustername
name: {arbiter_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {arbiter_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: {arbiter_host}:2481 #Адрес текущего узла
partner_addrs: {master_host}:2481,{replica_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
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
verify_client: optional
verify_server: true
no_tls1_3: false
ctl:
retry_timeout: 10
restapi:
listen: 0.0.0.0:8009
connect_address: {arbiter_host}:8009
partner_address: {master_host}:8009,{replica_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'
use_pg_rewind: true
use_slots: true
initdb:
- encoding: UTF8
- data-checksums
tags:
nofailover: true
noloadbalance: false
clonefrom: false
nosync: trueСписок параметров из секции
pangolin_dcsи их описание:
Параметр | Описание |
|---|---|
| Адрес текущего узла в формате |
| Список адресов остальных узлов в формате |
| Путь к директории для хранения журнала операций и текущих значений ключей |
| Максимальный размер в байтах для файла с журналом операций, значение по умолчанию – |
| Время тайм-аута, по истечении которого операция записи/чтения журнала считается неуспешной, по умолчанию равен параметру |
| Число максимально содержащихся в памяти последних записей журнала, значение по умолчанию – |
| Если равен |
| Путь к директории для хранения дампа, по умолчанию равен |
| Интервал создания дампа, в секундах, по умолчанию равен |
| Время тайм-аута, по истечении которого операция записи/чтения дампа считается неуспешной, по умолчанию равен параметру |
| Путь к файлу с логом от |
| Максимальный размер в байтах для файла с логом |
| Интервал ротации файла с логом |
| Время в миллисекундах, раз в которое мастер DCS-кластера будет сообщать о себе остальным узлам |
| Время в миллисекундах, по прошествии которого при неполучении |
| Серверный сертификат Pangolin DCS для установления SSL-подключений |
| Закрытый ключ Pangolin DCS, соответствующий серверному сертификату |
| Пароль для рассекречивания закрытого ключа (если защищен паролем) |
| Корневой сертификат УЦ (CA) |
| Директория, содержащая файлы с доверенными сертификатами УЦ (CA) |
| Файл со списком отозванных сертификатов (CRL) |
| Директория, содержащая файлы со списком отозванных сертификатов (CRL) |
| Файл в формате JSON, содержащий данные для запроса сертификата из SecMan или парольную фразу для доступа к контейнеру PKCS#12 и путь к контейнеру |
| Определяет, требуется ли запрашивать и проверять клиентский сертификат DCS. Возможные значения:
|
| Определяет, требуется ли запрашивать и проверять серверный сертификат DCS. Возможные значения: |
| На серверах с установленным OpenSSL 1.1.0 и выше позволяет переключиться с протокола TLSv1.3 на TLSv1.2. Возможные значения: |
Пример 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
Реплика
scope: clustername
name: {replica_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {replica_host}t:8008
allowlist: []
allowlist_include_members: true
authentication:
username: patroniyml
password: password
pangolin_dcs:
self_addr: {replica_host}:2481
partner_addrs: {master_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: {replica_host}:8009
partner_address: {master_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: {replica_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
Арбитр
scope: clustername
name: {arbiter_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {arbiter_host}:8008
allowlist: []
allowlist_include_members: true
authentication:
username: patroniyml
password: password
pangolin_dcs:
self_addr: {arbiter_host}:2481
partner_addrs: {master_host}:2481,{replica_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: {arbiter_host}:8009
partner_address: {master_host}:8009,{replica_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'
use_pg_rewind: true
use_slots: true
initdb:
- encoding: UTF8
- data-checksums
tags:
nofailover: true
noloadbalance: false
clonefrom: false
nosync: true
-
Добавьте пользователя
patroni:CREATE USER "patroni" WITH ENCRYPTED PASSWORD 'password' NOINHERIT;
ALTER ROLE "patroni" LOGIN SUPERUSER REPLICATION NOINHERIT VALID UNTIL 'infinity' CONNECTION LIMIT 5; -
Включите сервис Pangolin Manager для автоматического запуска после перезагрузки ОС:
sudo systemctl enable pangolin-manager
Добавление реплики в кластер
Добавление новых узлов в кластер предполагает наличие на них СУБД Pangolin.
-
Установите rpm/deb-пакеты компонента
pangolin-managerи его зависимостьpangolin-manager-venv, как указано в первом пункте раздела «Установка и настройка Pangolin Manager и Pangolin DCS». -
Создайте директории и измените привилегии:
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 -
При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл
.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'" -
Отредактируйте конфигурационный файл Pangolin Manager
/etc/pangolin-manager/postgres.yml, пример представлен в пункте 4 раздела «Установка и настройка Pangolin Manager и Pangolin DCS». -
Если экземпляр СУБД запущен на реплике, то остановите СУБД командой
pg_ctl stop. -
Включите сервис Pangolin Manager для автоматического запуска после перезагрузки ОС:
sudo systemctl enable pangolin-manager
Добавление арбитра в кластер
На арбитре не требуется наличие установленной СУБД.
-
Пройдите первые два пункта раздела «Установка и настройка Pangolin Manager и Pangolin DCS».
-
Установите файл лицензии:
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 раздела «Установка и настройка Pangolin Manager и Pangolin DCS».
-
Отредактируйте конфигурационный файл Pangolin Manager
/etc/pangolin-manager/postgres.yml, пример представлен в пункте 4 раздела «Установка и настройка Pangolin Manager и Pangolin DCS». -
Включите сервис Pangolin Manager, для автоматического запуска после перезагрузки ОС:
sudo systemctl enable pangolin-manager
Завершающие действия
-
Выполните запуск сервиса Pangolin Manager поочередно, на всех узлах кластера начиная с мастера:
sudo systemctl start pangolin-manager -
Проверьте статус сервиса на всех узлах:
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 -
Проверьте готовность 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 -
Если возникла ошибки вида
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
Действия выполняются на мастере будущего кластера.
-
Установите rpm/deb-пакеты компонентов
etcd,pangolin-manager:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo yum install etcd
sudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpmsudo apt install etcd
sudo apt install pangolin-manager-{version_component}_amd64.debsudo apt-get install etcd
sudo apt-get install pangolin-manager-{version_component}-{OS}.x86_64.rpmПример команды:
sudo yum install -y /путь/к/утилите/pangolin-manager-{version_component}-sberlinux8.x86_64.rpm -
Отредактируйте файл конфигурации
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="" -
Запуск
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 -
Отредактируйте
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 -
Отредактируйте конфигурационный файл 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Реплика
scope: clustername
name: {replica_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {replica_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: {replica_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Реплика
scope: clustername
name: {replica_host}
restapi:
listen: 0.0.0.0:8008
connect_address: {replica_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: {replica_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 -
Создайте пользователя 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.
-
Установите rpm/deb-пакеты компонентов
etcd,pangolin-managerкак указано в первом пункте раздела «Установка и настройка Pangolin Manager и etcd». -
Отредактируйте файл конфигурации
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="" -
Запуск
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 -
Отредактируйте
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 -
Отредактируйте конфигурационные файлы
pangolin-manager. Пример представлен в пункте 5 раздела «Установка и настройка Pangolin Manager и etcd», вкладкаreplica.
Добавление арбитра в кластер
На арбитре не требуется наличие установленной СУБД.
-
Установите пакет
etcd:sudo yum install etcd -
Создайте пользователя
postgres, если он отсутствует на узле арбитра:sudo useradd -m -r -d /home/postgres \-s /bin/bash postgresОпции команды
useradd:-m- создать домашний каталог для пользователя;-r- пользователь системный;-d- каталог файловой системы, назначенный домашним для этого пользователя;-s- назначить оболочку.
В примере обертка для зарегистрированного пользователя postgres - /bin/bash, так как ему потребуется возможность использования интерактивных сеансов Bash.
-
Установить файл лицензии:
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 -
Отредактируйте файл конфигурации
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="" -
Запуск
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 -
Отредактируйте
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
Завершающие действия
-
Запустите
etcdпоследовательно, на всех узлах кластера, начиная с мастера:sudo systemctl daemon-reload
sudo systemctl start etcd -
Проверьте состояние узлов кластера, пример команды:
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 | |
+-----------------------------+--------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ -
Если все узлы кластера работоспособны, добавьте
etcdв автозапуск:sudo systemctl enable etcd -
Выполните запуск сервиса Pangolin Manager поочередно, на всех узлах кластера начиная с мастера:
sudo systemctl start pangolin-manager -
Проверьте статус сервиса на всех узлах:
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 -
Проверьте состояние кластера. Для этого выполните:
/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 | |
+----------------+-------------------+--------------+-----------+----+-----------+