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
SeaTunnel CDC menawarkan dua jenis penyegerakan data:
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
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.
Sama ada dalam fasa bacaan syot kilat atau bacaan tambahan, pangkalan data mungkin juga berubah untuk penyegerakan. Bagaimanakah kami menjamin tepat satu penghantaran?
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:
split{start, end}
.
Jika high = low
, data untuk pemisahan tidak berubah semasa pembacaan. Jika (high - low) > 0
, perubahan telah berlaku semasa pemprosesan. Dalam kes sedemikian, SeaTunnel akan:
low watermark
kepada high watermark
mengikut urutan, menggunakan kekunci utama untuk memainkan semula operasi pada jadual dalam memori.
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
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:
completedSnapshotSplitInfos
untuk melihat sama ada data telah diproses dalam sebarang pemisahan. Jika tidak, ia dianggap data antara pemisahan dan harus diperbetulkan.
|------------filter split2-----------------| |----filter split1------| data log -|-----------------------|------------------|----------------------------------|- log offset min watermark split1 watermark split2 watermark max watermark
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.