Change Data Capture (CDC) – бул маалымат базасынын операцияларындагы (киргизүүлөр, жаңыртуулар, жок кылуулар) сап деңгээлиндеги өзгөрүүлөргө көз салуу жана окуялардын тартиби боюнча башка системаларга кабарлоо үчүн колдонулган ыкма. Кырсыктарды калыбына келтирүү сценарийлеринде CDC, биринчи кезекте, негизги жана резервдик маалыматтар базасынын ортосунда маалыматтарды синхрондоштуруу менен реалдуу убакыт режиминде маалыматтарды негизгиден экинчи маалымат базасына шайкештештирүүгө мүмкүндүк берет.
source ----------> CDC ----------> sink
SeaTunnel CDC маалыматтарды синхрондоштуруунун эки түрүн сунуштайт:
Кулпусуз снапшот синхрондоштуруу фазасы баса белгиленет, анткени Debezium сыяктуу көптөгөн CDC платформалары тарыхый маалыматтарды синхрондоштуруу учурунда таблицаларды кулпулап коюшу мүмкүн. Көз ирмемдик окуу - бул маалымат базасынын тарыхый маалыматтарын синхрондоштуруу процесси. Бул процесстин негизги агымы төмөнкүдөй:
storage -------------> splitEnumerator ---------- split ----------> reader ^ | | | \----------------- report -----------/
Бөлүү бөлүү
splitEnumerator
(бөлүүчү дистрибьютор) таблицанын берилиштерин көрсөтүлгөн талаалардын (мисалы, таблица ID же уникалдуу ачкычтар) жана аныкталган кадам өлчөмүнүн негизинде бир нече бөлүктөргө бөлөт.
Параллель иштетүү
Ар бир бөлүү параллелдүү окуу үчүн башка окурманга дайындалат. Бир окурман бир байланышты ээлейт.
Окуя боюнча пикир
Бөлүү үчүн окуу операциясын аяктагандан кийин, ар бир окурман прогрессти 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
Окурман бөлүнгөн маалыматты алгандан кийин, ал тиешелүү SQL билдирүүлөрүн жаратат. Баштоодон мурун, ал маалымат базасынын журналына учурдагы бөлүнүүнүн тиешелүү ордун жазат. Учурдагы бөлүүнү аяктагандан кийин, окурман төмөнкү маалыматтар менен splitEnumerator
программасына прогрессти билдирет:
String splitId # Split ID Offset highWatermark # Log position corresponding to the split, for future validation
Кошумча синхрондоштуруу фазасы сүрөттү окуу баскычынан кийин башталат. Бул этапта, булак маалымат базасында болгон бардык өзгөртүүлөр реалдуу убакыт режиминде камдык базага синхрондолот. Бул этап маалымат базасынын журналын угат (мисалы, MySQL binlog). Бинлогдун кайталанма тартылышын болтурбоо жана маалымат базасынын жүгүн азайтуу үчүн кошумча көз салуу адатта бир жиптүү болот. Ошондуктан, бир гана байланышты ээлеген бир гана окурман колдонулат.
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
жок кылуу сыяктуу өзгөртүүлөр болуп жатканда бөлүү синхрондолуп жатат. Окуу процессинде тапшырманын идентификациясы колдонулбаса, жаңыртуулар жоголуп кетиши мүмкүн. SeaTunnel муну төмөнкүчө аткарат:
split{start, end}
.
Эгерде high = low
, бөлүү үчүн маалыматтар окуу учурунда өзгөргөн жок. Эгерде (high - low) > 0
, өзгөртүүлөр кайра иштетүү учурунда болду. Мындай учурда, SeaTunnel:
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
Кошумча фазаны баштоодон мурун, SeaTunnel алгач мурунку кадамдын бардык бөлүктөрүн текшерет. Бөлүүлөрдүн ортосунда маалыматтар жаңыртылышы мүмкүн, мисалы, split1 жана split2 ортосунда жаңы жазуулар киргизилсе, анда алар көз ирмемдик сүрөт баскычында өтүп кетиши мүмкүн. Бөлүүлөр ортосунда бул маалыматтарды калыбына келтирүү үчүн, SeaTunnel төмөнкү ыкманы колдонот:
completedSnapshotSplitInfos
текшериңиз. Болбосо, ал бөлүнүүлөрдүн ортосундагы маалымат болуп эсептелет жана оңдоо керек.
|------------filter split2-----------------| |----filter split1------| data log -|-----------------------|------------------|----------------------------------|- log offset min watermark split1 watermark split2 watermark max watermark
CDCди тындыруу жана кайра улантуу жөнүндө эмне айтууга болот? SeaTunnel бөлүштүрүлгөн сүрөт алгоритмин колдонот (Чанди-Лампорт):
Системада 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
p1
M
билдирүүсүн жөнөтөт.
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
SeaTunnel CDCде маркерлер бардык окурмандарга, бөлүнгөн санакчыларга, жазуучуларга жана башка түйүндөргө жөнөтүлөт, алардын ар бири өзүнүн эс тутум абалын сактайт.