TGViewer
rzv Data Engineering rzv Data Engineering @rzv_de · 3.03K subscribers
Post #479 883
Неочевидная причина, по которой может расти WAL в Postgres при использовании Debezium 1/2

Допустим, быстро меняющиеся таблицы создают много шума и они выгружаются батчами в конце дня. Отслеживать каждое изменение мы хотим для медленно меняющихся таблиц, справочников, редко меняющихся витрин. В table.include.list можно указать только медленно меняющиеся таблицы в конфиге коннектора. Разберёмся, почему при большом числе изменений в других таблицах растущий write-ahead log (WAL, журнал изменений в Postgres) может заполнить диск, хотя коннектор работает штатно.

🔸 Почему медленно меняющиеся таблицы могут удерживать WAL?

Вначале вспомним то, как работает коннектор в норме. WAL хранит в себе записи об изменениях всех таблиц на инстансе Postgres. Если у нас произошло несколько обновлений одной строки подряд, в таблице сохранится только последнее состояние, а вот WAL запомнит все изменения.

Для подключения коннектора Debezium нужно создать слот репликации и публикацию. То есть мы переиспользуем механизм логической репликации Postgres, но направляем поток изменений в Kafka вместо другого инстанса Postgres. Каждое изменение из WAL оборачивается в JSON (иногда в Avro, Protobuf) и складывается в виде сообщения в топик Kafka. Когда Kafka подтвердит запись, Kafka Connect сохраняет оффсет коннектора, и Debezium сообщает Postgres новую прочитанную позицию, `restart_lsn`. После этого Postgres может удалить WAL до этой позиции. Топик мы отдельным sink-коннектором выгружаем в S3, ClickHouse или другой приёмник для долговременного хранения.

При этом один коннектор может отслеживать состояние нескольких таблиц в одной схеме, и так часто делают для оптимизации операционных работ. Отслеживать десяток коннекторов сильно проще, чем сотню :)

Слот репликации, к которому подключен коннектор, удерживает WAL всего экземпляра Postgres, а подтверждает позицию коннектор только по событиям из отслеживаемых таблиц. Пока в них нет изменений, confirmed_flush_lsn стоит на месте, тогда как остальные таблицы продолжают писать в WAL, и объём удержанного журнала растёт.

Тогда хочется отправлять периодический сигнал о том, что всё в порядке, и отпускать WAL. Возможно, поможет настройка heartbeat.interval.ms.
  • ❤ 1
More from @rzv_de
  1. Oct 4, 2026Как z-order помогает Iceberg пропускать лишние файлы Представим таблицу с детализацией зво…
  2. Oct 4, 2026photo post
  3. Sep 30, 2026Вышла лаба про CDC конвейер из PostgreSQL через Debezium и Kafka Connect в S3! Как и на др…
  4. Sep 29, 2026Неочевидная причина, по которой может расти WAL в Postgres при использовании Debezium 2/2…
  5. Sep 29, 2026photo post
  6. Sep 22, 2026Как равномерно размазывать данные Часто в командах, где я работал, проверяли равномерность…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →