Цханге Дата Цаптуре (ЦДЦ) је техника која се користи за праћење промена на нивоу реда у операцијама базе података (уметања, ажурирања, брисања) и обавештавање других система по редоследу догађаја. У сценаријима опоравка од катастрофе, ЦДЦ првенствено синхронизује податке између примарне и резервне базе података, омогућавајући синхронизацију података у реалном времену из примарне у секундарну базу података.
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
У СеаТуннел ЦДЦ-у, маркери се шаљу свим читачима, подељеним пописивачима, писцима и другим чворовима, при чему сваки задржава своје стање меморије.