
Suckearge Your The ETL-трубопровод Seatunnel без блокировки CDC
19 июня 2025 г.Что такое CDC?
Изменить захват данных (CDC)это механизм, который отслеживает изменения на уровне строк (вставления, обновления, удаляет) в базе данных и уведомляет нисходящие системы в порядке, в котором они встречаются. В сценариях аварийного восстановления CDC часто используется для синхронизации в реальном времени от первичной базы данных до резервной.
source ----------> CDC ----------> sink
Apache Seatunnel CDC
Seatunnel CDC поддерживает два типа синхронизации:
- Снимки чтения: Читает исторические данные из таблиц
- Покрементное отслеживание: Захватывает и считывает постепенные журналы изменений из таблиц
Без блокировки синхронизация
Зачем подчеркивать «без блокировки»? Потому что некоторые платформы CDC (например, Debezium) могут блокировать таблицы во время исторической синхронизации данных. Seatunnel избегает этого, читая снимки без блокировки. Вот основной процесс чтения снимков:
storage------------->splitEnumerator----------split---------->reader
^ |
| |
\-----------------report------------/
Разделение задания:splitEnumerator
делит данные таблицы на несколько кусков (разделения) на основе указанного поля (например, идентификатор таблицы или уникальный ключ) и размер шага.
Параллельная обработка: Каждое разделение направлено к другому читателю для параллельного чтения. Каждый читатель занимает одно соединение.
Обратная связь с событием: После завершения раскола читатель сообщаетsplitEnumerator
Полем
Каждое разделение, отправленное читателю, содержит метаданные:
String splitId // Routing ID
TableId tableId // Table ID
SeatunnelRowType splitKeyType // Field type used for splitting
Object splitStart // Split start point
Object splitEnd // Split end point
Читатель генерирует операторы SQL на основе этой информации. Перед чтением он записывает позицию журнала (low watermark
) для разделения. После завершения он сообщает:
String splitId // Split ID
Offset highWatermark // Log position after split is processed
Покрементная синхронизация
После чтения снимка любые изменения в источнике DB непрерывно фиксируются и синхронизируются в режиме реального времени. В отличие от фазы снимка, этот этап читается из журнала DB (например, MySQL Binlog) и обычно используетоднопоточный читательЧтобы уменьшить давление на БД.
data log------------->splitEnumerator----------split---------->reader
^ |
| |
\-----------------report------------/
Во время инкрементной синхронизации все снимки снимка и таблицы объединены в один сплит. Метаданные для постепенного раскола:
String splitId
Offset startingOffset // Earliest log start across all splits
Offset endingOffset // Log end position; null if continuous
List<TableId> tableIds
Map<TableId, Offset> tableWatermarks // Watermarks per table from snapshot phase
List<CompletedSnapshotSplitInfo> completedSnapshotSplitInfos // Snapshot split details
ЗавершеноВключает в себя:
String splitId
TableId tableId
SeatunnelRowType splitKeyType
Object splitStart
Object splitEnd
Offset watermark // High watermark from report
Покрементная фаза находитНаименьший водяной знакИз снимков спрыгнет и начинает читать с этой позиции журнала.
Точная гарантия
Будь то во время снижения или инкрементной синхронизации, база данных все еще может измениться. Как Seatunnel обеспечиваетточнообработка?
Фаза снимка
Во время чтения снимка представьте, что раскол прочитан и изменение данных (например, вставьте K3, обновление K2, Delete K1). Без специальной обработки можно пропустить обновления. Seatunnel решает это:
- ЧтениеНизкий водяной знакиз журнала базы данных перед разделением
- Чтение данных для разделения
{start, end}
- ЗаписьВысокий водяной знакПосле раскола
- Если
high = low
, никаких изменений не произошло. Еслиhigh > low
, произошло изменение во время чтения. Seatunnel:- Данные снимка кэша в памяти в памяти
- Воспроизведение журналов событий между низким и высоким водяным знаком в таблице в памяти, используя первичный заказ
- Отчеты
high watermark
insert k3 update k2 delete k1
| | |
v v v
bin log --|---------------------------------------------------|-- log offset
low watermark high watermark
CDC read data: k1 k3 k4
| replay
v
Final result: k2 k3' k4
Покрементная фаза
Перед началом инкрементной синхронизации Seatunnel проверяет фазу снимка. Это проверяет наМежплентные изменения- Изменения даты, которые могли произойти между расщеплениями. Seatunnel обращается с этим:
- Поиск минимального водяного знака от всех снимков снимка
- Начинать читать с этой позиции журнала
- Для каждого события журнала проверка, если данные уже были обработаны в разделении снимка
- Если нет, то это межплютные данные и будут исправлены
- После того, как все таблицы подтверждены, начинается истинная инкрементная синхронизация
|------------filter split2-----------------|
|----filter split1------|
data log -|-----------------------|------------------|----------------------------------|- log offset
min watermark split1 watermark split2 watermark max watermark
Устойчивость к неисправности и контрольно -пропускной пункт
Как поддержать паузу и резюме? Seatunnel используетАлгоритм распределенного снимка Chandy-LamportПолем
Предположим, что два процесса, P1 и P2: P1 имеют переменные x1 y1 Z1, P2 имеет x2 y2 Z2:
p1 p2
X1:0 X2:4
Y1:0 Y2:2
Z1:0 Z2:3
P1 инициирует глобальный снимок, записывая свой местный штат и отправивмаркердо стр. До того, как P2 получит его, он отправляетСообщение mдо стр.
p1 p2
X1:0 -------marker-------> X2:4
Y1:0 <---------M---------- Y2:2
Z1:0 Z2:3
P2 получает маркер, записывает свое собственное состояние. Затем P1 получает сообщение M и регистрирует его отдельно, так как он уже сделал снимок. Окончательный снимки:
p1 M p2
X1:0 X2:4
Y1:0 Y2:2
Z1:0 Z2:3
В Seatunnel CDC маркеры отправляются на все узлы - читатели, разделенные розыгрыши, писатели - и каждый хранит свое нынешнее состояние для восстановления.
Оригинал