Перейти к содержанию

DebeziumReplicationSlotWalRetainedWarning, DebeziumReplicationSlotWalRetainedCritical

Что означает алерт

Слот debezium_iams удерживает WAL сверх порога: более 2 ГБ в течение 10 минут (warning) или более 6 ГБ в течение 5 минут (critical).

Лимит max_slot_wal_keep_size на кластере c9qa2coo5ukgcg93fldm равен 10 ГБ. При его достижении PostgreSQL сбрасывает слот, после чего требуются пересоздание слота и повторный снапшот. Диску кластера алерт не угрожает: лимит задан именно для этого.

Нормальное значение: десятки мегабайт.

Лейблы алерта: slot_name.

Диагностика (по шагам)

Команды описаны в разделе 2 общего документа: Debezium: устройство и типовые операции.

  1. Проверить слот и оценить запас:
SELECT active, wal_status,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn))         AS retained,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS unconfirmed,
       pg_size_pretty(safe_wal_size)                                              AS before_lost
FROM pg_replication_slots WHERE slot_name = 'debezium_iams';

before_lost показывает, сколько WAL может быть записано до сброса слота.

  1. Определить причину по сочетанию признаков:
Признаки Причина Действие
active = false Debezium не подключён DebeziumReplicationSlotInactive
active = true, unconfirmed растёт Debezium не подтверждает позицию DebeziumReplicationSlotNotAdvancing
active = true, unconfirmed мал, retained велик позиция подтверждается, restart_lsn отстаёт из-за длинной транзакции в базе шаг 3
  1. Найти длинные транзакции:
SELECT pid, usename, state, now() - xact_start AS xact_age, left(query, 80) AS query
FROM pg_stat_activity
WHERE datname = 'sarex_db' AND xact_start IS NOT NULL
ORDER BY xact_start LIMIT 5;

restart_lsn не может продвинуться дальше начала самой старой открытой транзакции.

Как починить

  1. Слот неактивен или не подтверждает позицию: действовать по соответствующему ранбуку.
  2. Длинная транзакция: выяснить владельца по usename и запросу, согласовать завершение (SELECT pg_terminate_backend(<pid>);). Сессии приложений без согласования не завершать.
  3. Если до сброса слота остаётся мало (before_lost менее 1 ГБ), а причина не устранена, заранее предупредить потребителей о предстоящем повторном снапшоте. Лимит max_slot_wal_keep_size без согласования не повышать: он защищает диск общего кластера stage.

Критерий закрытия

  1. Значение retained уменьшается и возвращается к десяткам мегабайт.
  2. Алерт перешёл в inactive.