postgrespro / mamonsu

BSD 3-Clause "New" or "Revised" License
186 stars 29 forks source link

Лаг репликации на primary сервере #180

Closed pkarezin closed 2 years ago

pkarezin commented 2 years ago

Добрый день, столкнулись со следующей проблемой при использовании 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)
sgrinko commented 2 years ago

Подтверждаю. В режиме 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();
    """
),
cuprumtan commented 2 years ago

Добрый день! Добавили фикс в версию 3.3.0.

sgrinko commented 2 years ago

Спасибо! Будем пробовать