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

Задание 3: Установка Pangolin Manager

В этом задании мы установим пакет Pangolin Manager, а затем последовательно выполним его настройку и запуск на основном узле. После этого мы повторим процесс настройки и запуска для реплики.

Установка пакета Pangolin Manager​

Проверим наличие rpm-пакета Pangolin Manager на узлах кластера srv1 и srv2. Узел srv3 выполняет роль арбитра, на нем не запускают Pangolin Manager:

[student@srv1 ~]$ for comp in srv{1,2}; do echo -e "\n${comp}"; ssh $comp ls -l ./Distr/distributive/pangolin-manager-*.x86_64.rpm; done
srv1
-rw-r--r-- 1 student student 10543965 Mar 20 2026 ./Distr/distributive/pangolin-manager-3.5.21-redos8.0.x86_64.rpm
-rw-r--r-- 1 student student 6381 Mar 20 2026 ./Distr/distributive/pangolin-manager-dcs-6.7.0-redos8.0.x86_64.rpm

srv2
-rw-r--r-- 1 student student 10543965 Mar 20 2026 ./Distr/distributive/pangolin-manager-3.5.21-redos8.0.x86_64.rpm
-rw-r--r-- 1 student student 6381 Mar 20 2026 ./Distr/distributive/pangolin-manager-dcs-6.7.0-redos8.0.x86_64.rpm

Нам необходим первый rpm-пакет pangolin-manager-2.1.13-redos8.0.x86_64.rpm.

Но для установки Pangolin Manager также необходим rpm-пакет pangolin-manager-venv-2.1.13-redos8.0.x86_64.rpm:

[student@srv1 ~]$ cd Distr/distributive/3rdparty
[student@srv1 3rdparty]$ tar -xf 3rdparty.tar.gz
[student@srv1 3rdparty]$ cd pangolin-manager-venv
[student@srv1 pangolin-manager-venv]$ ls -la
total 8508
-rw-r--r-- 1 student student 8711729 Mar 20 2026 pangolin-manager-venv-2.1.13-redos8.0.x86_64.rpm
[student@srv1 pangolin-manager-venv]$ scp pangolin-manager-venv-2.1.13-redos8.0.x86_64.rpm srv2:~/Distr/distributive

На узлах srv1 и srv2 установим пакет:

[student@srv1 pangolin-manager-venv]$ sudo dnf install -y pangolin-manager-venv-2.1.13-redos8.0.x86_64.rpm
Вывод команды:

Updating Subscription Management repositories.
sberlinux-97-for-x86_64-powertools-rpms 8.7 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-baseos-rpms 7.8 kB/s | 2.3 kB 00:00
sberlinux-97-for-x86_64-baseos-debug-rpms 6.8 kB/s | 2.0 kB 00:00
sberlinux-97-for-x86_64-appstream-rpms 8.8 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-appstream-debug-rpms 6.9 kB/s | 2.0 kB 00:00
Dependencies resolved.
======================================================================================================================================================================================================
Package Architecture Version Repository Size
======================================================================================================================================================================================================
Installing:
pangolin-manager-venv x86_64 2.1.13-redos8.0 @commandline 8.3 M

Transaction Summary
======================================================================================================================================================================================================
Install 1 Package

Total size: 8.3 M
Installed size: 36 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Installing : pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Running scriptlet: pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Verifying : pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Installed products updated.

Installed:
pangolin-manager-venv-2.1.13-redos8.0.x86_64

Complete!
[student@srv1 pangolin-manager-venv]$ ssh srv2
[student@srv2 ~]$ sudo dnf install -y Distr/distributive/pangolin-manager-venv-2.1.13-redos8.0.x86_64.rpm
Вывод команды:

Updating Subscription Management repositories.
sberlinux-97-for-x86_64-powertools-rpms 8.7 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-baseos-rpms 7.8 kB/s | 2.3 kB 00:00
sberlinux-97-for-x86_64-baseos-debug-rpms 6.8 kB/s | 2.0 kB 00:00
sberlinux-97-for-x86_64-appstream-rpms 8.8 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-appstream-debug-rpms 6.9 kB/s | 2.0 kB 00:00
Dependencies resolved.
======================================================================================================================================================================================================
Package Architecture Version Repository Size
======================================================================================================================================================================================================
Installing:
pangolin-manager-venv x86_64 2.1.13-redos8.0 @commandline 8.3 M

