Назад | Перейти на главную страницу

repmgr - после переключения при отказе оба узла действуют как мастер

У меня есть двухузловой кластер PostgreSQL, настроенный через repmgr.
Топология базы данных выглядит так:

db1 - 10.10.10.50 ( master )
db2 - 10.10.10.60 ( standby )
wit - 10.10.10.70 ( witness )

Создание кластера (как репликация, так и автоматический переход на другой ресурс) работает как положено, но проблема в следующем.

Допустим, что в моем кластере db1 узел выходит из строя, то ожидается, что db2 узел становится новым мастером. Это все хорошо, и журналы подтверждают это:

[WARNING] connection to upstream has been lost, trying to recover... 60 seconds before failover decision
[WARNING] connection to upstream has been lost, trying to recover... 50 seconds before failover decision
[WARNING] connection to upstream has been lost, trying to recover... 40 seconds before failover decision
[WARNING] connection to upstream has been lost, trying to recover... 30 seconds before failover decision
[WARNING] connection to upstream has been lost, trying to recover... 20 seconds before failover decision
[WARNING] connection to upstream has been lost, trying to recover... 10 seconds before failover decision
[ERROR] unable to reconnect to upstream after 60 seconds...
[ERROR] connection to database failed: could not connect to server: No route to host
        Is the server running on host "10.10.10.50" and accepting
        TCP/IP connections on port 5432?

[ERROR] connection to database failed: could not connect to server: No route to host
        Is the server running on host "10.10.10.50" and accepting
        TCP/IP connections on port 5432?

[NOTICE] promoting standby
[NOTICE] promoting server using '/usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/9.3/main promote'
[NOTICE] STANDBY PROMOTE successful.  You should REINDEX any hash indexes you have.

В db2 узел теперь повышен до нового мастера, и все в порядке, пока db1 узел возвращается в рабочее состояние.

В этом сценарии ожидается, что db1 to стал новым резервным, но это не тот случай, поскольку в итоге оба узла действуют как ведущие ?!

Итак, мой вопрос: после аварийного переключения, как я могу предотвратить, чтобы оба узла действовали как ведущие (в документации говорится, что нужно включить третий узел в качестве свидетеля - у меня это есть), но желаемого эффекта нет.

Вот пример моего файла repmgr.conf:

cluster=test_cluster
node=1
node_name=db1
conninfo='host=10.10.10.50 dbname=repmgr user=repmgr'
master_response_timeout=60
reconnect_attempts=6
reconnect_interval=10
failover=automatic
promote_command='repmgr standby promote -f /etc/repmgr/repmgr.conf'
follow_command='repmgr standby follow -f /etc/repmgr/repmgr.conf'
pg_bindir=/usr/lib/postgresql/9.3/bin

И состояние кластера после db1 узел возвращается:

repmgr -f /etc/repmgr/repmgr.conf cluster show
Role      | Connection String
* master  | host=10.10.10.50 dbname=repmgr user=repmgr
* master  | host=10.10.10.60 dbname=repmgr user=repmgr
  witness | host=10.10.10.70 dbname=repmgr user=repmgr port=5499

Огромное спасибо,
С уважением

Часто желательно вернуть отказавший мастер обратно в репликацию в качестве резервного. Во-первых, убедитесь, что главный сервер PostgreSQL больше не работает; тогда используйте repmgr standby clone для повторной синхронизации своего каталога данных с текущим мастером, например:

repmgr -f /etc/repmgr/repmgr.conf --force --rsync-only  -h node2 -d repmgr -U repmgr --verbose  standby clone

Здесь важно использовать параметры командной строки --force, чтобы убедиться, что repmgr будет повторно использовать существующий каталог данных, и --rsync-only, что заставляет repmgr использовать rsync скорее, чем pg_basebackup, так как последний можно использовать только для клонирования нового резервного.

Затем узел можно перезапустить. Затем узел необходимо будет повторно зарегистрировать в repmgr; снова --force опция необходима для обновления существующей записи:

repmgr -f /etc/repmgr/9.5/repmgr.conf --force standby register

Несколько месяцев назад я изучал возможность автоматического переключения при отказе с помощью repmgr. Кажется, что repmgr работает должным образом.

IIRC repmgr не запускает старый мастер в качестве нового резервного, вам нужно будет запустить --force standby clone. Вы можете настроить другие резервные узлы так, чтобы они следовали новому мастеру, если произойдет аварийное переключение (за ним следует резервный repmgr).

  • Ожидаете ли вы, что ваш хозяин неожиданно поправится?
  • Как вы справляетесь с отработкой отказа в своем приложении?
  • Разве вы не перенаправляете весь трафик базы данных новому мастеру?