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: : Membaca data sejarah daripada jadual. Bacaan Syot Kilat : Membaca perubahan log tambahan daripada jadual. Penjejakan Bertambah 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 (pengedar berpecah) membahagikan data jadual kepada berbilang pembahagian berdasarkan medan tertentu (seperti ID jadual atau kekunci unik) dan saiz langkah yang ditentukan. splitEnumerator 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 . Metadata untuk pemisahan disediakan seperti berikut: splitEnumerator 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 dengan data berikut: splitEnumerator 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 adalah seperti berikut: CompletedSnapshotSplitInfo 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 , kemas kini kepada dan pemadaman . Jika tiada pengenalan tugas digunakan semasa proses membaca, kemas kini boleh hilang. SeaTunnel mengendalikan ini dengan: k3 k2 k1 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 , data untuk pemisahan tidak berubah semasa pembacaan. Jika , perubahan telah berlaku semasa pemprosesan. Dalam kes sedemikian, SeaTunnel akan: high = low (high - low) > 0 Cache data pisah dalam ingatan sebagai jadual dalam ingatan. Gunakan perubahan daripada kepada mengikut urutan, menggunakan kekunci utama untuk memainkan semula operasi pada jadual dalam memori. low watermark high watermark 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 untuk melihat sama ada data telah diproses dalam sebarang pemisahan. Jika tidak, ia dianggap data antara pemisahan dan harus diperbetulkan. completedSnapshotSplitInfos 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, dan , di mana mempunyai tiga pembolehubah dan mempunyai tiga pembolehubah . Keadaan awal adalah seperti berikut: p1 p2 p1 X1 Y1 Z1 p2 X2 Y2 Z2 p1 p2 X1:0 X2:4 Y1:0 Y2:2 Z1:0 Z2:3 Pada ketika ini, memulakan syot kilat global. mula-mula merekodkan keadaan prosesnya, kemudian menghantar penanda ke . p1 p1 p2 Sebelum penanda mencapai , menghantar mesej ke . p2 p2 M p1 p1 p2 X1:0 -------marker-------> X2:4 Y1:0 <---------M---------- Y2:2 Z1:0 Z2:3 Setelah menerima penanda, merekodkan keadaannya, dan menerima mesej . Memandangkan sudah melakukan syot kilat tempatan, ia hanya perlu log mesej . Gambar akhir kelihatan seperti ini: p2 p1 M p1 M 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.