paint-brush
Cara Memahami Prinsip Penyegerakan CDC (Tukar Tangkapan Data) dalam Satu Artikeloleh@Apache
sejarah baru

Cara Memahami Prinsip Penyegerakan CDC (Tukar Tangkapan Data) dalam Satu Artikel

oleh SeaTunnel10m2025/02/23
Read on Terminal Reader

Terlalu panjang; Untuk membaca

Change Data Capture (CDC) ialah teknik yang digunakan untuk menjejaki perubahan pada peringkat baris dalam operasi pangkalan data (sisipan, kemas kini, pemadaman) dan memberitahu sistem lain dalam susunan acara.
featured image - Cara Memahami Prinsip Penyegerakan CDC (Tukar Tangkapan Data) dalam Satu Artikel
SeaTunnel HackerNoon profile picture

Pengenalan kepada CDC (Ubah Tangkapan Data)

Change Data Capture (CDC) ialah teknik yang digunakan untuk menjejaki perubahan pada peringkat baris dalam operasi pangkalan data (sisipan, kemas kini, pemadaman) dan memberitahu sistem lain dalam susunan acara. Dalam senario pemulihan bencana, CDC terutamanya menyegerakkan data antara pangkalan data utama dan sandaran, membolehkan penyegerakan data masa nyata daripada pangkalan data utama ke pangkalan data sekunder.

 source ----------> CDC ----------> sink

Apache SeaTunnel CDC

SeaTunnel CDC menawarkan dua jenis penyegerakan data:

  • Bacaan Syot Kilat : Membaca data sejarah daripada jadual.
  • Penjejakan Bertambah : Membaca perubahan log tambahan daripada jadual.

Penyegerakan Syot Kilat Tanpa Kunci

Fasa penyegerakan syot kilat tanpa kunci dititikberatkan kerana banyak platform CDC sedia ada, seperti Debezium, mungkin mengunci jadual semasa penyegerakan data sejarah. Bacaan syot kilat ialah proses menyegerakkan data sejarah pangkalan data. Aliran asas proses ini adalah seperti berikut:

 storage -------------> splitEnumerator ---------- split ----------> reader ^ | | | \----------------- report -----------/

Pembahagian Pisah

splitEnumerator (pengedar berpecah) membahagikan data jadual kepada berbilang pembahagian berdasarkan medan tertentu (seperti ID jadual atau kekunci unik) dan saiz langkah yang ditentukan.


Pemprosesan Selari

Setiap pembahagian diberikan kepada pembaca yang berbeza untuk bacaan selari. Pembaca tunggal akan menduduki satu sambungan.


Maklum Balas Acara

Selepas melengkapkan operasi baca untuk pemisahan, setiap pembaca melaporkan kemajuan kembali ke splitEnumerator . Metadata untuk pemisahan disediakan seperti berikut:

 String splitId # Routing ID TableId tableId # Table ID SeatunnelRowType splitKeyType # The type of field used for partitioning Object splitStart # Start point of the partition Object splitEnd # End point of the partition


Sebaik sahaja pembaca menerima maklumat berpecah, ia menjana pernyataan SQL yang sesuai. Sebelum bermula, ia mencatatkan kedudukan sepadan pemisahan semasa dalam log pangkalan data. Selepas melengkapkan pemisahan semasa, pembaca melaporkan kemajuan kepada splitEnumerator dengan data berikut:

 String splitId # Split ID Offset highWatermark # Log position corresponding to the split, for future validation

Penyegerakan Bertambah

Fasa penyegerakan tambahan bermula selepas fasa bacaan syot kilat. Dalam peringkat ini, sebarang perubahan yang berlaku dalam pangkalan data sumber ditangkap dan disegerakkan ke pangkalan data sandaran dalam masa nyata. Fasa ini mendengar log pangkalan data (cth, MySQL binlog). Penjejakan tambahan biasanya berbenang tunggal untuk mengelakkan penarikan pendua binlog dan mengurangkan beban pangkalan data. Oleh itu, hanya satu pembaca digunakan, menduduki satu sambungan.

 data log -------------> splitEnumerator ---------- split ----------> reader ^ | | | \----------------- report -----------/


Dalam fasa penyegerakan tambahan, semua pemisahan dan jadual daripada fasa syot kilat digabungkan menjadi satu pemisahan. Metadata pecahan semasa fasa ini adalah seperti berikut:

 String splitId Offset startingOffset # The lowest log start position among all splits Offset endingOffset # Log end position, or "continuous" if ongoing, eg, in the incremental phase List<TableId> tableIds Map<TableId, Offset> tableWatermarks # Watermark for all splits List<CompletedSnapshotSplitInfo> completedSnapshotSplitInfos # Snapshot phase split details