Transaction Summary
======================================================================================================================================================================================================
Install 1 Package

Total size: 8.3 M
Installed size: 36 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Installing : pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Running scriptlet: pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Verifying : pangolin-manager-venv-2.1.13-redos8.0.x86_64 1/1
Installed products updated.

Installed:
pangolin-manager-venv-2.1.13-redos8.0.x86_64

Complete!
[student@srv2 ~]$ ssh srv1

На узлах srv1 и srv2 установим пакет pangolin-manager-2.1.13-redos8.0.x86_64.rpm:

[student@srv1 ~]$ for comp in srv{1,2}; do echo -e "\n${comp}"; ssh $comp sudo dnf install -y ./Distr/distributive/pangolin-manager-2.1.13-redos8.0.x86_64.rpm; done
Вывод команды:

srv1
Updating Subscription Management repositories.
sberlinux-97-for-x86_64-powertools-rpms 8.6 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-baseos-rpms 7.7 kB/s | 2.3 kB 00:00
sberlinux-97-for-x86_64-baseos-debug-rpms 6.7 kB/s | 2.0 kB 00:00
sberlinux-97-for-x86_64-appstream-rpms 8.3 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-appstream-debug-rpms 6.8 kB/s | 2.0 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
pangolin-manager x86_64 2.1.13-redos8.0 @commandline 10 M

Transaction Summary
================================================================================
Install 1 Package

Total size: 10 M
Installed size: 35 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Installing : pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Running scriptlet: pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Verifying : pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Installed products updated.

Installed:
pangolin-manager-2.1.13-redos8.0.x86_64

Complete!

srv2
Updating Subscription Management repositories.
sberlinux-97-for-x86_64-powertools-rpms 9.0 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-baseos-rpms 7.8 kB/s | 2.3 kB 00:00
sberlinux-97-for-x86_64-baseos-debug-rpms 6.8 kB/s | 2.0 kB 00:00
sberlinux-97-for-x86_64-appstream-rpms 8.7 kB/s | 2.6 kB 00:00
sberlinux-97-for-x86_64-appstream-debug-rpms 6.8 kB/s | 2.0 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
pangolin-manager x86_64 2.1.13-redos8.0 @commandline 10 M

Transaction Summary
================================================================================
Install 1 Package

Total size: 10 M
Installed size: 35 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Installing : pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Running scriptlet: pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Verifying : pangolin-manager-2.1.13-redos8.0.x86_64 1/1
Installed products updated.

Installed:
pangolin-manager-2.1.13-redos8.0.x86_64

Complete!

Настройка Pangolin Manager на мастере​

Сохраним резервную копию файла конфигурации:

[student@srv1 ~]$ sudo cp -v /etc/pangolin-manager/postgres.yml{,.bak}
'/etc/pangolin-manager/postgres.yml' -> '/etc/pangolin-manager/postgres.yml.bak'

Используя текстовый редактор, внесем изменения в настройки:

  1. Имя кластера – scope: clstr.

  2. Раздел restapi:

    • Имя узла – name: srv1

    • Адрес подключения – connect_address: <IP-Address1>:8008

    • Сертификаты

      certfile: /pg_ssl/server.crt
      keyfile: /pg_ssl/server.key
      cafile: /pg_ssl/root.crt
  3. Раздел etcd:

    • Узлы etcd – hosts: <IP-Address1>:2379,<IP-Address2>:2379,<IP-Address3>:2379
    • Пароль patronietcd – password: patronietcd123
  4. Раздел log:

    • Каталог с журналами сообщений – dir: /pgerrorlogs/06/pangolin-manager
    • Шаблон имен файлов журналов сообщений – file_name: pangolin-manager-%Y-%m-%d_%H%M%S.log
  5. Раздел postgresql:

    • Адрес для подключения Pangolin Manager к PostgreSQL – connect_address: <IP-Address1>:5433

    • Каталог данных – data_dir: /pgdata/06/data

    • Подраздел authentication: -> replication::

      sslkey: /pg_ssl/patroni.key
      sslcert: /pg_ssl/patroni.crt
      sslrootcert: /pg_ssl/root.crt
      sslrootpath: /pg_ssl/root_dir
    • Подраздел authentication: -> superuser::

      sslkey: /pg_ssl/patroni.key
      sslcert: /pg_ssl/patroni.crt
      sslrootcert: /pg_ssl/root.crt
      sslrootpath: /pg_ssl/root_dir
    • подраздел parameters:

      • Местоположение журнала сообщений – log_directory: /pgerrorlogs/06

      • Сертификаты PostgreSQL:

        ssl_ca_file: /pg_ssl/root.crt
        ssl_cert_file: /pg_ssl/server.crt
        ssl_key_file: /pg_ssl/server.key
    • Сохранение истории команд psql – psql.save_history: on

  6. Раздел pg_hba:

    - hostssl all postgres <IP-Address1>/32 cert
    - hostssl all postgres <IP-Address2>/32 cert
    - hostssl all patroni 127.0.0.1/32 cert
    - hostssl all patroni <IP-Address1>/32 cert
    - hostssl all patroni <IP-Address2>/32 cert
    - hostssl all student 127.0.0.1/32 scram-sha-256
    - hostssl all student <IP-Address1>/32 scram-sha-256
    - hostssl all student <IP-Address2>/32 scram-sha-256
    - hostssl replication patroni 127.0.0.1/32 cert
    - hostssl replication patroni <IP-Address1>/32 cert
    - hostssl replication patroni <IP-Address2>/32 cert
Внимание!

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

Полное содержимое файла /etc/pangolin-manager/postgres.yml мастера:

scope: clstr
name: srv1

restapi:
listen: 0.0.0.0:8008
connect_address: <IP-Address1>:8008
allowlist: []
allowlist_include_members: true
ciphers: DEFAULT:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1
verify_client: optional
certfile: /pg_ssl/server.crt
keyfile: /pg_ssl/server.key
cafile: /pg_ssl/root.crt
pkcs12_config_path:
crlpath:
crlfile:
authentication:
username: patroniyml
password: sample_password

etcd:
hosts: <IP-Address1>:2379,<IP-Address2>:2379,<IP-Address3>:2379
protocol: https
cacert: /pg_ssl/root.crt
cert: /pg_ssl/patronietcd.crt
key: /pg_ssl/patronietcd.key
username: patronietcd
password: patronietcd123

log:
dir: /pgerrorlogs/06/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_locks_per_transaction: '64'
max_worker_processes: '32'
max_prepared_transactions: '18'
wal_level: replica
wal_log_hints: on
track_commit_timestamp: off
wal_keep_size: 8GB
max_wal_senders: '10'
max_replication_slots: '10'
logical_decoding_work_mem: 64MB
auth_activity_period: '60'
authentication_max_workers: '16'
enable_page_compression: off
use_pg_rewind: true
use_slots: true

