Реконфигурация Pangolin из standalone в кластерное решение
В данном разделе описан процесс реконфигурации СУБД Pangolin из standalone конфигурации в кластерное решение, а так же рассмотрено подключение к кластеру дополнительных реплик. Процесс реконфигурации СУБД Pangolin представлен в связке Pangolin Manager и Pangolin DCS и с применением Pangolin Manager и etcd. В статье приведены примеры команд для Platform V SberLinux OS Server (SLO) 9.6 и версии продукта 7.3.2.
Обозначение параметров
В примерах команд далее используются параметры для обозначения имен хостов вместо действительных значений:
- узел мастера:
{master_host}и{master_ip}; - узел реплики:
{replica_host}и{replica_ip}; - узел арбитра:
{arbiter_host}.
Также имеются другие обозначения:
{base_version}– базовая версия продукта (текущая: 7);{short_version}– короткая версия продукта (текущая: 7.3);{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.rpmsudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpmsudo apt install pangolin-manager-venv-{version_component}_amd64.debsudo apt install pangolin-manager-{version_component}_amd64.debsudo apt-get install pangolin-manager-venv-{version_component}-{OS}.x86_64.rpmsudo 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-3.1.1-sberlinux9.x86_64.rpm"sudo yum install -y "/tmp/distr/distributive/pangolin-manager-3.1.1-sberlinux9.x86_64.rpm" -
Создайте директории, измените привилегии:
sudo mkdir /pgdata/07/raft_datasudo mkdir /pgdata/07/raft_dumpsudo chmod -R 770 /pgdata/07/raft_datasudo chmod -R 770 /pgdata/07/raft_dumpsudo chown postgres:postgres /pgdata/07/raft_datasudo chown postgres:postgres /pgdata/07/raft_dumpsudo mkdir -p /pgerrorlogs/pangolin-manager/raftsudo mkdir -p /pgerrorlogs/pangolin-manager -
При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл
.bash_profileс помощью текстового редактора. Пример заполнения.bash_profile:.bash_profile
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programsexport PG_LICENSE_PATH=/opt/pangolin-licenseexport PGHOME=/opt/pangolin-dbms-server-7export PGHOME_CLIENT=/opt/pangolin-dbms-client-7export PGDATABASE=postgresexport PGUSER=postgresexport PGHOST=$(hostname -i)export PGPORT=5433export PGCLIENTENCODING=UTF8NOW=$(date +"%Y-%m-%d")export PGDATA=/pgdata/07/dataexport MANPATH=$MANPATH:$PGHOME/share/manalias errors="ls -t /pgerrorlogs/pangolin-dbms/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/pangolin-dbms/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-managerexport PATH=$PATH:/opt/pangolin-manager/bin/alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLUSTERNAME'alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLUSTERNAME'alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLUSTERNAME'alias pgconfig='curl -k -s -m 3 https://$(hostname -f):8008/config | jq'alias ptlog='ls -t /pgerrorlogs/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 $CLUSTERNAME'alias restart='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLUSTERNAME'alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLUSTERNAME'umask 022export CLNAME=clustername# pangolin-manager-dcsalias rlog='cat /pgerrorlogs/pangolin-manager/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: clusternamename: {master_host}restapi:listen: 0.0.0.0:8008connect_address: {master_host}:8008allowlist: []allowlist_include_members: trueciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlauthentication:username: patroniymlpassword: passwordpangolin_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: 10485760journal_wait_timeout: 10memory_journal_size: 10000journal_force_read_wait: truedump_dir: /pgdata/0{base_version}/raft_dumpdump_interval: 300dump_wait_timeout: 10logfile: /pgerrorlogs/pangolin-manager/raft/raft.loglog_max_size: 20971520log_rotation_period: 1dheartbeat_interval: 1000election_timeout: 5000cafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlverify_client: optionalverify_server: trueno_tls1_3: falsectl:retry_timeout: 10restapi:listen: 0.0.0.0:8009connect_address: {master_host}:8009partner_address: {replica_host}:8009,{arbiter_host}:8009allowlist: []allowlist_include_members: trueauthentication:username: patronietcdpassword: passwordciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keylog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-{base_version}/binbin_dir_client: /opt/pangolin-dbms-client-{base_version}/binconnect_address: {master_host}:5433data_dir: /pgdata/0{base_version}/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passworddatabase: replicationsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dirsuperuser:username: patronipassword: passwordsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dircallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: falseРеплика
scope: clusternamename: {replica_host}restapi:listen: 0.0.0.0:8008connect_address: {replica_host}:8008allowlist: []allowlist_include_members: trueciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlauthentication:username: patroniymlpassword: passwordpangolin_dcs:self_addr: {replica_host}:2481 #Адрес текущего узлаpartner_addrs: {master_host}:2481,{arbiter_host}:2481 #Список адресов остальных узлов кластераdata_dir: /pgdata/07/raft_data #Путь к директории для хранения журнала операций и текущих значений ключей;journal_max_size: 10485760journal_wait_timeout: 10memory_journal_size: 10000journal_force_read_wait: truedump_dir: /pgdata/07/raft_dumpdump_interval: 300dump_wait_timeout: 10logfile: /pgerrorlogs/pangolin-manager/raft/raft.loglog_max_size: 20971520log_rotation_period: 1dheartbeat_interval: 1000election_timeout: 5000cafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlverify_client: optionalverify_server: trueno_tls1_3: falserestapi:listen: 0.0.0.0:8009connect_address: {replica_host}:8009partner_address: {master_host}:8009,{arbiter_host}:8009allowlist: []allowlist_include_members: trueauthentication:username: patronietcdpassword: passwordciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keylog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-{base_version}/binbin_dir_client: /opt/pangolin-dbms-client-{base_version}/binconnect_address: {replica_host}:5433data_dir: /pgdata/0{base_version}/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passworddatabase: replicationsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dirsuperuser:username: patronipassword: passwordsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dircallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: falseАрбитр
scope: clusternamename: {arbiter_host}restapi:listen: 0.0.0.0:8008connect_address: {arbiter_host}:8008allowlist: []allowlist_include_members: trueciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlauthentication:username: patroniymlpassword: passwordpangolin_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: 10485760journal_wait_timeout: 10memory_journal_size: 10000journal_force_read_wait: truedump_dir: /pgdata/0{base_version}/raft_dumpdump_interval: 300dump_wait_timeout: 10logfile: /pgerrorlogs/pangolin-manager/raft/raft.loglog_max_size: 20971520log_rotation_period: 1dheartbeat_interval: 1000election_timeout: 5000certfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlverify_client: optionalverify_server: trueno_tls1_3: falsectl:retry_timeout: 10restapi:listen: 0.0.0.0:8009connect_address: {arbiter_host}:8009partner_address: {master_host}:8009,{replica_host}:8009allowlist: []allowlist_include_members: trueauthentication:username: patronietcdpassword: passwordciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keylog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: Truesynchronous_mode_strict: Falsepostgresql:parameters:max_connections: '110'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksumstags:nofailover: truenoloadbalance: falseclonefrom: falsenosync: 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/07/raft_data
journal_max_size: 10485760
journal_wait_timeout: 10
memory_journal_size: 10000
journal_force_read_wait: true
dump_dir: /pgdata/07/raft_dump
dump_interval: 300
dump_wait_timeout: 10
logfile: /pgerrorlogs/pangolin-manager/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/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: /opt/pangolin-dbms-server-7/bin
bin_dir_client: /opt/pangolin-dbms-client-7/bin
connect_address: {master_host}:5433
data_dir: /pgdata/07/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/07/raft_data
journal_max_size: 10485760
journal_wait_timeout: 10
memory_journal_size: 10000
journal_force_read_wait: true
dump_dir: /pgdata/07/raft_dump
dump_interval: 300
dump_wait_timeout: 10
logfile: /pgerrorlogs/pangolin-manager/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/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: /opt/pangolin-dbms-server-7/bin
bin_dir_client: /opt/pangolin-dbms-client-7/bin
connect_address: {replica_host}:5433
data_dir: /pgdata/07/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/07/raft_data
journal_max_size: 10485760
journal_wait_timeout: 10
memory_journal_size: 10000
journal_force_read_wait: true
dump_dir: /pgdata/07/raft_dump
dump_interval: 300
dump_wait_timeout: 10
logfile: /pgerrorlogs/pangolin-manager/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/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/07/raft_datasudo mkdir /pgdata/07/raft_dumpsudo chmod -R 770 /pgdata/07/raft_datasudo chmod -R 770 /pgdata/07/raft_dumpsudo chown postgres:postgres /pgdata/07/raft_datasudo chown postgres:postgres /pgdata/07/raft_dumpsudo mkdir -p /pgerrorlogs/pangolin-manager/raftsudo chown -R postgres:postgres /pgerrorlogssudo chmod -R 770 /pgerrorlogs -
При необходимости измените пути, наименования и адреса будущих узлов кластера – добавьте их в переменные окружения. Для этого отредактируйте файл
.bash_profileс помощью текстового редактора. Пример заполнения.bash_profile:.bash_profile
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programsexport PG_LICENSE_PATH=/opt/pangolin-licenseexport PGHOME=/opt/pangolin-dbms-server-7export PGHOME_CLIENT=/opt/pangolin-dbms-client-7export PGDATABASE=postgresexport PGUSER=postgresexport PGHOST=$(hostname -i)export PGPORT=5433export PGCLIENTENCODING=UTF8NOW=$(date +"%Y-%m-%d")export PGDATA=/pgdata/07/dataexport MANPATH=$MANPATH:$PGHOME/share/manalias errors="ls -t /pgerrorlogs/pangolin-dbms/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/pangolin-dbms/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-managerexport PATH=$PATH:/opt/pangolin-manager/bin/alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLUSTERNAME'alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLUSTERNAME'alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLUSTERNAME'alias pgconfig='curl -k -s -m 3 https://$(hostname -f):8008/config | jq'alias ptlog='ls -t /pgerrorlogs/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 $CLUSTERNAME'alias restart='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart $CLUSTERNAME'alias status='systemctl --user status pangolin-manager --no-pager --full'alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLUSTERNAME'umask 022export CLNAME=clustername# pangolin-manager-dcsalias rlog='cat /pgerrorlogs/pangolin-manager/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-licensesudo cp /путь/до/лицензии/license.json /opt/pangolin-license/license.jsonsudo chown -R postgres:pangolin_users /opt/pangolin-licensesudo 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 PostgreSQLLoaded: 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 agoProcess: 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.7MCGroup: /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/07/data/ --config-file=/pgdata/07/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 launcherSep 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/pangolin-manager/pangolin-manager-2025-09-29_052519.logSep 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это отображается так:$ 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-1 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
Действия выполняются на мастере будущего кластера.
При настройке etcd версии 3.6.x и выше APIv2 не используется, поскольку данная версия API не поддерживается. Параметр ETCD_ENABLE_V2 в конфигурационном файле etcd.conf для таких версий не указывается.
Если используется etcd версии ниже 3.6.0, необходимость применения параметра ETCD_ENABLE_V2 определяется требованиями используемой конфигурации.
-
Установите rpm/deb-пакеты компонентов
etcd,pangolin-manager:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo yum install etcdsudo dnf install pangolin-manager-{version_component}-{OS}.x86_64.rpmsudo apt install etcdsudo apt install pangolin-manager-{version_component}_amd64.debsudo apt-get install etcdsudo apt-get install pangolin-manager-{version_component}-{OS}.x86_64.rpmПример команды:
sudo yum install -y "/tmp/distr/distributive/pangolin-manager-3.1.1-sberlinux9.x86_64.rpm" -
Отредактируйте файл конфигурации
etcd, в нем необходимо указать адреса будущих узлов кластера, ниже приведен пример с настройками TLS:etcd.conf
sudo nano /etc/etcd/etcd.confETCD_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_LOG_OUTPUTS="/pgerrorlogs/etcd/etcd.log"# TLS settingsETCD_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/etcdsudo chmod -R 700 /var/lib/etcdsudo chown -R postgres:postgres /etc/etcdsudo chmod -R 700 /etc/etcdСоздайте директории для хранения логов:
sudo mkdir -p /pgerrorlogs/etcdsudo mkdir /pgerrorlogs/pangolin-managersudo chown -R postgres:postgres /pgerrorlogssudo chmod -R 770 /pgerrorlogs -
Отредактируйте
unitфайл службыetcd(измените полеUserв файлеetcd.serviceна того, от кого имени будет запущен сервис, в примере указанpostgres):sudo nano /usr/lib/systemd/system/etcd.service[Unit]Description=etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]Type=notifyWorkingDirectory=/var/lib/etcd/EnvironmentFile=-/etc/etcd/etcd.confUser=postgres# set GOMAXPROCS to number of processorsExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 /usr/bin/etcd"Restart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target -
Отредактируйте конфигурационный файл Pangolin Manager
/etc/pangolin-manager/postgres.yml, ниже представлены примеры с использованием сертификатов:- Мастер
- Реплика
Мастер
scope: clusternamename: {master_host}restapi:listen: 0.0.0.0:8008connect_address: {master_host}.:8008allowlist: []allowlist_include_members: trueciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlauthentication:username: patroniymlpassword: passetcd:hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379protocol: httpscacert: /pg_ssl/root.crtcert: /pg_ssl/patronietcd.crtkey: /pg_ssl/patronietcd.keyusername: patronietcdpassword: passlog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-7/binbin_dir_client: /opt/pangolin-dbms-client-7/binconnect_address: {master_host}:5433data_dir: /pgdata/07/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passdatabase: replicationsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dirsuperuser:username: patronipassword: passsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dircallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: falseРеплика
scope: clusternamename: {replica_host}restapi:listen: 0.0.0.0:8008connect_address: {replica_host}:8008allowlist: []allowlist_include_members: trueciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1verify_client: optionalcertfile: /pg_ssl/patroni_server.crtkeyfile: /pg_ssl/patroni_server.keycafile: /pg_ssl/root.crtcapath: /pg_ssl/root_dircrlpath: /pg_ssl/crlcrlfile: /pg_ssl/crl/intermediate.crlauthentication:username: patroniymlpassword: passetcd:hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379protocol: httpscacert: /pg_ssl/root.crtcert: /pg_ssl/patronietcd.crtkey: /pg_ssl/patronietcd.keyusername: patronietcdpassword: passlog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-7/binbin_dir_client: /opt/pangolin-dbms-client-7/binconnect_address: {replica_host}:5433data_dir: /pgdata/07/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passdatabase: replicationsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dirsuperuser:username: patronipassword: passsslmode: verify-casslcrldir: /pg_ssl/crlsslcrl: /pg_ssl/crl/intermediate.crlsslkey: /pg_ssl/patroni.keysslcert: /pg_ssl/patroni.crtsslrootcert: /pg_ssl/root.crtsslrootpath: /pg_ssl/root_dircallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: falseПример файла
postgres.ymlбез использования сертификатов:- Мастер
- Реплика
Мастер
scope: clusternamename: {master_host}restapi:listen: 0.0.0.0:8008connect_address: {master_host}:8008allowlist: []allowlist_include_members: trueauthentication:username: patroniymlpassword: passetcd:hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379protocol: httpusername: patronietcdpassword: passlog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-7/binbin_dir_client: /opt/pangolin-dbms-client-7/binconnect_address: {master_host}:5433data_dir: /pgdata/07/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passdatabase: replicationsuperuser:username: patronipassword: passcallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: falseРеплика
scope: clusternamename: {replica_host}restapi:listen: 0.0.0.0:8008connect_address: {replica_host}:8008allowlist: []allowlist_include_members: trueauthentication:username: patroniymlpassword: passetcd:hosts: {master_host}:2379,{replica_host}:2379,{arbiter_host}:2379protocol: httpusername: patronietcdpassword: passlog:dir: /pgerrorlogs/pangolin-managerfile_name: pangolin-manager-%Y-%m-%d_%H%M%S.logdestination: filefile_mode: 600redirect_min_size: 10bootstrap:dcs:ttl: 135retry_timeout: 60loop_wait: 10maximum_lag_on_failover: 1048576synchronous_mode: truesynchronous_mode_strict: falsepostgresql:parameters:max_connections: '110'max_worker_processes: '32'max_prepared_transactions: '12'wal_level: replicawal_log_hints: ontrack_commit_timestamp: offwal_keep_size: 1GBmax_wal_senders: '10'max_replication_slots: '10'logical_decoding_work_mem: 64MBauth_activity_period: '60'authentication_max_workers: '16'use_pg_rewind: trueuse_slots: trueinitdb:- encoding: UTF8- data-checksums- locale: en_US.UTF-8postgresql:listen: 0.0.0.0:5433bin_dir: /opt/pangolin-dbms-server-7/binbin_dir_client: /opt/pangolin-dbms-client-7/binconnect_address: {replica_host}:5433data_dir: /pgdata/07/data/create_replica_methods:- basebackupbasebackup:format: plainwal-method: fetchauthentication:replication:username: patronipassword: passdatabase: replicationsuperuser:username: patronipassword: passcallbacks:on_role_change: /opt/pangolin-pooler/bin/pangolin-pooler-restart.shparameters:{}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-256tags:nofailover: falsenoloadbalance: falseclonefrom: falsenosync: false -
Создайте пользователя Patroni:
psqlCREATE 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.confETCD_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_LOG_OUTPUTS="/pgerrorlogs/etcd/etcd.log"# TLS settingsETCD_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/etcdsudo chmod -R 700 /var/lib/etcdsudo chown -R postgres:postgres /etc/etcdsudo chmod -R 700 /etc/etcdСоздайте директории для хранения логов:
sudo mkdir -p /pgerrorlogs/etcdsudo mkdir /pgerrorlogs/pangolin-managersudo chown -R postgres:postgres /pgerrorlogssudo chmod -R 770 /pgerrorlogs -
Отредактируйте
unitфайл службыetcd(измените полеUserв файлеetcd.service):sudo nano /usr/lib/systemd/system/etcd.service[Unit]Description=etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]Type=notifyWorkingDirectory=/var/lib/etcd/EnvironmentFile=-/etc/etcd/etcd.confUser=postgres# set GOMAXPROCS to number of processorsExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 /usr/bin/etcd"Restart=on-failureLimitNOFILE=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-licensesudo cp /путь/до/лицензии/license.json /opt/pangolin-license/license.jsonsudo chown -R postgres:postgres /opt/pangolin-licensesudo chmod -R 770 /opt/pangolin-license -
Отредактируйте файл конфигурации
etcd, ниже приведен пример с настройками TLS:etcd.conf
sudo nano /etc/etcd/etcd.confETCD_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_LOG_OUTPUTS="/pgerrorlogs/etcd/etcd.log"# TLS settingsETCD_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/etcdsudo chmod -R 700 /var/lib/etcdsudo chown -R postgres:postgres /etc/etcdsudo chmod -R 700 /etc/etcdСоздайте директории для хранения логов
sudo mkdir -p /pgerrorlogs/etcdsudo chown -R postgres:postgres /pgerrorlogssudo chmod -R 770 /pgerrorlogs -
Отредактируйте
unitфайл службыetcd(измените полеUserв файлеetcd.service):sudo nano /usr/lib/systemd/system/etcd.service[Unit]Description=etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]Type=notifyWorkingDirectory=/var/lib/etcd/EnvironmentFile=-/etc/etcd/etcd.confUser=postgres# set GOMAXPROCS to number of processorsExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) ionice -c2 -n0 /usr/bin/etcd"Restart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target
Завершающие действия
-
Запустите
etcdпоследовательно, на всех узлах кластера, начиная с мастера:sudo systemctl daemon-reloadsudo systemctl start etcd -
Проверьте состояние узлов кластера, пример команды:
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 PostgreSQLLoaded: 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 agoProcess: 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.7MCGroup: /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/07/data/ --config-file=/pgdata/07/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/71019B20Oct 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/pangolin-manager/pangolin-manager-2025-10-07_045433.logOct 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 | |+----------------+-------------------+--------------+-----------+----+-----------+