IepazÄ«stinÄm ar Debezium ā CDC, kas paredzÄts Apache Kafka
SavÄ darbÄ bieži sastopos ar jauniem tehniskiem risinÄjumiem/programmatÅ«ras produktiem, par kuriem krievvalodÄ«gajÄ internetÄ ir visai maz informÄcijas. Ar Å”o rakstu es mÄÄ£inÄÅ”u aizpildÄ«t vienu Å”Ädu robu ar piemÄru no manas nesenÄs prakses, kad man vajadzÄja iestatÄ«t CDC notikumu sÅ«tÄ«Å”anu no divÄm populÄrÄm DBVS (PostgreSQL un MongoDB) uz Kafka klasteru, izmantojot Debezium. Ceru, ka Å”is pÄrskata raksts, kas parÄdÄ«jÄs paveiktÄ darba rezultÄtÄ, noderÄs citiem.
Kas ir Debezium un CDC kopumÄ?
Debezium - CDC programmatÅ«ras kategorijas pÄrstÄvis (Tvert datu izmaiÅas), vai precÄ«zÄk, tas ir savienotÄju komplekts dažÄdÄm DBVS, kas ir saderÄ«gi ar Apache Kafka Connect ietvaru.
TÄ atvÄrtÄ koda projekts, licencÄta saskaÅÄ ar Apache licenci v2.0 un sponsorÄta Red Hat. IzstrÄde notiek kopÅ” 2016. gada, un Å”obrÄ«d tÄ nodroÅ”ina oficiÄlu atbalstu Å”ÄdÄm DBVS: MySQL, PostgreSQL, MongoDB, SQL Server. Ir arÄ« savienotÄji Cassandra un Oracle, taÄu tie paÅ”laik ir "agrÄ«nas piekļuves" statusÄ, un jaunie izlaidumi negarantÄ atpakaļejoÅ”u saderÄ«bu.
Ja salÄ«dzinÄm CDC ar tradicionÄlo pieeju (kad lietojumprogramma tieÅ”i nolasa datus no DBVS), tad tÄs galvenÄs priekÅ”rocÄ«bas ietver datu izmaiÅu straumÄÅ”anas ievieÅ”anu rindu lÄ«menÄ« ar zemu latentumu, augstu uzticamÄ«bu un pieejamÄ«bu. PÄdÄjie divi punkti tiek sasniegti, izmantojot Kafka klasteru kÄ CDC notikumu krÄtuvi.
TÄpat starp priekÅ”rocÄ«bÄm var minÄt to, ka notikumu glabÄÅ”anai tiek izmantots viens modelis, lÄ«dz ar to gala lietojumprogrammai nav jÄuztraucas par dažÄdu DBVS darbÄ«bas niansÄm.
Visbeidzot, izmantojot ziÅojumu brokeri, tiek atvÄrtas mÄrogoÅ”anas lietojumprogrammas, kas izseko datu izmaiÅas. TajÄ paÅ”Ä laikÄ tiek samazinÄta ietekme uz datu avotu, jo dati tiek saÅemti nevis tieÅ”i no DBVS, bet gan no Kafka klastera.
Par Debezium arhitektūru
Izmantojot Debezium, tiek izmantota Å”Äda vienkÄrÅ”a shÄma:
KÄ ilustrÄciju es sniegÅ”u diagrammu no projekta vietnes:
TaÄu man Ŕī shÄma ne visai patÄ«k, jo Ŕķiet, ka ir iespÄjams tikai izlietnes savienotÄjs.
PatiesÄ«bÄ situÄcija ir atŔķirÄ«ga: aizpildiet savu Data Lake (pÄdÄjÄ saite diagrammÄ iepriekÅ”) nav vienÄ«gais Debezium lietoÅ”anas veids. Uz Apache Kafka nosÅ«tÄ«tos notikumus jÅ«su lietojumprogrammas var izmantot, lai risinÄtu dažÄdas situÄcijas. PiemÄram:
neatbilstoÅ”u datu noÅemÅ”ana no keÅ”atmiÅas;
paziÅojumu sÅ«tÄ«Å”ana;
meklÄt indeksa atjauninÄjumus;
sava veida audita žurnÄli;
...
Ja jums ir Java lietojumprogramma un nav vajadzÄ«bas/iespÄjas izmantot Kafka klasteru, ir arÄ« iespÄja strÄdÄt ar iegultais savienotÄjs. AcÄ«mredzamais plus ir tas, ka ar to jÅ«s varat atteikties no papildu infrastruktÅ«ras (savienotÄja un Kafka veidÄ). TomÄr Å”is risinÄjums ir novecojis kopÅ” versijas 1.1 un vairs nav ieteicams lietoÅ”anai (nÄkamajos laidienos tas var tikt noÅemts).
Å ajÄ rakstÄ tiks apspriesta izstrÄdÄtÄju ieteiktÄ arhitektÅ«ra, kas nodroÅ”ina kļūdu toleranci un mÄrogojamÄ«bu.
SavienotÄja konfigurÄcija
Lai sÄktu izsekot izmaiÅÄm vissvarÄ«gÄkajÄ vÄrtÄ«bÄ - datos - mums ir nepiecieÅ”ams:
datu avots, kas var bÅ«t MySQL, sÄkot no versijas 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (pilns saraksts);
Apache Kafka klasteris
Kafka Connect instance (versijas 1.x, 2.x);
konfigurÄts Debezium savienotÄjs.
StrÄdÄjiet pie pirmajiem diviem punktiem, t.i. DBVS un Apache Kafka instalÄÅ”anas process ir Ärpus raksta darbÄ«bas jomas. SavukÄrt tiem, kas vÄlas visu izvietot smilÅ”u kastÄ, oficiÄlajÄ repozitorijÄ ir jau gatava ar piemÄriem docker-compose.yaml.
SÄ«kÄk pievÄrsÄ«simies pÄdÄjiem diviem punktiem.
0. Kafka Connect
Å eit un vÄlÄk rakstÄ visi konfigurÄcijas piemÄri ir aplÅ«koti Debezium izstrÄdÄtÄju izplatÄ«tÄ Docker attÄla kontekstÄ. Tas satur visus nepiecieÅ”amos spraudÅu failus (savienotÄjus) un nodroÅ”ina Kafka Connect konfigurÄciju, izmantojot vides mainÄ«gos.
Ja plÄnojat izmantot Kafka Connect no Confluent, jums paÅ”am bÅ«s jÄpievieno nepiecieÅ”amo savienotÄju spraudÅi direktorijÄ, kas norÄdÄ«ts plugin.path vai iestatÄ«t, izmantojot vides mainÄ«go CLASSPATH. Kafka Connect darbinieka un savienotÄju iestatÄ«jumi tiek definÄti, izmantojot konfigurÄcijas failus, kas tiek nodoti kÄ argumenti darbinieka starta komandai. SÄ«kÄku informÄciju sk dokumentÄcija.
Viss Debeizum iestatÄ«Å”anas process savienotÄja versijÄ tiek veikts divos posmos. ApskatÄ«sim katru no tiem:
1. Kafka Connect ietvara iestatīŔana
Lai straumÄtu datus Apache Kafka klasterÄ«, Kafka Connect sistÄmÄ ir iestatÄ«ti konkrÄti parametri, piemÄram:
klastera savienojuma iestatījumi,
tÄmu nosaukumi, kuros tiks saglabÄta paÅ”a savienotÄja konfigurÄcija,
tÄs grupas nosaukums, kurÄ darbojas savienotÄjs (ja tiek izmantots sadalÄ«tais režīms).
Projekta oficiÄlais Docker attÄls atbalsta konfigurÄciju, izmantojot vides mainÄ«gos - to mÄs izmantosim. TÄtad, lejupielÄdÄsim attÄlu:
docker pull debezium/connect
MinimÄlais vides mainÄ«go kopums, kas nepiecieÅ”ams savienotÄja palaiÅ”anai, ir Å”Äds:
OFFSET_STORAGE_TOPIC=connector-offsets ā tÄma pozÄ«ciju saglabÄÅ”anai, kur paÅ”laik atrodas savienotÄjs;
CONNECT_STATUS_STORAGE_TOPIC=connector-status - tÄma savienotÄja statusa un tÄ uzdevumu saglabÄÅ”anai;
CONFIG_STORAGE_TOPIC=connector-config - tÄma savienotÄja konfigurÄcijas datu glabÄÅ”anai un tÄs uzdevumi;
GROUP_ID=1 ā tÄs darbinieku grupas identifikators, kurai var izpildÄ«t savienojuma uzdevumu; nepiecieÅ”ams, izmantojot izplatÄ«tu (izplatÄ«ts) režīms.
PÄc noklusÄjuma Debezium ieraksta datus JSON formÄtÄ, kas ir pieÅemams smilÅ”u kastÄm un nelielam datu apjomam, taÄu var bÅ«t problÄma ļoti noslogotÄs datu bÄzÄs. AlternatÄ«va JSON pÄrveidotÄjam ir serializÄt ziÅojumus, izmantojot Avro uz binÄro formÄtu, kas samazina Apache Kafka I/O apakÅ”sistÄmas slodzi.
Lai izmantotu Avro, ir jÄizvieto atseviŔķs shÄma-reÄ£istrs (shÄmu glabÄÅ”anai). PÄrveidotÄja mainÄ«gie izskatÄ«sies Å”Ädi:
SÄ«kÄka informÄcija par Avro lietoÅ”anu un reÄ£istra iestatÄ«Å”anu tam nav ietverta rakstÄ ā turpmÄk skaidrÄ«bas labad mÄs izmantosim JSON.
2. PaÅ”a savienotÄja iestatÄ«Å”ana
Tagad varat doties tieÅ”i uz paÅ”a savienotÄja konfigurÄciju, kas nolasÄ«s datus no avota.
ApskatÄ«sim divu DBVS savienotÄju piemÄru: PostgreSQL un MongoDB, ar kuriem man ir pieredze un attiecÄ«bÄ uz kuriem ir atŔķirÄ«bas (kaut arÄ« nelielas, bet dažos gadÄ«jumos bÅ«tiskas!).
KonfigurÄcija ir aprakstÄ«ta JSON apzÄ«mÄjumÄ un augÅ”upielÄdÄta Kafka Connect, izmantojot POST pieprasÄ«jumu.
SavienotÄja darbÄ«bas princips pÄc Ŕīs konfigurÄcijas ir diezgan vienkÄrÅ”s:
PirmajÄ palaiÅ”anas reizÄ tas savienojas ar konfigurÄcijÄ norÄdÄ«to datu bÄzi un sÄkas režīmÄ sÄkotnÄjais momentuzÅÄmums, nosÅ«tot Kafkai sÄkotnÄjo datu kopu, kas saÅemta ar nosacÄ«jumu SELECT * FROM table_name.
Kad inicializÄcija ir pabeigta, savienotÄjs pÄriet uz režīmu, kurÄ tiek nolasÄ«tas izmaiÅas no PostgreSQL WAL failiem.
Par izmantotajÄm opcijÄm:
name ā tÄ savienotÄja nosaukums, kuram izmanto turpmÄk aprakstÄ«to konfigurÄciju; nÄkotnÄ Å”is nosaukums tiks izmantots darbam ar savienotÄju (t.i., lai skatÄ«tu statusu / restartÄtu / atjauninÄtu konfigurÄciju), izmantojot Kafka Connect REST API;
connector.class ā DBVS savienotÄja klase, ko izmantos konfigurÄtais savienotÄjs;
plugin.name ir spraudÅa nosaukums datu loÄ£iskai dekodÄÅ”anai no WAL failiem. Pieejams no kuriem izvÄlÄties wal2json, decoderbuffs Šø pgoutput. Pirmajiem diviem ir jÄinstalÄ atbilstoÅ”i paplaÅ”inÄjumi DBVS un pgoutput PostgreSQL versijai 10 un jaunÄkai nav nepiecieÅ”amas papildu manipulÄcijas;
database.* ā iespÄjas pieslÄgties datu bÄzei, kur database.server.name - PostgreSQL instances nosaukums, ko izmanto, lai izveidotu tÄmas nosaukumu Kafka klasterÄ«;
table.include.list - tabulu saraksts, kurÄs vÄlamies izsekot izmaiÅÄm; norÄdÄ«ts formÄtÄ schema.table_name; nevar lietot kopÄ ar table.exclude.list;
heartbeat.interval.ms ā intervÄls (milisekundÄs), ar kÄdu savienotÄjs nosÅ«ta sirdsdarbÄ«bas ziÅojumus uz Ä«paÅ”u tÄmu;
heartbeat.action.query - pieprasÄ«jums, kas tiks izpildÄ«ts, nosÅ«tot katru sirdsdarbÄ«bas ziÅojumu (opcija parÄdÄ«jÄs kopÅ” versijas 1.1);
slot.name ā tÄ replikÄcijas slota nosaukums, kuru izmantos savienotÄjs;
publication.name - VÄrds PublicÄÅ”ana programmÄ PostgreSQL, ko savienotÄjs izmanto. Ja tas neeksistÄ, Debezium mÄÄ£inÄs to izveidot. Ja lietotÄjam, ar kuru tiek izveidots savienojums, nav pietiekamu tiesÄ«bu Å”ai darbÄ«bai, savienotÄjs tiks aizvÄrts ar kļūdu;
transforms.AddPrefix.type norÄda, ka izmantosim regulÄrÄs izteiksmes;
transforms.AddPrefix.regex ā maska, ar kuru tiek no jauna definÄts mÄrÄ·a tÄmas nosaukums;
transforms.AddPrefix.replacement - tieÅ”i tas, ko mÄs pÄrdefinÄjam.
VairÄk par sirdspukstiem un transformÄcijÄm
PÄc noklusÄjuma savienotÄjs nosÅ«ta datus Kafka par katru veikto darÄ«jumu un ieraksta savu LSN (žurnÄla kÄrtas numuru) pakalpojuma tÄmai. offset. Bet kas notiek, ja savienotÄjs ir konfigurÄts tÄ, lai lasÄ«tu nevis visu datu bÄzi, bet tikai daļu no tÄs tabulÄm (kurÄs dati tiek atjauninÄti reti)?
SavienotÄjs nolasÄ«s WAL failus un nenoteiks tajos transakciju saistÄ«bas tabulÄs, kuras tas pÄrrauga.
TÄpÄc tas neatjauninÄs savu paÅ”reizÄjo pozÄ«ciju ne tÄmÄ, ne replikÄcijas slotÄ.
Tas savukÄrt izraisÄ«s WAL failu "iestrÄgÅ”anu" diskÄ un, iespÄjams, tiem pietrÅ«ks vietas diskÄ.
Un Å”eit palÄ«gÄ nÄk iespÄjas. heartbeat.interval.ms Šø heartbeat.action.query. Izmantojot Ŕīs opcijas pa pÄriem, katru reizi, kad tiek nosÅ«tÄ«ts sirdsdarbÄ«bas ziÅojums, ir iespÄjams izpildÄ«t pieprasÄ«jumu mainÄ«t datus atseviÅ”Ä·Ä tabulÄ. TÄdÄjÄdi LSN, kurÄ paÅ”laik atrodas savienotÄjs (replikÄcijas slotÄ), tiek pastÄvÄ«gi atjauninÄts. Tas ļauj DBVS noÅemt WAL failus, kas vairs nav vajadzÄ«gi. PapildinformÄciju par opciju darbÄ«bu skatiet sadaÄ¼Ä dokumentÄcija.
VÄl viena iespÄja, kurai jÄpievÄrÅ” lielÄka uzmanÄ«ba, ir transforms. Lai gan tas vairÄk attiecas uz ÄrtÄ«bÄm un skaistumu ...
PÄc noklusÄjuma Debezium veido tÄmas, izmantojot Å”Ädu nosaukÅ”anas politiku: serverName.schemaName.tableName. Tas ne vienmÄr var bÅ«t Ärti. IespÄjas transforms izmantojot regulÄrÄs izteiksmes, varat definÄt to tabulu sarakstu, kuru notikumi jÄnovirza uz tÄmu ar noteiktu nosaukumu.
MÅ«su konfigurÄcijÄ, pateicoties transforms notiek Å”Ädi: visi CDC notikumi no izsekotÄs datu bÄzes tiks novirzÄ«ti uz tÄmu ar nosaukumu data.cdc.dbname. PretÄjÄ gadÄ«jumÄ (bez Å”iem iestatÄ«jumiem) Debezium pÄc noklusÄjuma izveido tÄmu katrai veidlapas tabulai: pg-dev.public.<table_name>.
SavienotÄju ierobežojumi
PostgreSQL savienotÄja konfigurÄcijas apraksta beigÄs ir vÄrts runÄt par Å”ÄdÄm tÄ darba funkcijÄm / ierobežojumiem:
PostgreSQL savienotÄja funkcionalitÄte balstÄs uz loÄ£iskÄs dekodÄÅ”anas koncepciju. TÄpÄc viÅÅ” neizseko pieprasÄ«jumus mainÄ«t datu bÄzes struktÅ«ru (DDL) - attiecÄ«gi Å”ie dati tÄmÄs nebÅ«s.
TÄ kÄ tiek izmantoti replikÄcijas sloti, savienotÄja pieslÄgÅ”ana ir iespÄjama tikai uz galveno DBVS gadÄ«jumu.
Ja lietotÄjam, ar kuru savienotÄjs izveido savienojumu ar datu bÄzi, ir tikai lasÄ«Å”anas tiesÄ«bas, tad pirms pirmÄs palaiÅ”anas jums bÅ«s manuÄli jÄizveido replikÄcijas slots un jÄpublicÄ datu bÄzÄ.
Lieliski: tas ir iestatÄ«ts un gatavs darbam. Tagad izliksimies par patÄrÄtÄjiem un izveidosim savienojumu ar Kafka, pÄc tam pievienojam un mainÄm ierakstu tabulÄ:
Abos gadÄ«jumos ieraksti sastÄv no mainÄ«tÄ ieraksta atslÄgas (PK) un paÅ”as izmaiÅu bÅ«tÄ«bas: kÄds ieraksts bija pirms un kÄds kļuva pÄc tam.
GadÄ«jumÄ, ja INSERT: vÄrtÄ«ba pirms (before) vienÄds nullkam seko ievietotÄ virkne.
GadÄ«jumÄ, ja UPDATE: plkst payload.before tiek parÄdÄ«ts rindas iepriekÅ”Äjais stÄvoklis, un payload.after - jauns ar izmaiÅu bÅ«tÄ«bu.
2.2 MongoDB
Å is savienotÄjs izmanto standarta MongoDB replikÄcijas mehÄnismu, nolasot informÄciju no DBVS primÄrÄ mezgla oplog.
LÄ«dzÄ«gi kÄ jau aprakstÄ«tajÄ PgSQL savienotÄjÄ, arÄ« Å”eit pirmajÄ startÄ tiek uzÅemts primÄro datu momentuzÅÄmums, pÄc kura savienotÄjs pÄrslÄdzas uz oplog lasÄ«Å”anas režīmu.
KÄ redzat, salÄ«dzinÄjumÄ ar iepriekÅ”Äjo piemÄru nav jaunu opciju, bet ir samazinÄts tikai opciju skaits, kas ir atbildÄ«gas par savienojumu ar datu bÄzi, un to prefiksi.
iestatÄ«jumi transforms Å”oreiz viÅi rÄ«kojas Å”Ädi: pagriež no shÄmas mÄrÄ·a tÄmas nosaukumu <server_name>.<db_name>.<collection_name> Š² data.cdc.mongo_<db_name>.
kļūdu tolerance
ProblÄma par kļūdu toleranci un augstu pieejamÄ«bu mÅ«sdienÄs ir aktuÄlÄka nekÄ jebkad agrÄk ā it Ä«paÅ”i, ja mÄs runÄjam par datiem un darÄ«jumiem, un datu izmaiÅu izsekoÅ”ana Å”ajÄ jautÄjumÄ nav malÄ. ApskatÄ«sim, kas principÄ var noiet greizi un kas notiks ar Debezium katrÄ gadÄ«jumÄ.
Ir trÄ«s atteikÅ”anÄs iespÄjas:
Kafka Connect kļūme. Ja savienojums ir konfigurÄts darbam sadalÄ«tÄ režīmÄ, vairÄkiem darbiniekiem ir jÄiestata viens un tas pats group.id. PÄc tam, ja viens no tiem neizdodas, savienotÄjs tiks restartÄts otram darbiniekam un turpinÄs lasÄ«t no pÄdÄjÄs noteiktÄs pozÄ«cijas tÄmÄ Kafka.
Savienojuma zudums ar Kafka kopu. SavienotÄjs vienkÄrÅ”i pÄrtrauks nolasÄ«Å”anu vietÄ, kuru tas neizdevÄs nosÅ«tÄ«t Kafkai, un periodiski mÄÄ£inÄs to nosÅ«tÄ«t atkÄrtoti, lÄ«dz mÄÄ£inÄjums bÅ«s veiksmÄ«gs.
Datu avots nav pieejams. SavienotÄjs mÄÄ£inÄs atkÄrtoti izveidot savienojumu ar avotu atbilstoÅ”i konfigurÄcijai. NoklusÄjums ir 16 mÄÄ£inÄjumi izmantot eksponenciÄla atkÄpÅ”anÄs. PÄc 16. neveiksmÄ«gÄ mÄÄ£inÄjuma uzdevums tiks atzÄ«mÄts kÄ neizdevÄs un tas bÅ«s manuÄli jÄrestartÄ, izmantojot Kafka Connect REST interfeisu.
GadÄ«jumÄ, ja PostgreSQL dati netiks zaudÄti, jo izmantojot replikÄcijas slotus, tiks novÄrsta to WAL failu dzÄÅ”ana, kurus savienotÄjs nav nolasÄ«jis. Å ajÄ gadÄ«jumÄ ir mÄ«nuss: ja tÄ«kla savienojamÄ«ba starp savienotÄju un DBVS tiek traucÄta ilgu laiku, pastÄv iespÄja, ka diska vieta beigsies, un tas var izraisÄ«t visas DBVS kļūmi.
GadÄ«jumÄ, ja MySQL binlog failus var pagriezt pati DBVS, pirms tiek atjaunots savienojums. TÄdÄjÄdi savienotÄjs pÄries neveiksmÄ«gÄ stÄvoklÄ«, un tas bÅ«s jÄrestartÄ sÄkotnÄjÄ momentuzÅÄmuma režīmÄ, lai turpinÄtu lasÄ«t no binlogs un atjaunotu normÄlu darbÄ«bu.
uz MongoDB. DokumentÄcijÄ teikts, ka savienotÄja darbÄ«ba gadÄ«jumÄ, ja žurnÄla/oplog faili ir izdzÄsti un savienotÄjs nevar turpinÄt lasÄ«Å”anu no vietas, kur tas tika pÄrtraukts, ir vienÄda visÄm DBVS. Tas slÄpjas faktÄ, ka savienotÄjs nonÄks stÄvoklÄ« neizdevÄs un bÅ«s nepiecieÅ”ama restartÄÅ”ana režīmÄ sÄkotnÄjais momentuzÅÄmums.
TomÄr ir izÅÄmumi. Ja savienotÄjs ilgu laiku bija atvienotÄ stÄvoklÄ« (vai nevarÄja sasniegt MongoDB gadÄ«jumu) un oplog Å”ajÄ laikÄ tika pagriezts, tad, kad savienojums tiks atjaunots, savienotÄjs mierÄ«gi turpinÄs lasÄ«t datus no pirmÄs pieejamÄs pozÄ«cijas. , tÄpÄc daži Kafkas dati nÄ sitÄ«s.
SecinÄjums
Debezium ir mana pirmÄ pieredze ar CDC sistÄmÄm, un kopumÄ tÄ ir bijusi ļoti pozitÄ«va. Projekts uzpirka galvenÄs DBVS atbalstu, vieglu konfigurÄciju, atbalstu klasterÄÅ”anai un aktÄ«vu kopienu. Tiem, kurus interesÄ prakse, iesaku izlasÄ«t ceļvežus Kafka Connect Šø Debezium.
SalÄ«dzinot ar Kafka Connect JDBC savienotÄju, Debezium galvenÄ priekÅ”rocÄ«ba ir tÄ, ka izmaiÅas tiek nolasÄ«tas no DBVS žurnÄliem, kas ļauj saÅemt datus ar minimÄlu aizkavi. JDBC savienotÄjs (nodroÅ”ina Kafka Connect) vaicÄ izsekoto tabulu ar noteiktu intervÄlu un (tÄ paÅ”a iemesla dÄļ) neÄ£enerÄ ziÅojumus, kad dati tiek dzÄsti (kÄ jÅ«s varat pieprasÄ«t datus, kas tur nav?).