Увод у ЦДЦ (Цханге Дата Цаптуре) Цханге Дата Цаптуре (ЦДЦ) је техника која се користи за праћење промена на нивоу реда у операцијама базе података (уметања, ажурирања, брисања) и обавештавање других система по редоследу догађаја. У сценаријима опоравка од катастрофе, ЦДЦ првенствено синхронизује податке између примарне и резервне базе података, омогућавајући синхронизацију података у реалном времену из примарне у секундарну базу података. source ----------> CDC ----------> sink Апацхе СеаТуннел ЦДЦ СеаТуннел ЦДЦ нуди две врсте синхронизације података: : Чита историјске податке из табеле. Читање снимка : Чита инкременталне промене дневника из табеле. Инкрементално праћење Синхронизација снимка без закључавања Фаза синхронизације снимака без закључавања је наглашена јер многе постојеће ЦДЦ платформе, као што је Дебезиум, могу закључати табеле током историјске синхронизације података. Читање снимка је процес синхронизације историјских података базе података. Основни ток овог процеса је следећи: storage -------------> splitEnumerator ---------- split ----------> reader ^ | | | \----------------- report -----------/ Сплит Партитионинг (сплит дистрибутор) дели податке табеле у више подела на основу одређених поља (као што су ИД табеле или јединствени кључеви) и дефинисане величине корака. splitEnumerator Паралелна обрада Свака подела је додељена другом читачу за паралелно читање. Један читач ће заузети једну везу. Повратне информације о догађају Након завршетка операције читања за сплит, сваки читач пријављује напредак назад у . Метаподаци за поделу су дати на следећи начин: 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 Када читач прими подељене информације, генерише одговарајуће СКЛ изразе. Пре почетка, он бележи одговарајућу позицију тренутног одвајања у евиденцију базе података. Након завршетка тренутног поделе, читач пријављује напредак у са следећим подацима: splitEnumerator String splitId # Split ID Offset highWatermark # Log position corresponding to the split, for future validation Инкрементална синхронизација Фаза инкременталне синхронизације почиње након фазе читања снимка. У овој фази, све промене које се дешавају у изворној бази података се снимају и синхронизују са базом података резервних копија у реалном времену. Ова фаза слуша евиденцију базе података (нпр. МиСКЛ бинлог). Инкрементално праћење је обично једнонитно да би се избегло дупло повлачење бинлог-а и смањило оптерећење базе података. Стога се користи само један читач који заузима једну везу. data log -------------> splitEnumerator ---------- split ----------> reader ^ | | | \----------------- report -----------/ У фази инкременталне синхронизације, све поделе и табеле из фазе снимка се комбинују у једну поделу. Раздвојени метаподаци током ове фазе су следећи: 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 Поља су следећа: CompletedSnapshotSplitInfo String splitId TableId tableId SeatunnelRowType splitKeyType Object splitStart Object splitEnd Offset watermark # Corresponds to the highWatermark in the report Подела у инкременталној фази садржи водени жиг за све поделе у фази снимка. Минимални водени жиг се бира као полазна тачка за инкременталну синхронизацију. Семантика тачно једном Било да је у фази читања снимка или инкременталног читања, база података се такође може променити ради синхронизације. Како гарантујемо тачно једну испоруку? Фаза читања снимка У фази читања снимка, на пример, подела се синхронизује док се дешавају промене, као што је уметање реда , ажурирање на и брисање . Ако се током процеса читања не користи идентификација задатка, ажурирања могу бити изгубљена. СеаТуннел ово решава тако што: k3 k2 k1 Прво, провера бинлог позиције (низак водени жиг) пре читања поделе. Читање података у опсегу . split{start, end} Снимање високог воденог жига након читања. Ако је , подаци за поделу се нису променили током читања. Ако је , дошло је до промена током обраде. У том случају, СеаТуннел ће: high = low (high - low) > 0 Кеширајте подељене податке у меморију као табелу у меморији. Примените промене од до по редоследу, користећи примарне кључеве за понављање операција на табели у меморији. low watermark high watermark Пријавите високи водени жиг. 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 Инкрементална фаза Пре почетка инкременталне фазе, СеаТуннел прво потврђује све поделе из претходног корака. Између подела, подаци се могу ажурирати, на пример, ако се нови записи уметну између сплит1 и сплит2, могли би бити пропуштени током фазе снимка. Да би повратио ове податке између подела, СеаТуннел следи овај приступ: Из свих подељених извештаја пронађите најмањи водени жиг као почетни водени жиг да бисте почели да читате дневник. За сваки прочитан унос у евиденцији, проверите да бисте видели да ли су подаци обрађени у било којој подели. Ако није, сматра се подацима између подела и треба их исправити. completedSnapshotSplitInfos Када су сва подела потврђена, процес прелази на пуну инкременталну фазу. |------------filter split2-----------------| |----filter split1------| data log -|-----------------------|------------------|----------------------------------|- log offset min watermark split1 watermark split2 watermark max watermark Контролна тачка и животопис Шта је са паузирањем и настављањем ЦДЦ-а? СеаТуннел користи дистрибуирани алгоритам снимака (Цханди-Лампорт): Претпоставимо да систем има два процеса, и , где има три променљиве и има три променљиве . Почетна стања су следећа: 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 p1 p2 Пре него што маркер стигне до , шаље поруку на . p2 p2 M p1 p1 p2 X1:0 -------marker-------> X2:4 Y1:0 <---------M---------- Y2:2 Z1:0 Z2:3 По пријему маркера, бележи његово стање, а добија поруку Пошто је већ извршио локални снимак, потребно је само да евидентира поруку Коначни снимак изгледа овако: p2 p1 M p1 M p1 M p2 X1:0 X2:4 Y1:0 Y2:2 Z1:0 Z2:3 У СеаТуннел ЦДЦ-у, маркери се шаљу свим читачима, подељеним пописивачима, писцима и другим чворовима, при чему сваки задржава своје стање меморије.