Всем привет,
Имеется 4 сервака, между ними настроена каскадная потоковая репликация посредством слотов репликации используя repmgr. 1-й сервак - мастер, остальные - стендбаи в которые данные льются по цепочке 1->2->3->4. Первая пара серваков наодится в одной стране, вторая в другой. Между 2 и 3 серваками настроен VPN (wireguard). Раз в пару дней отваливаются 3-я и 4-я реплики. В логах:
2021-07-31 14:32:58.287 EEST [26816] LOG: incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26838] FATAL: terminating walreceiver process due to administrator command
2021-07-31 14:32:58.287 EEST [26816] LOG: incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26816] LOG: incorrect resource manager data checksum in record at 2F/AD7E97B8
...
repmgr cluster show
говорит:
WARNING: node "drpg1" not found in "pg_stat_replication"
WARNING: node "drpg2" not found in "pg_stat_replication"
ID | Name | Role | Status | Upstream | Location | Priority | Timeline | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
1 | pg1 | primary | * running | | default | 100 | 1 | host=pg1 user=repmgr dbname=repmgr connect_timeout=2
2 | pg2 | standby | running | pg1 | default | 100 | 1 | host=pg2 user=repmgr dbname=repmgr connect_timeout=2
3 | drpg1 | standby | running | ! pg2 | default | 100 | 1 | host=drpg1 user=repmgr dbname=repmgr connect_timeout=2
4 | drpg2 | standby | running | ! drpg1 | default | 100 | 1 | host=drpg2 user=repmgr dbname=repmgr connect_timeout=2
WARNING: following issues were detected
- node "drpg1" (ID: 3) is not attached to its upstream node "pg2" (ID: 2)
- node "drpg2" (ID: 4) is not attached to its upstream node "drpg1" (ID: 3)
Если перезапустить 3-ю и 4-ю реплики, то 3-я переходит в состояние catchup
:
WARNING: node "drpg1" attached in state "catchup"
...
WARNING: following issues were detected
- node "drpg1" (ID: 3) attached to its upstream node "pg2" (ID: 2) in state "catchup"
...и после подтягивания WAL, реплики 3 и 4 переходит в нормальное состояние.
Увеличивать connect_timeout нет смысла, так как соединение между серваками которые находятся в разных странах может может пропадать надолго.
ВОПРОС: есть ли какой-то способ заставить постгре на 3-й реплике перезапускать walreceiver в случае обнаружения проблем с контрольными суммами либо пропаданием коннекта?
З.Ы: можно наколхозить скрипт который будет перезапускать посгре на 3-м и 4-м серваках при возникновении выше описанных ошибок. Но хочется более элегантное решение.