Задание 3: Управление узлами кластера
В первом задании мы научились смотреть статус кластера и останавливать отдельные узлы. Но в жизни администратора часто возникают сценарии посложнее:
- Нужно вывести мастер на обслуживание — как передать роль другому узлу без простоя?
- А если мастер упал внезапно — как быстро поднять нового лидера?
Для этого в Pangolin Manager есть две ключевые операции: плановое переключение (switchover) и аварийное переключение (failover). Давайте разберем их на практике.
В уроке рассматриваются команды pangolin-manager-ctl, более подробное описание всех параметров и форматов вывода всегда можно посмотреть в документации.
Получение статуса узлов
Для начала убедимся, что мы видим полную картину кластера. Команда list уже знакома:
[postgres@srv1 ~]$ list
+ 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 | |
+---------------+--------------------+--------------+-----------+----+-----------+
Тот же список узлов, но в древовидном формате (с отступами) можно получить с помощью topology:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml topology $CLNAME
+ Cluster: Pobeda (7683495148262105741) --------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+-----------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address2> | <IP-Address2>:5433 | Leader | running | 3 | |
| + <IP-Address1> | <IP-Address1>:5433 | Sync Standby | streaming | 3 | 0 |
+-----------------+--------------------+--------------+-----------+----+-----------+
Появился + в выводе?
Символ + означает «реплицируется с»: узел <IP-Address1> получает данные от узла <IP-Address2>. Такой древовидный формат особенно удобен, когда в кластере выстроены цепочки каскадной репликации — сразу видно, кто чей подчиненный.
Также, можно запросить индивидуальный статус узлов кластера:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml dsn $CLNAME -r leader
host=<IP-Address2> port=5433
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml dsn $CLNAME -r replica
host=<IP-Address1> port=5433
Можно даже выполнить произвольную SQL-команду на узле кластера:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml query $CLNAME -c "SELECT 1"
?column?
1
Переключение
Представьте, нужно обновить оборудование на мастере, останавливать кластер нельзя. Решение – switchover – плавно передать роль лидера реплике.
При выполнении переключения все узлы кластера должны быть исправны.
Проверим «здоровье» кластера:
[postgres@srv1 ~]$ health
member 54ec0c37709f3054 is healthy: got healthy result from https://<IP-Address1>:2379
member 8c95e735c5b6384c is healthy: got healthy result from https://<IP-Address2>:2379
member c80310d8dc193330 is healthy: got healthy result from https://<IP-Address3>:2379
cluster is healthy
Все в порядке. Посмотрим статус ДО переключения:
[postgres@srv1 ~]$ list
+ 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 | |
+---------------+--------------------+--------------+-----------+----+-----------+
Выполним переключение:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover --leader <IP-Address2> --candidate <IP-Address1> $CLNAME
Сервис покажет текущую топологию и спросит:
- Когда выполнять переключение? Нажимаем Enter – сейчас.
- Уверены ли мы в своем решении? Отвечаем y (
yes):
+ 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 | |
+---------------+--------------------+--------------+-----------+----+-----------+
When should the switchover take place (e.g. 2026-09-09T13:01 ) [now]:
Are you sure you want to switchover cluster Pobeda, demoting current leader <IP-Address2>? [y/N]: y
2026-09-09 12:02:03.47704 Successfully switched over to "<IP-Address1>"
+ Cluster: Pobeda (7683495148262105741) -------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+---------+---------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 3 | |
| <IP-Address2> | <IP-Address2>:5433 | Replica | stopped | | unknown |
+---------------+--------------------+---------+---------+----+-----------+
Сразу после переключения старый мастер становится в роли Replica, но в статусе stopped – это нормально, он «догоняет» нового лидера:
2026-09-08 13:21:07.79971 Successfully switched over to "<IP-Address1>"
+ Cluster: Pobeda (7683495148262105741) -------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+---------+---------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 3 | |
| <IP-Address2> | <IP-Address2>:5433 | Replica | stopped | | unknown |
+---------------+--------------------+---------+---------+----+-----------+
После истечения задержки статус бывшего мастера изменится:
[postgres@srv1 ~]$ list
+ Cluster: Pobeda (7683495148262105741) ------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 4 | |
| <IP-Address2> | <IP-Address2>:5433 | Sync Standby | streaming | 4 | 0 |
+---------------+--------------------+--------------+-----------+----+-----------+
Проверим топологию:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml topology $CLNAME
+ Cluster: Pobeda (7683495148262105741) -------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+----------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 4 | |
| + <IP-Address2>| <IP-Address2>:5433 | Sync Standby | streaming | 4 | 0 |
+----------------+--------------------+--------------+-----------+----+-----------+
Роли поменялись, кластер работает.
Для этой операции тоже есть псевдоним – switch:
[postgres@srv1 ~]$ alias switch
alias switch='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml switchover $CLNAME'
Ручной отказ
А что если мастер упал внезапно? Тогда switchover уже не подходит – он требует, чтобы мастер был исправен. В аварийной ситуации нужен failover, например, когда нет:
- лидера;
- синхронной реплики в кластере синхронной физической репликации.
Не рекомендуется выполнять failover на исправном кластере.
Имитируем отказ srv1:
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover --candidate <IP-Address2> --force $CLNAME
Current cluster topology
+ Cluster: Pobeda (7683495148262105741) ------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Leader | running | 4 | |
| <IP-Address2> | <IP-Address2>:5433 | Sync Standby | streaming | 4 | 0 |
+---------------+--------------------+--------------+-----------+----+-----------+
2026-09-09 12:03:25.68166 Successfully failed over to "<IP-Address2>"
+ 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 | 4 | |
+---------------+--------------------+---------+---------+----+-----------+
Историю событий можно увидеть, используя псевдоним hist:
[postgres@srv1 ~]$ alias hist
alias hist='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml history $CLNAME'
[postgres@srv1 ~]$ hist
+----+-----------+------------------------------+----------------------------------+---------------+
| TL | LSN | Reason | Timestamp | New Leader |
+----+-----------+------------------------------+----------------------------------+---------------+
| 1 | 26865848 | no recovery target specified | 2026-09-09T11:26:01.606225+00:00 | <IP-Address1> |
| 2 | 117440704 | no recovery target specified | 2026-09-09T11:46:18.231993+00:00 | <IP-Address2> |
| 3 | 134218144 | no recovery target specified | 2026-09-09T12:02:03.274828+00:00 | <IP-Address1> |
| 4 | 134218976 | no recovery target specified | 2026-09-09T12:03:25.389538+00:00 | <IP-Address2> |
+----+-----------+------------------------------+----------------------------------+---------------+
Здесь видно:
TL– линия времени СУБД Pangolin, на которой произошло событие;Timestamp– время, когда произошло событие;New Leader– кто стал лидером во время события.
Тем временем, узел srv1 уже мог вернуться в строй в качестве реплики:
[postgres@srv1 ~]$ list
+ Cluster: Pobeda (7683495148262105741) ------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------------+--------------+-----------+----+-----------+
| <IP-Address1> | <IP-Address1>:5433 | Sync Standby | streaming | 5 | 0 |
| <IP-Address2> | <IP-Address2>:5433 | Leader | running | 5 | |
+---------------+--------------------+--------------+-----------+----+-----------+
Для быстрого вызова операции failover СУБД Pangolin предоставляет псевдоним fail:
[postgres@srv1 ~]$ alias fail
alias fail='pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml failover $CLNAME'
Временно перевести весь кластер в режим обслуживания и отключить автоматическое аварийное переключение failover можно, используя команду pause.
Подведем итоги
Вопрос 1
Вопрос 1: Как называется утилита управления кластером Pangolin?
Вопрос 2
Вопрос 2: Исходя из приведенного ниже вывода:
[postgres@srv1 ~]$ health
{"health":"true","reason":""} https://srv3:2379
{"health":"true","reason":""} https://srv1:2379
curl: (7) Failed to connect to srv2 port 2379 after 928 ms: Couldn't connect to server
https://srv2:2379
Из приведенных ниже команд утилиты управления кластером Pangolin выберите те, которые нельзя выполнять в таком состоянии кластера:
Вопрос 3
Вопрос 3: Исходя из приведенного ниже вывода:
[postgres@srv1 ~]$ list
+ Cluster: clustername (7631640677275716087) ---+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+--------+-----------+--------------+-----------+----+-----------+
| srv1 | srv1:5433 | Leader | running | 3 | |
| srv2 | srv2:5433 | Sync Standby | streaming | 3 | 0 |
+--------+-----------+--------------+-----------+----+-----------+
Что вернет следующая команда?
[postgres@srv1 ~]$ pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml dsn $CLNAME -r replica