Medan CompletedSnapshotSplitInfo adalah seperti berikut:

 String splitId TableId tableId SeatunnelRowType splitKeyType Object splitStart Object splitEnd Offset watermark # Corresponds to the highWatermark in the report

Pemisahan dalam fasa tambahan mengandungi tera air untuk semua pemisahan dalam fasa syot kilat. Tera air minimum dipilih sebagai titik permulaan untuk penyegerakan tambahan.

Semantik Tepat-Sekali

Sama ada dalam fasa bacaan syot kilat atau bacaan tambahan, pangkalan data mungkin juga berubah untuk penyegerakan. Bagaimanakah kami menjamin tepat satu penghantaran?

Fasa Bacaan Syot Kilat

Dalam fasa baca syot kilat, contohnya, pemisahan sedang disegerakkan semasa perubahan berlaku, seperti penyisipan baris k3 , kemas kini kepada k2 dan pemadaman k1 . Jika tiada pengenalan tugas digunakan semasa proses membaca, kemas kini boleh hilang. SeaTunnel mengendalikan ini dengan:


  • Mula-mula, semak kedudukan binlog (tanda air rendah) sebelum membaca pecahan.
  • Membaca data dalam split{start, end} .
  • Merakam tera air yang tinggi selepas membaca.


Jika high = low , data untuk pemisahan tidak berubah semasa pembacaan. Jika (high - low) > 0 , perubahan telah berlaku semasa pemprosesan. Dalam kes sedemikian, SeaTunnel akan:


  • Cache data pisah dalam ingatan sebagai jadual dalam ingatan.
  • Gunakan perubahan daripada low watermark kepada high watermark mengikut urutan, menggunakan kekunci utama untuk memainkan semula operasi pada jadual dalam memori.
  • Laporkan tera air yang tinggi.


 insert k3 update k2 delete k1 | | | vvv bin log --|---------------------------------------------------|-- log offset low watermark high watermark CDC reads: k1 k3 k4 | Replays v Real data: k2 k3' k4

Fasa Pertambahan

Sebelum memulakan fasa tambahan, SeaTunnel terlebih dahulu mengesahkan semua pemisahan daripada langkah sebelumnya. Di antara pemisahan, data mungkin dikemas kini, contohnya, jika rekod baharu dimasukkan antara pemisahan1 dan pemisahan2, ia boleh terlepas semasa fasa syot kilat. Untuk memulihkan data ini antara pemisahan, SeaTunnel mengikut pendekatan ini:


  • Daripada semua laporan berpecah, cari tera air terkecil sebagai tera air permulaan untuk mula membaca log.
  • Untuk setiap entri log yang dibaca, semak completedSnapshotSplitInfos untuk melihat sama ada data telah diproses dalam sebarang pemisahan. Jika tidak, ia dianggap data antara pemisahan dan harus diperbetulkan.
  • Setelah semua pemisahan disahkan, proses bergerak ke fasa tambahan penuh.


 |------------filter split2-----------------| |----filter split1------| data log -|-----------------------|------------------|----------------------------------|- log offset min watermark split1 watermark split2 watermark max watermark

Checkpoint dan Resume

Bagaimana pula dengan menjeda dan menyambung semula CDC? SeaTunnel menggunakan algoritma syot kilat teragih (Chandy-Lamport):

Andaikan sistem mempunyai dua proses, p1 dan p2 , di mana p1 mempunyai tiga pembolehubah X1 Y1 Z1 dan p2 mempunyai tiga pembolehubah X2 Y2 Z2 . Keadaan awal adalah seperti berikut:

 p1 p2 X1:0 X2:4 Y1:0 Y2:2 Z1:0 Z2:3


Pada ketika ini, p1 memulakan syot kilat global. p1 mula-mula merekodkan keadaan prosesnya, kemudian menghantar penanda ke p2 .


Sebelum penanda mencapai p2 , p2 menghantar mesej M ke p1 .

 p1 p2 X1:0 -------marker-------> X2:4 Y1:0 <---------M---------- Y2:2 Z1:0 Z2:3


Setelah menerima penanda, p2 merekodkan keadaannya, dan p1 menerima mesej M . Memandangkan p1 sudah melakukan syot kilat tempatan, ia hanya perlu log mesej M . Gambar akhir kelihatan seperti ini:

 p1 M p2 X1:0 X2:4 Y1:0 Y2:2 Z1:0 Z2:3


Dalam SeaTunnel CDC, penanda dihantar kepada semua pembaca, pembanci berpecah, penulis dan nod lain, masing-masing mengekalkan keadaan ingatannya.