Допустим, быстро меняющиеся таблицы создают много шума и они выгружаются батчами в конце дня. Отслеживать каждое изменение мы хотим для медленно меняющихся таблиц, справочников, редко меняющихся витрин. В 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.