initdb:
- encoding: UTF8
- data-checksums
postgresql:
listen: 0.0.0.0:5433
bin_dir: /usr/pangolin/bin
bin_dir_client: /usr/pangolin-dbms-client/bin
connect_address: <IP-Address1>:5433
data_dir: /pgdata/06/data
create_replica_methods:
- basebackup
basebackup:
format: plain
wal-method: fetch
authentication:
replication:
username: patroni
database: replication
sslmode: verify-ca
sslkey: /pg_ssl/patroni.key
sslcert: /pg_ssl/patroni.crt
sslrootcert: /pg_ssl/root.crt
sslrootpath: /pg_ssl/root_dir
superuser:
username: patroni
sslmode: verify-ca
sslkey: /pg_ssl/patroni.key
sslcert: /pg_ssl/patroni.crt
sslrootcert: /pg_ssl/root.crt
sslrootpath: /pg_ssl/root_dir
parameters:
archive_mode: off
archive_command: pg_probackup archive-push -B /pgarclogs/ --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 1 --batch-size=100
authentication_proxy: '1'
authentication_port: '5544'
archive_timeout: '180'
autovacuum_work_mem: 330MB
checkpoint_completion_target: '0.9'
checkpoint_timeout: '1800'
debug_pretty_print: off
default_statistics_target: '100' #by default
effective_cache_size: 7942MB
effective_io_concurrency: '300' # set to 200 if SSD drives are used
fsync: on
full_page_writes: on
hot_standby: on
hot_standby_feedback: on
listen_addresses: 0.0.0.0
syslog_facility: LOCAL3
syslog_ident: postgres
syslog_sequence_numbers: on
syslog_split_messages: off
log_checkpoints: 'True'
log_connections: 'True'
log_destination: stderr
log_directory: /pgerrorlogs/06
log_disconnections: 'True'
log_file_mode: 0600
log_filename: postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix: '%t [%p]: [%l-1] app=%a,user=%u,db=%d,client=%h,type=%b '
log_lock_waits: on
log_min_duration_statement: '5000'
log_min_error_statement: WARNING
log_replication_commands: on
log_rotation_age: '1440'
log_rotation_size: 100MB
log_statement: none
log_temp_files: '0'
log_truncate_on_rotation: 'True'
logging_collector: 'True'
client_min_messages: notice
log_timezone: Europe/Moscow
datestyle: iso, mdy
timezone: Europe/Moscow
lc_messages: en_US.utf8
lc_monetary: en_US.utf8
lc_numeric: en_US.utf8
lc_time: en_US.utf8
default_text_search_config: pg_catalog.english
maintenance_work_mem: 661MB
max_parallel_workers: '32'
max_parallel_workers_per_gather: '3'
max_standby_archive_delay: 30s
max_standby_streaming_delay: 30s
max_wal_size: 4GB
min_wal_size: 2GB
monitoring_ldap_servers: <server_name>
pgaudit.log: ddl, role, connection, misc_set, protection, pg_background
password_encryption: scram-sha-256
password_policy.deny_default: off
password_policy.reuse_time: 365 days
password_policy.in_history: '4'
password_policy.max_age: '0'
password_policy.min_age: '0'
password_policy.grace_login_limit: '0'
password_policy.grace_login_time_limit: 3 days
password_policy.expire_warning: 7 days
password_policy.lockout: on
password_policy.lockout_duration: 24 hours
password_policy.max_failure: '6'
password_policy.failure_count_interval: '0'
password_policy.check_syntax: on
password_policy.min_length: '16'
password_policy.illegal_values: on
password_policy.alpha_numeric: '3'
password_policy.min_alpha_chars: '0'
password_policy.min_special_chars: '1'
password_policy.min_uppercase: '1'
password_policy.min_lowercase: '0'
password_policy.max_rpt_chars: '0'
password_policy.track_login: off
password_policy.max_inactivity: '0'
password_policy.use_password_strength_estimator: on
password_policy.password_strength_estimator_score: '3'
password_policy.deduplicate_ssl_no_ssl_fail_auth_attepmts: on
password_policy.allow_hashed_password: off
performance_insights.enable: 'True'
performance_insights.masking: 'true'
performance_insights.sampling_enable: 'true'
performance_insights.sampling_period: 5s
performance_insights.num_samples_in_ram: '12'
performance_insights.num_samples_in_files: '17280'
psql_encrypt_password: on
password_policies_enable: on
password_policy.transport_password_mark_automatic: 'False'
password_policy.transport_password_life_time: '0'
pg_hint_plan.parse_messages: warning
pg_hint_plan.debug_print: off
pg_hint_plan.message_level: debug
cron.database_name: postgres
cron.max_running_jobs: '3'
pg_profile.topn: '20'
pg_profile.max_sample_age: '7'
pg_profile.track_sample_timings: off
track_activities: on
track_counts: on
track_io_timing: on
track_functions: none
pg_stat_statements.track: top
pg_stat_statements.max: '5000'
installer.inner_role_model: true
port: '5433'
random_page_cost: '2.0'
pg_stat_kcache.linux_hz: '-1'
relnblocks_enable: on
relnblocks_hash_max_size: '1000000'
relnblocks_hash_init_size: '1024'
relnblocks_hash_max_db: '1024'
relnblocks_hash_init_db: '20'
search_path: ext
shared_buffers: 4GB
shared_preload_libraries: auto_explain,pg_stat_statements,pg_stat_kcache,pg_cron,pg_hint_plan,pg_outline,pg_pathman
superuser_reserved_connections: '10'
synchronous_commit: on
unix_socket_directories: /var/run/postgresql/
wal_buffers: 16MB
wal_receiver_status_interval: 1s
wal_sync_method: fsync
work_mem: 16384kB
ssl: on
ssl_ca_file: /pg_ssl/root.crt
ssl_cert_file: /pg_ssl/server.crt
ssl_key_file: /pg_ssl/server.key
ssl_legacy_provider: on
serverssl.pkcs12_config_path:
ssl_crl_dir:
ssl_crl_file:
pg_plugins_path: /usr/pangolin/lib
is_tde_on: off
enabled_sec_admin_extra_auth_methods: cert,md5
enabled_extra_auth_methods: cert
pg_outline.enable: off
enable_monitor_object_modification_date: on
object_modification_date_keep_interval: 1 week
rotate_password.num_rounds: '20'
enable_filesystem_checker: 'True'
disk_check_timeout: '5'
disk_operation_timeout: '3'
disk_retry_count: '3'
force_failover_timeout: '160'
disk_check_tablespaces_count: '128'
psql.save_history: on
pg_quota:
- backup_user reserved_connections=3
pg_hba:
- hostssl all postgres 127.0.0.1/32 cert
- hostssl all postgres <IP-Address1>/32 cert
- hostssl all postgres <IP-Address2>/32 cert
- hostssl all patroni 127.0.0.1/32 cert
- hostssl all patroni <IP-Address1>/32 cert
- hostssl all patroni <IP-Address2>/32 cert
- hostssl all student 127.0.0.1/32 scram-sha-256
- hostssl all student <IP-Address1>/32 scram-sha-256
- hostssl all student <IP-Address2>/32 scram-sha-256
- hostssl replication patroni 127.0.0.1/32 cert
- hostssl replication patroni <IP-Address1>/32 cert
- hostssl replication patroni <IP-Address2>/32 cert

tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Внимание!

Поменяйте переменные <IP-Address1>, <IP-Address2> на свои значения.

Запуск Pangolin Manager на мастере​

Перед запуском Pangolin Manager остановим СУБД:

[student@srv1 ~]$ sudo su - postgres
[postgres@srv1 ~]$ pg_ctl stop

Запустим Pangolin Manager:

[student@srv1 ~]$ sudo systemctl enable --now pangolin-manager
[student@srv1 ~]$ sudo systemctl status pangolin-manager
Вывод команды:

● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-09-26 11:13:47 UTC; 6s ago
Process: 220660 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
Process: 220661 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
Main PID: 220662 (pangolin-manage)
Tasks: 45 (limit: 22804)
Memory: 252.9M (peak: 253.9M)
CPU: 1.521s
CGroup: /system.slice/pangolin-manager.service
├─220662 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
├─220674 /usr/pangolin/bin/postgres -D /pgdata/06/data --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --clus>
├─220677 "postgres: clstr: logger "
├─220678 "postgres: clstr: checkpointer "
├─220679 "postgres: clstr: background writer "
├─220681 "postgres: clstr: idle sessions terminator "
├─220682 "postgres: clstr: performance insights "
├─220683 "postgres: clstr: integrity check launcher "
├─220684 "postgres: clstr: license checker "
├─220685 "postgres: clstr: authproc "
├─220686 "postgres: clstr: password policy cache "
├─220693 "postgres: clstr: patroni postgres 127.0.0.1(33062) idle"
├─220698 "postgres: clstr: walwriter "
├─220699 "postgres: clstr: autovacuum launcher "
├─220700 "postgres: clstr: autounite launcher "
├─220701 "postgres: clstr: pg_cron launcher "
├─220702 "postgres: clstr: file system checker "
└─220703 "postgres: clstr: logical replication launcher "

Sep 26 11:13:47 srv1 systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...
Sep 26 11:13:47 srv1 systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.
Sep 26 11:13:48 srv1 pangolin-manager.bin[220662]: 2026-09-26 11:13:48,400 INFO: LOG output redirection: new log destination is /pgerrorlogs/06/pangolin-manager/pangolin-manager-<date>.l>

Проверим состояние процессов PostgreSQL:

[student@srv1 ~]$ ps f -C postgres
Вывод команды:

PID TTY STAT TIME COMMAND
220674 ? S 0:00 /usr/pangolin/bin/postgres -D /pgdata/06/data --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=clstr --wal_level=repli
220677 ? Ss 0:00 \_ postgres: clstr: logger
220678 ? Ss 0:00 \_ postgres: clstr: checkpointer
220679 ? Ss 0:00 \_ postgres: clstr: background writer
220681 ? Ss 0:00 \_ postgres: clstr: idle sessions terminator
220682 ? Ss 0:00 \_ postgres: clstr: performance insights
220683 ? Ss 0:00 \_ postgres: clstr: integrity check launcher
220684 ? Ss 0:00 \_ postgres: clstr: license checker
220685 ? Ss 0:00 \_ postgres: clstr: authproc
220686 ? Ss 0:00 \_ postgres: clstr: password policy cache
220693 ? Ss 0:00 \_ postgres: clstr: patroni postgres 127.0.0.1(33062) idle
220698 ? Ss 0:00 \_ postgres: clstr: walwriter
220699 ? Ss 0:00 \_ postgres: clstr: autovacuum launcher
220700 ? Ss 0:00 \_ postgres: clstr: autounite launcher
220701 ? Ss 0:00 \_ postgres: clstr: pg_cron launcher
220702 ? Ssl 0:00 \_ postgres: clstr: file system checker
220703 ? Ss 0:00 \_ postgres: clstr: logical replication launcher

