Suckearge Your The ETL-трубопровод Seatunnel без блокировки CDC

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 решает это:

  1. ЧтениеНизкий водяной знакиз журнала базы данных перед разделением
  2. Чтение данных для разделения{start, end}
  3. ЗаписьВысокий водяной знакПосле раскола
  4. Еслиhigh = low, никаких изменений не произошло. Еслиhigh > low, произошло изменение во время чтения. Seatunnel:
    • Данные снимка кэша в памяти в памяти
    • Воспроизведение журналов событий между низким и высоким водяным знаком в таблице в памяти, используя первичный заказ
  5. Отчеты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 маркеры отправляются на все узлы - читатели, разделенные розыгрыши, писатели - и каждый хранит свое нынешнее состояние для восстановления.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE