Задание 1: Администрирование кластера
Рассмотрим основные операции управления кластером, для этого:
- получим текущий статус кластера;
- остановим и запустим один из узлов (в учебных целях);
- убедимся, что служба
etcdработает корректно.
Получение статуса кластера
Сервис pangolin-manager.service настроен по умолчанию на автоматический запуск при старте операционной системы. Проверим его статус:
[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 Mon 2026-09-07 12:24:32 UTC; 19h ago
Main PID: 161911 (pangolin-manage)
Tasks: 21 (limit: 22804)
Memory: 271.0M (peak: 274.8M)
CPU: 2min 43.168s
CGroup: /system.slice/pangolin-manager.service
├─161911 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
├─171737 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Po>
├─171740 "postgres: Pobeda: logger "
├─171741 "postgres: Pobeda: checkpointer "
├─171742 "postgres: Pobeda: background writer "
├─171744 "postgres: Pobeda: idle sessions terminator "
├─171745 "postgres: Pobeda: walwriter "
├─171746 "postgres: Pobeda: autovacuum launcher "
├─171747 "postgres: Pobeda: integrity check launcher "
├─171748 "postgres: Pobeda: license checker "
├─171749 "postgres: Pobeda: authproc "
├─171750 "postgres: Pobeda: password policy cache "
├─171751 "postgres: Pobeda: pg_cron launcher "
├─171752 "postgres: Pobeda: logical replication launcher "
├─171757 "postgres: Pobeda: patroni postgres 127.0.0.1(51022) idle"
├─171759 "postgres: Pobeda: walsender patroni <IP-Address2>(55454) streaming 0/6000000"
└─172887 "postgres: Pobeda: student student <IP-Address1>(45312) idle"
Этот вывод показывает только факт работы сервиса. Для управления самим кластером СУБД Pangolin есть специальная утилита — pangolin-manager-ctl. Это основной инструмент для просмотра состояния, переключения ролей и других операций с кластером.
Для того чтобы увидеть реальное состояние кластера, воспользуемся специальной командой:
[student@srv1 ~]$ sudo -iu postgres pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list Pobeda
+ Cluster: Pobeda (7576294836334315678) +---------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+-----------------------+---------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 2 | |
| <IP-Address2> | <IP-Address2>:5433 | Replica | streaming | 2 | 0 |
+---------------+-----------------------+---------+-----------+----+-----------+
Для удобства администраторов при установке кластера с помощью Ansible-скриптов автоматически создаются псевдонимы (alias) — короткие команды, которые заменяют длинные конструкции. Эти псевдонимы добавляются в профиль пользователя postgres, поэтому они доступны только при работе с этим пользователем.
Переключимся в сеанс пользователя postgres, чтобы воспользоваться первым псевдонимом:
[student@srv1 ~]$ sudo su - postgres
===============================================================
You are connected to Pangolin Cluster (Pobeda)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address1>
- node ( replica ) : <IP-Address2>
- arbiter : <IP-Address3>
- Manager version : 2.1.13
- Pangolin version : 6.7.0
===============================================================
Теперь, чтобы увидеть реальное состояние кластера, вместо длинной конструкции можно просто использовать псевдоним list:
[postgres@srv1 ~]$ list
[postgres@srv1 ~]$ list
+ Cluster: Pobeda (7682768074147749750) ------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 2 | |
| <IP-Address2> | <IP-Address2>:5433 | Sync Standby | streaming | 2 | 0 |
+---------------+--------------------+--------------+-----------+----+-----------+
[postgres@srv1 ~]$ exit
В примере видно, что запущен кластер с именем Pobeda, состоящий из двух узлов:
<IP-Address1>— мастер;<IP-Address2>— реплика, которая синхронизирована (Lag = 0).
Помимо них в кластере имеется также и арбитр с адресом <IP-Address3>, на котором СУБД Pangolin не запущен.
Проверим процессы СУБД Pangolin на всех узлах одной командой:
[student@srv1 ~]$ for comp in srv{1..3}; do echo -e "\n$comp:"; ssh $comp ps f -C postgres; done
Вывод команды:
srv1:
student@srv1's password:
PID TTY STAT TIME COMMAND
171737 ? S 0:07 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=6 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16 --enable_page_compression=off
171740 ? Ss 0:00 \_ postgres: Pobeda: logger
171741 ? Ss 0:00 \_ postgres: Pobeda: checkpointer
171742 ? Ss 0:02 \_ postgres: Pobeda: background writer
171744 ? Ss 0:00 \_ postgres: Pobeda: idle sessions terminator
171745 ? Ss 0:00 \_ postgres: Pobeda: walwriter
171746 ? Ss 0:01 \_ postgres: Pobeda: autovacuum launcher
171747 ? Ss 0:00 \_ postgres: Pobeda: integrity check launcher
171748 ? Ss 0:00 \_ postgres: Pobeda: license checker
171749 ? Ss 0:41 \_ postgres: Pobeda: authproc
171750 ? Ss 0:00 \_ postgres: Pobeda: password policy cache
171751 ? Ss 0:01 \_ postgres: Pobeda: pg_cron launcher
171752 ? Ss 0:00 \_ postgres: Pobeda: logical replication launcher
171757 ? Ss 0:08 \_ postgres: Pobeda: patroni postgres 127.0.0.1(51022) idle
171759 ? Ss 0:08 \_ postgres: Pobeda: walsender patroni <IP-Address2>(55454) streaming 0/6000000
172887 ? Ss 0:00 \_ postgres: Pobeda: student student <IP-Address1>(45312) idle
srv2:
student@srv2's password:
PID TTY STAT TIME COMMAND
97953 ? S 0:00 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=6 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16 --enable_page_compression=off
97956 ? Ss 0:00 \_ postgres: Pobeda: logger
97957 ? Ss 0:00 \_ postgres: Pobeda: checkpointer
97958 ? Ss 0:03 \_ postgres: Pobeda: background writer
97959 ? Ss 0:00 \_ postgres: Pobeda: startup recovering 000000020000000000000005
97960 ? Ss 0:00 \_ postgres: Pobeda: idle sessions terminator
97961 ? Ss 1:09 \_ postgres: Pobeda: walreceiver streaming 0/6000000
97962 ? Ss 0:00 \_ postgres: Pobeda: integrity check launcher
97963 ? Ss 0:00 \_ postgres: Pobeda: license checker
97964 ? Ss 0:47 \_ postgres: Pobeda: authproc
97965 ? Ss 0:00 \_ postgres: Pobeda: password policy cache
97970 ? Ss 0:07 \_ postgres: Pobeda: patroni postgres 127.0.0.1(54618) idle
srv3:
student@srv3's password:
PID TTY STAT TIME COMMAND
Данный цикл используется как замена выполнения команды ps -aux | grep postgres на каждом узле кластера. В рамках цикла осуществляется последовательное подключение по SSH к каждому серверу и вывод списка процессов СУБД Pangolin в древовидном виде.
[student@srv1 ~]$ sudo su - postgres
===============================================================
You are connected to Pangolin Cluster (Pobeda)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address1>
- node ( replica ) : <IP-Address2>
- arbiter : <IP-Address3>
- Manager version : 2.1.13
- Pangolin version : 6.7.0
===============================================================
Еще несколько полезных псевдонимов для пользователя postgres:
-
pgverпоказывает версию СУБД Pangolin:[postgres@srv1 ~]$ pgverversion--------------------------------------------------------------------------------------------------------------------------------------------------PostgreSQL 15.5 (Platform V Pangolin 6.7.0) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.4.1 20240730 (RED SOFT 12.4.0-1), 64-bit(1 строка) -
status– показывает статус сервисаpangolin-manager:[postgres@srv1 ~]$ status● pangolin-manager.service - Runners to orchestrate a high-availability PostgreSQLLoaded: loaded (/usr/lib/systemd/system/pangolin-manager.service; enabled; preset: disabled)Active: active (running) since Mon 2026-09-07 12:24:32 UTC; 19h agoMain PID: 161911 (pangolin-manage)Tasks: 21 (limit: 22804)Memory: 271.1M (peak: 278.4M)CPU: 2min 46.059sCGroup: /system.slice/pangolin-manager.service├─161911 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml├─171737 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=6 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16 --enable_page_compression=off├─171740 "postgres: Pobeda: logger "├─171741 "postgres: Pobeda: checkpointer "├─171742 "postgres: Pobeda: background writer "├─171744 "postgres: Pobeda: idle sessions terminator "├─171745 "postgres: Pobeda: walwriter "├─171746 "postgres: Pobeda: autovacuum launcher "├─171747 "postgres: Pobeda: integrity check launcher "├─171748 "postgres: Pobeda: license checker "├─171749 "postgres: Pobeda: authproc "├─171750 "postgres: Pobeda: password policy cache "├─171751 "postgres: Pobeda: pg_cron launcher "├─171752 "postgres: Pobeda: logical replication launcher "├─171757 "postgres: Pobeda: patroni postgres 127.0.0.1(51022) idle"├─171759 "postgres: Pobeda: walsender patroni <IP-Address2>(55454) streaming 0/6000000"└─172887 "postgres: Pobeda: student student <IP-Address1>(45312) idle"Sep 07 12:24:32 srv1 systemd[1]: Starting Runners to orchestrate a high-availability PostgreSQL...Sep 07 12:24:32 srv1 systemd[1]: Started Runners to orchestrate a high-availability PostgreSQL.Sep 07 12:24:33 srv1 pangolin-manager.bin[161911]: 2026-09-07 12:24:33,549 INFO: LOG output redirection: new log destination is /pgerrorlogs/srv1/pangolin-manager/pangolin-manager-{date}.log
Остановка и запуск узла кластера
Остановить кластер можно, остановив сервис.
В промышленной эксплуатации выполняйте эту операцию только при необходимости и по инструкциям.
Так как наш кластер предназначен для демонстрации, остановим мастер:
[student@srv1 ~]$ sudo systemctl stop 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: inactive (dead) since Tue 2026-09-09 11:46:17 UTC; 5s ago
Duration: 20min 17.923s
Process: 265099 ExecStart=/opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml (code=exited, status=0/SUCCESS)
Main PID: 265099 (code=exited, status=0/SUCCESS)
CPU: 6.862s
Что происходит с процессами PostgreSQL?
[student@srv1 ~]$ for comp in srv{1..3}; do echo -e "\n$comp:"; ssh $comp ps f -C postgres; done
srv1:
PID TTY STAT TIME COMMAND
srv2:
PID TTY STAT TIME COMMAND
767 ? S 0:12 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=replica --hot_standby=on --max_connections=110 --max_wal_senders=10 --max_prepared_transactions=3 --max_locks_per_transaction=64 --track_commit_timestamp=False --max_replication_slots=10 --max_worker_processes=32 --wal_log_hints=True --authentication_max_workers=16
770 ? Ss 0:04 \_ postgres: Pobeda: logger
771 ? Ss 0:03 \_ postgres: Pobeda: checkpointer
772 ? Ss 0:03 \_ postgres: Pobeda: background writer
773 ? Ss 0:03 \_ postgres: Pobeda: startup recovering 000000030000000000000006
774 ? Ss 0:03 \_ postgres: Pobeda: idle sessions terminator
775 ? Ss 0:17 \_ postgres: Pobeda: authproc
776 ? Ss 0:03 \_ postgres: Pobeda: password policy cache
778 ? Ss 0:03 \_ postgres: Pobeda: integrity check launcher
779 ? Ss 0:04 \_ postgres: Pobeda: license checker
786 ? Ss 0:11 \_ postgres: Pobeda: patroni postgres 127.0.0.1(53372) idle
srv3:
PID TTY STAT TIME COMMAND
Остановка сервиса pangolin-manager.service на одном узле не затрагивает другие узлы кластера. Если нужно остановить весь кластер, остановите сервис на всех узлах.
Получим статус кластера после остановки:
[student@srv1 ~]$ sudo -iu postgres pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list Pobeda
+ Cluster: Pobeda (7683495148262105741) -------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+---------+---------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Replica | stopped | | unknown |
| <IP-Address2> | <IP-Address2>:5433 | Leader | running | 3 | |
+---------------+--------------------+---------+---------+----+-----------+
В кластере осталась только реплика. Запустим мастер обратно:
[student@srv1 ~]$ sudo systemctl start 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 Wed 2026-09-09 11:48:42 UTC; 7s ago
Process: 275706 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)
Process: 275707 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)
Main PID: 275708 (pangolin-manage)
Tasks: 17 (limit: 22804)
Memory: 136.0M (peak: 139.1M)
CPU: 1.186s
CGroup: /system.slice/pangolin-manager.service
├─275708 /opt/pangolin-manager/bin/pangolin-manager-bin/pangolin-manager.bin /etc/pangolin-manager/postgres.yml
├─275725 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level=repli>
├─275728 "postgres: Pobeda: logger "
├─275729 "postgres: Pobeda: checkpointer "
├─275730 "postgres: Pobeda: background writer "
├─275731 "postgres: Pobeda: startup waiting for 000000030000000000000007"
├─275732 "postgres: Pobeda: idle sessions terminator "
├─275734 "postgres: Pobeda: integrity check launcher "
├─275735 "postgres: Pobeda: license checker "
├─275736 "postgres: Pobeda: authproc "
├─275737 "postgres: Pobeda: password policy cache "
└─275744 "postgres: Pobeda: patroni postgres 127.0.0.1(33642) idle"
[student@srv1 ~]$ sudo -iu postgres pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list Pobeda
+ Cluster: Pobeda (7683495148262105741) ------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Sync Standby | streaming | 3 | 0 |
| <IP-Address2> | <IP-Address2>:5433 | Leader | running | 3 | |
+---------------+--------------------+--------------+-----------+----+-----------+
Статус etcd
etcd – это распределенное хранилище ключей и соответствующих им значений, которое координирует работу кластера. С помощью нее реализуется DCS, обеспечивающая консистентное представление узлов о топологии кластера. Напомним, что etcd реализует кворумный протокол Raft.
[student@srv1 ~]$ sudo su - postgres
===============================================================
You are connected to Pangolin Cluster (Pobeda)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address2>
- node ( replica ) : <IP-Address1>
- arbiter : <IP-Address3>
- Manager version : 2.1.13
- Pangolin version : 6.7.0
===============================================================
Для проверки etcd есть удобные псевдонимы:
-
members(список участников) показывает все узлыetcdв кластере (они же узлы кластера):[postgres@srv1 ~]$ members+------------------+---------+------+----------------------------+----------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+------+----------------------------+----------------------------+------------+| 54ec0c37709f3054 | started | srv1 | https://<IP-Address1>:2380 | https://<IP-Address1>:2379 | false || 8c95e735c5b6384c | started | srv2 | https://<IP-Address2>:2380 | https://<IP-Address2>:2379 | false || c80310d8dc193330 | started | srv3 | https://<IP-Address3>:2380 | https://<IP-Address3>:2379 | false |+------------------+---------+------+----------------------------+----------------------------+------------+ -
healthпроверяет исправность всех узлов:[postgres@srv1 ~]$ healthmember 54ec0c37709f3054 is healthy: got healthy result from https://<IP-Address1>:2379member 8c95e735c5b6384c is healthy: got healthy result from https://<IP-Address2>:2379member c80310d8dc193330 is healthy: got healthy result from https://<IP-Address3>:2379cluster is healthy -
elistпоказывает еще более подробный отчет по узламetcd:[postgres@srv1 ~]$ elist+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://<IP-Address2>:2379 | 54ec0c37709f3054 | 3.5.16 | 20 kB | true | false | 2 | 164062 | 164062 | || https://<IP-Address1>:2379 | 8c95e735c5b6384c | 3.5.16 | 20 kB | false | false | 2 | 164062 | 164062 | || https://<IP-Address3>:2379 | c80310d8dc193330 | 3.5.16 | 20 kB | false | false | 2 | 164062 | 164062 | |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
Какая команда скрывается за псевдонимом?
Это всегда можно посмотреть самостоятельно – используйте alias без аргумента или с именем конкретного псевдонима:
[postgres@srv1 ~]$ alias list
alias list='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list $CLNAME'
[postgres@srv1 ~]$ alias status
alias status='systemctl --user status pangolin-manager --no-pager --full'
Все псевдонимы для пользователя postgres прописаны в файле ~/.bash_profile. Если нужно добавить свои или изменить существующие – редактируйте этот файл.
[postgres@srv1 ~]$ exit
Подведем итоги
Вопрос 1
Вопрос 1: В кластере имеется три узла. Какие псевдонимы, настроенные программой установки для postgres, покажут все три узла?
Вопрос 2
Вопрос 2: Исходя из следующего вывода:
===============================================================
You are connected to Pangolin Cluster (Pobeda)
- Hostname : srv1
- IP Address : <IP-Address1>
---------------------------------------------------------------
- node ( master ) : <IP-Address1>
- node ( replica ) : <IP-Address2>
- arbiter : <IP-Address3>
- Manager version : 2.1.5
- Pangolin version : 6.7.0
===============================================================
С каким узлом кластера было установлено соединение в сессии psql, где получен такой результат:
student=> SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 строка)