paint-brush
CDC (Маалыматтарды басып алууну өзгөртүү) синхрондоштуруу принцибин бир макалада кантип түшүнсө болоттарабынан@Apache
Жаңы тарых

CDC (Маалыматтарды басып алууну өзгөртүү) синхрондоштуруу принцибин бир макалада кантип түшүнсө болот

тарабынан SeaTunnel10m2025/02/23
Read on Terminal Reader

өтө узун; Окуу

Change Data Capture (CDC) – бул маалымат базасынын операцияларындагы сап деңгээлиндеги өзгөрүүлөргө көз салуу (киргизүү, жаңыртуу, жок кылуу) жана окуялардын тартиби боюнча башка системаларга кабарлоо үчүн колдонулган ыкма.
featured image - CDC (Маалыматтарды басып алууну өзгөртүү) синхрондоштуруу принцибин бир макалада кантип түшүнсө болот
SeaTunnel HackerNoon profile picture

CDCге киришүү (Change Data Capture)

Change Data Capture (CDC) – бул маалымат базасынын операцияларындагы (киргизүүлөр, жаңыртуулар, жок кылуулар) сап деңгээлиндеги өзгөрүүлөргө көз салуу жана окуялардын тартиби боюнча башка системаларга кабарлоо үчүн колдонулган ыкма. Кырсыктарды калыбына келтирүү сценарийлеринде CDC, биринчи кезекте, негизги жана резервдик маалыматтар базасынын ортосунда маалыматтарды синхрондоштуруу менен реалдуу убакыт режиминде маалыматтарды негизгиден экинчи маалымат базасына шайкештештирүүгө мүмкүндүк берет.

 source ----------> CDC ----------> sink

Apache SeaTunnel CDC

SeaTunnel CDC маалыматтарды синхрондоштуруунун эки түрүн сунуштайт:

  • Snapshot Read : Таблицадан тарыхый маалыматтарды окуйт.
  • Incremental Tracking : Таблицадан кошумча журнал өзгөртүүлөрдү окуйт.

Lock-Free Snapshot синхрондоштуруу

Кулпусуз снапшот синхрондоштуруу фазасы баса белгиленет, анткени 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

Incremental Synchronization

Кошумча синхрондоштуруу фазасы сүрөттү окуу баскычынан кийин башталат. Бул этапта, булак маалымат базасында болгон бардык өзгөртүүлөр реалдуу убакыт режиминде камдык базага синхрондолот. Бул этап маалымат базасынын журналын угат (мисалы, 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де маркерлер бардык окурмандарга, бөлүнгөн санакчыларга, жазуучуларга жана башка түйүндөргө жөнөтүлөт, алардын ар бири өзүнүн эс тутум абалын сактайт.

L O A D I N G
. . . comments & more!

About Author

SeaTunnel HackerNoon profile picture
SeaTunnel@Apache
Next-generation high-performance, distributed, massive data integration tool.

ТАГИП АЛУУ

БУЛ МАКАЛА БЕРИЛГЕН...