Лаг репликации на primary сервере
pkarezin opened this issue · 3 comments
Добрый день, столкнулись со следующей проблемой при использовании mamonsu 3.1.2 и PostgreSQL 9.6.
Если процесс postmaster будет завершен некорректно (kill -9), то после запуска сервера будет взведен триггер PostgreSQL: streaming replication lag, даже если это primary или standalone сервер.
SELECT now() - pg_last_xact_replay_timestamp() будет отображать время с момента запуска startup на сервере.
# SELECT now() - pg_last_xact_replay_timestamp();
?column?
----------------
00:21:15.10736
(1 row)
Подтверждаю.
В режиме bootstrap в функции mamonsu.timestamp_get() не учтен вариант запуска данной функции на master реплике.
Дело в том, что при вычислении выражения мы получаем LSN = NULL - это даёт ложь и вычисляется ELSE

Необходимо изменить функцию mamonsu/mamonsu/plugins/pgsql/driver/pool.py :
"replication_lag_slave_query": (
"""
SELECT CASE WHEN coalesce(pg_last_{1}(), '0/00000000') = coalesce(pg_last_{2}(), '0/00000000')
THEN 0
ELSE extract (epoch FROM now() - coalesce(pg_last_xact_replay_timestamp(), now() - INTERVAL '{0} seconds'))
END;
""",
"""
SELECT mamonsu.timestamp_get();
"""
),
таким образом ->
"replication_lag_slave_query": (
"""
SELECT CASE WHEN not pg_is_in_recovery() or coalesce(pg_last_{1}(), '0/00000000') = coalesce(pg_last_{2}(), '0/00000000')
THEN 0
ELSE extract (epoch FROM now() - coalesce(pg_last_xact_replay_timestamp(), now() - INTERVAL '{0} seconds'))
END;
""",
"""
SELECT mamonsu.timestamp_get();
"""
),
Спасибо!
Будем пробовать