Проверим возможность подключения от имени student:

[student@srv1 ~]$ psql "password=student"
psql (15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
student=> SELECT product_version();
product_version
-----------------------------------------
Platform V Pangolin DB 6.7.0
(1 row)
student=> SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
student=> \q

В сеансе postgres получим отчет о состоянии узлов кластера:

[student@srv1 ~]$ sudo su - postgres
[postgres@srv1 ~]$ /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
+ Cluster: clstr (7689097327775735130) +---------+----+-----------+-----------------+
| Member | Host | Role | State | TL | Lag in MB | Pending restart |
+--------+--------------------+--------+---------+----+-----------+-----------------+
| srv1 | <IP-Address1>:5433 | Leader | running | 2 | | * |
+--------+--------------------+--------+---------+----+-----------+-----------------+
[postgres@srv1 ~]$ exit

Настройка Pangolin Manager на реплике​

Скопируем содержимое файла конфигурации /etc/pangolin-manager/postgres.yml с мастера на реплику:

[student@srv1 ~]$ sudo cat /etc/pangolin-manager/postgres.yml | ssh srv2 sudo tee /etc/pangolin-manager/postgres.yml

Потребуются изменения:

  • параметр name: srv2;
  • в разделах restapi: и postgres: параметры connect_address: <IP-Address2>.

Подключимся к узлу srv2 и любым способом выполним эти изменения. Например, так:

[student@srv2 ~]$ sudo su - postgres
[postgres@srv2 ~]$ sed -i.bak -e 's/name: srv1/name: srv2/' -e 's/connect_address: <IP-Address1>/connect_address: <IP-Address2>/' /etc/pangolin-manager/postgres.yml
[postgres@srv2 ~]$ diff /etc/pangolin-manager/postgres.yml*
2c2
< name: srv2
---
> name: srv1
6c6
< connect_address: <IP-Address2>:8008
---
> connect_address: <IP-Address1>:8008
71c71
< connect_address: <IP-Address2>:5433
---
> connect_address: <IP-Address1>:5433

Запуск Pangolin Manager на реплике​

Проверка наличия требуемых файлов и каталогов на srv2:

  1. Каталог данных должен быть пуст:

    [postgres@srv2 ~]$ ls -la /pgdata/06/data
    total 8
    drwxr-xr-x 2 postgres postgres 4096 Jan 4 21:47 .
    drwxr-xr-x 3 postgres postgres 4096 Jan 4 21:47 ..
  2. Права доступа на каталог данных должны быть лишь для владельца:

    [postgres@srv2 ~]$ chmod -c 700 /pgdata/06/data
    mode of '/pgdata/06/data' changed from 0755 (rwxr-xr-x) to 0700 (rwx------)
  3. Должны существовать каталоги для журналов сообщений:

    [postgres@srv2 ~]$ ls -R /pgerrorlogs/
    /pgerrorlogs/:
    06

    /pgerrorlogs/06:
    etcd pangolin-manager

    /pgerrorlogs/06/etcd:
    etcd.log

    /pgerrorlogs/06/pangolin-manager:
  4. Лицензия:

    [postgres@srv2 ~]$ ls -l /opt/pangolin_license/
    total 4
    -rw-r--r-- 1 postgres postgres 538 Jan 4 22:51 license.json

Запустим на реплике Pangolin Manager:

[postgres@srv2 ~]$ exit
[student@srv2 ~]$ sudo systemctl enable --now pangolin-manager
Created symlink /etc/systemd/system/multi-user.target.wants/pangolin-manager.service → /usr/lib/systemd/system/pangolin-manager.service.
[student@srv2 ~]$ sudo systemctl status pangolin-manager
Вывод команды:

● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQL
Loaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-09-26 11:25:45 UTC; 7s ago
Process: 90737 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
Process: 90738 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
Main PID: 90739 (pangolin-manage)
Tasks: 19 (limit: 22804)
Memory: 304.8M (peak: 305.1M)
CPU: 1.346s
CGroup: /system.slice/pangolin-manager.service
├─90739 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
├─90751 /usr/pangolin/bin/postgres -D /pgdata/06/data --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --clust>
├─90754 "postgres: clstr: logger "
├─90755 "postgres: clstr: checkpointer "
├─90756 "postgres: clstr: background writer "
├─90757 "postgres: clstr: startup recovering 000000020000000000000004"
├─90758 "postgres: clstr: idle sessions terminator "
├─90759 "postgres: clstr: authproc "
├─90760 "postgres: clstr: password policy cache "
├─90761 "postgres: clstr: performance insights "
├─90763 "postgres: clstr: integrity check launcher "
├─90764 "postgres: clstr: license checker "
├─90773 "postgres: clstr: patroni postgres 127.0.0.1(40312) idle"
└─90776 "postgres: clstr: walreceiver streaming 0/4000070"

Sep 26 11:25:45 srv2 systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...
Sep 26 11:25:45 srv2 systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.
Sep 26 11:25:45 srv2 pangolin-manager.bin[90739]: 2026-09-26 11:25:45,804 INFO: LOG output redirection: new log destination is /pgerrorlogs/06/pangolin-manager/pangolin-manager-<date>.log

Убедимся, что репликация запущена:

[student@srv2 ~]$ ps f -C postgres
PID TTY STAT TIME COMMAND
90751 ? S 0:00 /usr/pangolin/bin/postgres -D /pgdata/06/data --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=clstr --wal_level=repli
90754 ? Ss 0:00 \_ postgres: clstr: logger
90755 ? Ss 0:00 \_ postgres: clstr: checkpointer
90756 ? Ss 0:00 \_ postgres: clstr: background writer
90757 ? Ss 0:00 \_ postgres: clstr: startup recovering 000000020000000000000004
90758 ? Ss 0:00 \_ postgres: clstr: idle sessions terminator
90759 ? Ss 0:00 \_ postgres: clstr: authproc
90760 ? Ss 0:00 \_ postgres: clstr: password policy cache
90761 ? Ss 0:00 \_ postgres: clstr: performance insights
90763 ? Ss 0:00 \_ postgres: clstr: integrity check launcher
90764 ? Ss 0:00 \_ postgres: clstr: license checker
90773 ? Ss 0:00 \_ postgres: clstr: patroni postgres 127.0.0.1(40312) idle
90776 ? Ss 0:00 \_ postgres: clstr: walreceiver streaming 0/40000E0

В сеансе роли student на реплике убедимся, что она находится в состоянии восстановления:

[student@srv2 ~]$ psql "password=student"
psql (15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
student=> SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)

На мастере проверим состояние репликации:

[postgres@srv1 ~]$ psql "sslmode=require sslcert=/pg_ssl/postgres.crt sslkey=/pg_ssl/postgres.key"
psql (15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=# SELECT * FROM pg_stat_replication \gx
-[ RECORD 1 ]----+------------------------------
pid | 227276
usesysid | 16391
usename | patroni
application_name | srv2
client_addr | <IP-Address2>
client_hostname |
client_port | 43354
backend_start | 2026-09-26 14:25:51.877756+03
backend_xmin |
state | streaming
sent_lsn | 0/5000000
write_lsn | 0/5000000
flush_lsn | 0/5000000
replay_lsn | 0/5000000
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2026-09-26 14:30:41.506954+03
postgres=# \q

\q

Проверим состояние кластера:

[postgres@srv1 ~]$ /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
+ Cluster: clstr (7591803626182926342) ------+-----------+----+-----------+-----------------+
| Member | Host | Role | State | TL | Lag in MB | Pending restart |
+--------+--------------------+--------------+-----------+----+-----------+-----------------+
| srv1 | <IP-Address1>:5433 | Leader | running | 5 | | |
| srv2 | <IP-Address2>:5433 | Sync Standby | streaming | 5 | 0 | * |
+--------+--------------------+--------------+-----------+----+-----------+-----------------+

Подведем итоги​

Вопрос 1

Вопрос 1: Какой параметр конфигурации Pangolin Manager задает имя кластера?

Вопрос 2

Вопрос 2: Какой параметр настройки конфигурационного файла Pangolin Manager задает номер порта TCP для клиентских подключений к нему?