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

Задание 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