Ag tabhairt isteach Debezium - CDC do Apache Kafka

Ag tabhairt isteach Debezium - CDC do Apache Kafka

I mo chuid oibre, is minic a thagann mé ar réitigh theicniúla/táirgí bogearraí nua, a bhfuil eolas fúthu sách gann ar an Idirlíon Rúisise. Leis an Airteagal seo déanfaidh mé iarracht bearna amháin den sórt sin a líonadh le sampla ó mo chleachtas le déanaí, nuair is gá dom a chumrú chun imeachtaí CDC a sheoladh ó dhá DBMS a bhfuil tóir orthu (PostgreSQL agus MongoDB) chuig braisle Kafka ag baint úsáide as Debezium. Tá súil agam go mbeidh an t-alt athbhreithnithe seo, atá le feiceáil mar thoradh ar an obair a rinneadh, úsáideach do dhaoine eile.

Cad é Debezium agus CDC i gcoitinne?

Déibéisiam — ionadaí don chatagóir bogearraí CDC (Gabháil Athrú Sonraí), nó níos cruinne, is sraith nascóirí é do DBMSanna éagsúla atá comhoiriúnach le creat Apache Kafka Connect.

Tá sé Tionscadal Foinse Oscailte, ceadúnaithe faoi Cheadúnas Apache v2.0 agus urraithe ag Red Hat. Tá forbairt ar siúl ó 2016 agus faoi láthair soláthraíonn sé tacaíocht oifigiúil do na DBMSanna seo a leanas: MySQL, PostgreSQL, MongoDB, SQL Server. Tá nascóirí ann freisin do Cassandra agus Oracle, ach faoi láthair tá stádas “rochtana luath” acu, agus ní ráthaíonn eisiúintí nua comhoiriúnacht siar.

Má dhéanaimid CDC a chur i gcomparáid leis an gcur chuige traidisiúnta (nuair a léann an feidhmchlár sonraí ón DBMS go díreach), áirítear ar na príomhbhuntáistí a bhaineann leis sruthlú athraithe sonraí a chur i bhfeidhm ag leibhéal an rónna le latency íseal, iontaofacht ard agus infhaighteacht. Baintear an dá phointe dheireanacha amach trí bhraisle Kafka a úsáid mar stór d’imeachtaí CDC.

Buntáiste eile is ea an bhfíric go n-úsáidtear múnla amháin chun imeachtaí a stóráil, mar sin ní gá don fheidhmchlár deiridh a bheith buartha faoi na nuances a bhaineann le DBMSanna éagsúla a oibriú.

Ar deireadh, trí bhróicéir teachtaireachtaí a úsáid is féidir le hiarratais a dhéanann monatóireacht ar athruithe ar shonraí scála amach go cothrománach. Ag an am céanna, íoslaghdaítear an tionchar ar an bhfoinse sonraí, ós rud é go bhfaightear na sonraí ní go díreach ón DBMS, ach ó bhraisle Kafka.

Maidir leis an ailtireacht Debezium

Baineann úsáid a bhaint as Debezium síos chuig an scéim shimplí seo:

DBMS (mar fhoinse sonraí) → cónascaire i Kafka Connect → Apache Kafka → tomhaltóir

Mar léiriú, seo léaráid ó shuíomh Gréasáin an tionscadail:

Ag tabhairt isteach Debezium - CDC do Apache Kafka

Mar sin féin, ní maith liom an scéim seo go mór, mar is cosúil nach féidir ach cónascaire doirteal a úsáid.

I ndáiríre, tá an scéal difriúil: do Loch Sonraí a líonadh (nasc deireanach sa léaráid thuas) Ní hé seo an t-aon bhealach chun Debezium a úsáid. Is féidir le d’fheidhmchláir imeachtaí a sheoltar chuig Apache Kafka a úsáid chun cásanna éagsúla a láimhseáil. Mar shampla:

  • sonraí nach mbaineann le hábhar a bhaint as an taisce;
  • fógraí a sheoladh;
  • nuashonruithe innéacs cuardaigh;
  • logaí iniúchta de chineál éigin;
  • ...

Sa chás go bhfuil feidhmchlár Java agat agus nach bhfuil aon ghá/deis ann cnuasach Kafka a úsáid, d’fhéadfaí oibriú trí leabaithe-nascaire. Is é an buntáiste soiléir go gcuireann sé deireadh leis an ngá atá le bonneagar breise (i bhfoirm cónascaire agus Kafka). Mar sin féin, tá an réiteach seo imithe i léig ó leagan 1.1 agus ní mholtar é a úsáid a thuilleadh (is féidir tacaíocht dó a bhaint in eisiúintí amach anseo).

Pléifidh an t-alt seo an ailtireacht atá molta ag forbróirí, a sholáthraíonn caoinfhulaingt locht agus scalability.

Cumraíocht nascóirí

Chun tús a chur le rianú athruithe sna sonraí luacha is tábhachtaí - ní mór dúinn:

  1. foinse sonraí, is féidir a bheith MySQL ag tosú ó leagan 5.7, PostgreSQL 9.6+, MongoDB 3.2+ (liosta iomlán);
  2. braisle Apache Kafka;
  3. Sampla Kafka Connect (leaganacha 1.x, 2.x);
  4. cónascaire Debezium cumraithe.

Oibrigh ar an gcéad dá phointe, i.e. Tá próiseas suiteála an DBMS agus Apache Kafka thar raon feidhme an ailt. Mar sin féin, dóibh siúd ar mian leo gach rud a imscaradh sa bhosca gainimh, tá leagan réidh ag an stór oifigiúil le samplaí. docker-compose.yaml.

Déanfaimid plé níos mine ar an dá phointe dheireanacha.

0. Kafka Ceangail

Anseo agus níos faide san alt, pléitear na samplaí cumraíochta go léir i gcomhthéacs íomhá Docker arna dháileadh ag forbróirí Debezium. Tá na comhaid breiseán riachtanacha go léir (nascairí) ann agus soláthraíonn sé cumraíocht Kafka Connect ag baint úsáide as athróga timpeallachta.

Má tá sé ar intinn agat Kafka Connect ó Confluent a úsáid, beidh ort forlíontáin na gcónascairí riachtanacha a chur go neamhspleách leis an eolaire atá sonraithe i plugin.path nó a shocrú trí athróg timpeallachta CLASSPATH. Cinntear socruithe don oibrí agus do chónaisc Kafka Connect trí chomhaid chumraíochta a chuirtear ar aghaidh mar argóintí chuig ordú seolta an oibrí. Le haghaidh tuilleadh sonraí, féach doiciméadú.

Déantar an próiseas iomlán chun Debeizum a bhunú sa leagan cónascaire i dhá chéim. Breathnaímid ar gach ceann acu:

1. Creat Kafka Connect a chur ar bun

Chun sonraí a shruthú chuig braisle Apache Kafka, socraítear paraiméadair ar leith i gcreat Kafka Connect, mar shampla:

  • paraiméadair chun nascadh leis an mbraisle,
  • ainmneacha na n-ábhar ina stórálfar cumraíocht an chónascaire féin go díreach,
  • ainm an ghrúpa ina bhfuil an cónascaire ag rith (má úsáidtear modh dáilte).

Tacaíonn íomhá oifigiúil Docker an tionscadail leis an gcumraíocht ag baint úsáide as athróga timpeallachta - is é seo a úsáidfimid. Mar sin, íoslódáil an íomhá:

docker pull debezium/connect

Seo a leanas an tacar íosta athróg timpeallachta a theastaíonn chun an cónascaire a rith:

  • BOOTSTRAP_SERVERS=kafka-1:9092,kafka-2:9092,kafka-3:9092 — liosta tosaigh de fhreastalaithe braisle Kafka chun liosta iomlán de bhaill an bhraisle a fháil;
  • OFFSET_STORAGE_TOPIC=connector-offsets — topaic maidir le suíomhanna a stóráil ina bhfuil an cónascaire suite faoi láthair;
  • CONNECT_STATUS_STORAGE_TOPIC=connector-status — ábhar chun stádas an chónascaire agus na cúraimí a bhaineann leis a stóráil;
  • CONFIG_STORAGE_TOPIC=connector-config — an topaic maidir le sonraí cumraíochta cónascaire a stóráil agus a chúraimí;
  • GROUP_ID=1 — aitheantóir an ghrúpa oibrithe ar a bhféadfar tasc an chónascaire a chur i gcrích; riachtanach nuair a úsáidtear a dháileadh (dáilte) réimeas.

Seolaimid an coimeádán leis na hathróga seo:

docker run 
  -e BOOTSTRAP_SERVERS='kafka-1:9092,kafka-2:9092,kafka-3:9092' 
  -e GROUP_ID=1 
  -e CONFIG_STORAGE_TOPIC=my_connect_configs 
  -e OFFSET_STORAGE_TOPIC=my_connect_offsets 
  -e STATUS_STORAGE_TOPIC=my_connect_statuses  debezium/connect:1.2

Nóta faoi Avro

De réir réamhshocraithe, scríobhann Debezium sonraí i bhformáid JSON, atá inghlactha le haghaidh boscaí gainimh agus méideanna beaga sonraí, ach is féidir a bheith ina fhadhb i mbunachair shonraí an-ualach. Rogha eile seachas tiontaire JSON ná teachtaireachtaí a shraithiú ag baint úsáide as Avro isteach i bhformáid dhénártha, a laghdaíonn an t-ualach ar an bhfochóras I/O in Apache Kafka.

Chun Avro a úsáid ní mór duit ceann ar leith a imscaradh scéimre-chlár (le haghaidh léaráidí a stóráil). Beidh cuma mar seo ar na hathróga don tiontaire:

name: CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: CONNECT_KEY_CONVERTER_SCHEMA_REGISTRY_URL
value: http://kafka-registry-01:8081/
name: VALUE_CONVERTER   
value: io.confluent.connect.avro.AvroConverter

Tá sonraí maidir le húsáid Avro agus an clárlann a bhunú dó thar raon feidhme an ailt seo - níos faide ar aghaidh, ar mhaithe le soiléireacht, úsáidfimid JSON.

2. Cumrú an cónascaire féin

Anois is féidir leat dul go díreach chuig cumraíocht an chónascaire féin, a léifidh sonraí ón bhfoinse.

Breathnaímid ar an sampla de chónaisc ar feadh dhá DBMS: PostgreSQL agus MongoDB, ina bhfuil taithí agam agus ina bhfuil difríochtaí (cé go bhfuil siad beag, ach i gcásanna áirithe suntasach!).

Déantar cur síos ar an gcumraíocht i nodaireacht JSON agus uaslódáiltear í chuig Kafka Connect le hiarratas POST.

2.1. PostgreSQL

Sampla de chumraíocht nascóirí do PostgreSQL:

{
  "name": "pg-connector",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "plugin.name": "pgoutput",
    "database.hostname": "127.0.0.1",
    "database.port": "5432",
    "database.user": "debezium",
    "database.password": "definitelynotpassword",
    "database.dbname" : "dbname",
    "database.server.name": "pg-dev",
    "table.include.list": "public.(.*)",
    "heartbeat.interval.ms": "5000",
    "slot.name": "dbname_debezium",
    "publication.name": "dbname_publication",
    "transforms": "AddPrefix",
    "transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
    "transforms.AddPrefix.regex": "pg-dev.public.(.*)",
    "transforms.AddPrefix.replacement": "data.cdc.dbname"
  }
}

Tá prionsabal oibriú an chónascaire tar éis an tsocraithe seo simplí go leor:

  • Nuair a seoladh é den chéad uair, nascann sé leis an mbunachar sonraí a shonraítear sa chumraíocht agus tosaíonn sé i mód pictiúr tosaigh, an tsraith tosaigh sonraí a fuarthas ag baint úsáide as an gcoinníoll a sheoladh chuig Kafka SELECT * FROM table_name.
  • Tar éis an tosaithe a bheith críochnaithe, téann an cónascaire isteach sa mhód chun athruithe ó chomhaid PostgreSQL WAL a léamh.

Maidir leis na roghanna a úsáideadh:

  • name — ainm an chónascaire a n-úsáidtear an chumraíocht a thuairiscítear thíos; sa todhchaí, úsáidtear an t-ainm seo chun oibriú leis an gcónascaire (ie, féach ar an stádas / atosú / nuashonraigh an chumraíocht) tríd an Kafka Connect REST API;
  • connector.class — Aicme cónascaire DBMS a úsáidfidh an cónascaire cumraithe;
  • plugin.name — ainm an bhreiseáin chun sonraí ó chomhaid WAL a dhíchódú go loighciúil. Ar fáil le roghnú as wal2json, decoderbuffs и pgoutput. Éilíonn an chéad dá shuiteáil na síntí cuí sa DBMS, agus pgoutput le haghaidh PostgreSQL leagan 10 agus níos airde ní gá ionramhálacha breise;
  • database.* — roghanna chun nascadh leis an mbunachar sonraí, i gcás ina database.server.name — Ainm shampla PostgreSQL a úsáidtear chun ainm an ábhair a fhoirmiú i mbraisle Kafka;
  • table.include.list — liosta táblaí inar mian linn athruithe a rianú; sonraithe san fhormáid schema.table_name; ní féidir é a úsáid in éineacht le table.exclude.list;
  • heartbeat.interval.ms — eatramh (i milleasoicindí) lena seolann an cónascaire teachtaireachtaí buille croí chuig ábhar speisialta;
  • heartbeat.action.query — iarraidh a fhorghníomhófar nuair a sheolfar gach teachtaireacht croíbhriste (tá an rogha le feiceáil i leagan 1.1);
  • slot.name — ainm na sliotán macasamhlaithe a úsáidfidh an cónascaire;
  • publication.name - Ainm Foilseachán i PostgreSQL, a úsáideann an cónascaire. Mura bhfuil sé ann, déanfaidh Debezium iarracht é a chruthú. Mura bhfuil go leor cearta ag an úsáideoir faoina ndéantar an nasc don ghníomh seo, críochnóidh an cónascaire le hearráid;
  • transforms a chinneann go beacht conas ainm an sprice a athrú:
    • transforms.AddPrefix.type a thugann le fios go n-úsáidfimid nathanna rialta;
    • transforms.AddPrefix.regex — masc a ath-sainmhíníonn ainm na sprice;
    • transforms.AddPrefix.replacement - go díreach cad atá á ath-shainmhíniú againn.

Tuilleadh faoi bhuille croí agus athraíonn

De réir réamhshocraithe, seolann an cónascaire sonraí chuig Kafka le haghaidh gach idirbhirt tiomanta, agus déantar a LSN (Uimhir Seicheamh Logála) a thaifeadadh sa topaic seirbhíse offset. Ach cad a tharlaíonn má tá an cónascaire cumraithe chun nach léamh an bunachar sonraí iomlán, ach amháin cuid dá táblaí (nach bhfuil nuashonruithe sonraí a tharlaíonn go minic)?

  • Léifidh an cónascaire comhaid WAL agus ní bhraithfidh sé aon idirbheart tiomanta do na táblaí a bhfuil sé ag déanamh monatóireachta orthu.
  • Dá bhrí sin, ní dhéanfaidh sé a staid reatha a nuashonrú san ábhar ná sa sliotán macasamhlaithe.
  • Mar thoradh air seo, coinneofar comhaid WAL ar diosca agus is dócha go n-imeodh as spás diosca.

Agus seo nuair a thagann roghanna chun an tarrthála. heartbeat.interval.ms и heartbeat.action.query. Trí na roghanna seo a úsáid i mbeirteanna is féidir iarratas a dhéanamh chun sonraí a athrú i dtábla ar leith gach uair a sheoltar teachtaireacht chroí. Mar sin, déantar an LSN ar a bhfuil an cónascaire suite faoi láthair (sa sliotán macasamhlaithe) a nuashonrú i gcónaí. Ligeann sé seo don DBMS comhaid WAL nach bhfuil ag teastáil a thuilleadh a bhaint. Is féidir leat níos mó a fhoghlaim faoi conas a oibríonn na roghanna i doiciméadú.

Rogha eile ar fiú aird níos dlúithe a bheith air transforms. Cé go mbaineann sé níos mó le háisiúlacht agus áilleacht ...

De réir réamhshocraithe, cruthaíonn Debezium topaicí ag baint úsáide as an mbeartas ainmniúcháin seo a leanas: serverName.schemaName.tableName. Seans nach mbeidh sé seo áisiúil i gcónaí. Roghanna transforms Is féidir leat nathanna rialta a úsáid chun liosta táblaí a shainiú, ónar gá imeachtaí a threorú chuig topaic a bhfuil ainm ar leith air.

In ár gcumraíocht buíochas transforms tarlaíonn an méid seo a leanas: rachaidh gach imeacht CDC ón mbunachar sonraí monatóireachta chuig topaic leis an ainm data.cdc.dbname. Seachas sin (gan na socruithe seo), chruthódh Debezium de réir réamhshocraithe topaic do gach tábla mar: pg-dev.public.<table_name>.

Teorainneacha nascóirí

Chun an cur síos ar chumraíocht an chónascaire do PostgreSQL a thabhairt chun críche, is fiú labhairt faoi na gnéithe / srianta seo a leanas dá oibríocht:

  1. Braitheann feidhmiúlacht an chónascaire do PostgreSQL ar choincheap an díchódaithe loighciúil. Dá bhrí sin sé ní rianaíonn sé iarratais chun struchtúr an bhunachair shonraí a athrú (DDL) - dá réir sin, ní bheidh na sonraí seo sna hábhair.
  2. Ós rud é go n-úsáidtear sliotáin macasamhlaithe, is féidir cónascaire a nascadh ach chuig an bpríomhshampla DBMS.
  3. Má thugtar cearta inléite amháin don úsáideoir faoina nascann an cónascaire leis an mbunachar sonraí, ansin roimh an gcéad seoladh beidh ort sliotán macasamhlaithe a chruthú de láimh agus é a fhoilsiú don bhunachar sonraí.

An chumraíocht a chur i bhfeidhm

Mar sin, déanaimis ár gcumraíocht a luchtú isteach sa chónascaire:

curl -i -X POST -H "Accept:application/json" 
  -H  "Content-Type:application/json"  http://localhost:8083/connectors/ 
  -d @pg-con.json

Seiceálaimid gur éirigh leis an íoslódáil agus gur thosaigh an nascóir:

$ curl -i http://localhost:8083/connectors/pg-connector/status 
HTTP/1.1 200 OK
Date: Thu, 17 Sep 2020 20:19:40 GMT
Content-Type: application/json
Content-Length: 175
Server: Jetty(9.4.20.v20190813)

{"name":"pg-connector","connector":{"state":"RUNNING","worker_id":"172.24.0.5:8083"},"tasks":[{"id":0,"state":"RUNNING","worker_id":"172.24.0.5:8083"}],"type":"source"}

Go hiontach: tá sé socraithe agus réidh le dul. Anois déanaimis ligean orainn gur tomhaltóir muid agus ceangail le Kafka, agus ina dhiaidh sin cuirfimid iontráil sa tábla leis agus athróimid é:

$ kafka/bin/kafka-console-consumer.sh 
  --bootstrap-server kafka:9092 
  --from-beginning 
  --property print.key=true 
  --topic data.cdc.dbname

postgres=# insert into customers (id, first_name, last_name, email) values (1005, 'foo', 'bar', '[email protected]');
INSERT 0 1
postgres=# update customers set first_name = 'egg' where id = 1005;
UPDATE 1

In ár n-ábhar taispeánfar é mar seo a leanas:

JSON an-fhada lenár n-athruithe

{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":null,
"after":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600374991648,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":602,
"lsn":34088472,
"xmin":null
},
"op":"c",
"ts_ms":1600374991762,
"transaction":null
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
}
],
"optional":false,
"name":"data.cdc.dbname.Key"
},
"payload":{
"id":1005
}
}{
"schema":{
"type":"struct",
"fields":[
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"before"
},
{
"type":"struct",
"fields":[
{
"type":"int32",
"optional":false,
"field":"id"
},
{
"type":"string",
"optional":false,
"field":"first_name"
},
{
"type":"string",
"optional":false,
"field":"last_name"
},
{
"type":"string",
"optional":false,
"field":"email"
}
],
"optional":true,
"name":"data.cdc.dbname.Value",
"field":"after"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"version"
},
{
"type":"string",
"optional":false,
"field":"connector"
},
{
"type":"string",
"optional":false,
"field":"name"
},
{
"type":"int64",
"optional":false,
"field":"ts_ms"
},
{
"type":"string",
"optional":true,
"name":"io.debezium.data.Enum",
"version":1,
"parameters":{
"allowed":"true,last,false"
},
"default":"false",
"field":"snapshot"
},
{
"type":"string",
"optional":false,
"field":"db"
},
{
"type":"string",
"optional":false,
"field":"schema"
},
{
"type":"string",
"optional":false,
"field":"table"
},
{
"type":"int64",
"optional":true,
"field":"txId"
},
{
"type":"int64",
"optional":true,
"field":"lsn"
},
{
"type":"int64",
"optional":true,
"field":"xmin"
}
],
"optional":false,
"name":"io.debezium.connector.postgresql.Source",
"field":"source"
},
{
"type":"string",
"optional":false,
"field":"op"
},
{
"type":"int64",
"optional":true,
"field":"ts_ms"
},
{
"type":"struct",
"fields":[
{
"type":"string",
"optional":false,
"field":"id"
},
{
"type":"int64",
"optional":false,
"field":"total_order"
},
{
"type":"int64",
"optional":false,
"field":"data_collection_order"
}
],
"optional":true,
"field":"transaction"
}
],
"optional":false,
"name":"data.cdc.dbname.Envelope"
},
"payload":{
"before":{
"id":1005,
"first_name":"foo",
"last_name":"bar",
"email":"[email protected]"
},
"after":{
"id":1005,
"first_name":"egg",
"last_name":"bar",
"email":"[email protected]"
},
"source":{
"version":"1.2.3.Final",
"connector":"postgresql",
"name":"dbserver1",
"ts_ms":1600375609365,
"snapshot":"false",
"db":"postgres",
"schema":"public",
"table":"customers",
"txId":603,
"lsn":34089688,
"xmin":null
},
"op":"u",
"ts_ms":1600375609778,
"transaction":null
}
}

Sa dá chás, is éard atá i dtaifid ná eochair (PK) an taifid a athraíodh, agus bunbhrí na n-athruithe: cad a bhí sa taifead roimhe seo agus cad a tharla ina dhiaidh.

  • I gcás INSERT: luach roimh (before) comhionann null, agus tar éis - an líne a cuireadh isteach.
  • I gcás UPDATE: in payload.before taispeántar staid na líne roimhe seo, agus isteach payload.after — nua le croílár na n-athruithe.

2.2 MongoDB

Úsáideann an cónascaire seo meicníocht chaighdeánach macasamhlaithe MongoDB, ag léamh faisnéise ó oplog an nód DBMS bunscoile.

Cosúil leis an gcónascaire a thuairiscítear cheana féin do PgSQL, anseo, freisin, ag an gcéad tús, tógtar an pictiúr sonraí príomhúla, agus ina dhiaidh sin aistríonn an cónascaire go mód léitheoireachta oplog.

Sampla cumraíochta:

{
"name": "mp-k8s-mongo-connector",
"config": {
"connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
"tasks.max": "1",
"mongodb.hosts": "MainRepSet/mongo:27017",
"mongodb.name": "mongo",
"mongodb.user": "debezium",
"mongodb.password": "dbname",
"database.whitelist": "db_1,db_2",
"transforms": "AddPrefix",
"transforms.AddPrefix.type": "org.apache.kafka.connect.transforms.RegexRouter",
"transforms.AddPrefix.regex": "mongo.([a-zA-Z_0-9]*).([a-zA-Z_0-9]*)",
"transforms.AddPrefix.replacement": "data.cdc.mongo_$1"
}
}

Mar a fheiceann tú, níl aon roghanna nua anseo i gcomparáid leis an sampla roimhe seo, ach níl ach líon na roghanna atá freagrach as nascadh leis an mbunachar sonraí agus a réimíreanna laghdaithe.

Socruithe transforms an uair seo déanann siad na rudaí seo a leanas: claochlaíonn siad ainm an spriocthopaic ón scéimre <server_name>.<db_name>.<collection_name> в data.cdc.mongo_<db_name>.

lamháltas locht

Tá an cheist maidir le lamháltas lochtanna agus ard-infhaighteacht inár gcuid ama níos géire ná riamh - go háirithe nuair a bhíonn muid ag caint faoi shonraí agus idirbhearta, agus ní sheasann rianú athruithe sonraí ar leataobh sa tsaincheist seo. Breathnaímid ar cad is féidir dul mícheart i bprionsabal agus cad a tharlóidh do Debezium i ngach cás.

Tá trí rogha rogha an diúltaithe:

  1. Teip Kafka Connect. Má tá Connect cumraithe chun oibriú i mód dáilte, éilíonn sé seo go mbeidh il-oibrithe in ann an group.id céanna a shocrú. Ansin, má theipeann ar cheann acu, déanfar an cónascaire a atosú ar oibrí eile agus leanúint ar aghaidh ag léamh ón seasamh tiomanta deireanach san ábhar i Kafka.
  2. Cailliúint nascachta le braisle Kafka. Stopfaidh an cónascaire ag léamh ag an suíomh nár éirigh leis a sheoladh chuig Kafka, agus déanfaidh sé iarracht go tréimhsiúil é a athsheoladh go dtí go n-éireoidh leis an iarracht.
  3. Níl fáil ar fhoinse sonraí. Déanfaidh an cónascaire iarracht athcheangal leis an bhfoinse mar atá cumraithe. Is é an réamhshocrú ná 16 iarracht ag baint úsáide as cúlú easpónantúil. Tar éis an 16ú iarracht nár éirigh leo, marcálfar an tasc mar Theip ar agus beidh ort é a atosú de láimh trí chomhéadan Kafka Connect REST.
    • I gcás PostgreSQL ní bheidh na sonraí a chailleadh, mar gheall ar Má úsáidtear sliotáin mhacasamhlú, cuirfear cosc ​​ort comhaid WAL nach bhfuil léite ag an gcónascaire a scriosadh. Sa chás seo, tá míbhuntáiste ag baint leis an mbonn freisin: má chuirtear isteach ar an nasc líonra idir an cónascaire agus an DBMS ar feadh i bhfad, tá seans ann go rithfidh an spás diosca amach, agus d'fhéadfadh teip ar bith a bheith mar thoradh air seo. an DBMS ar fad.
    • I gcás MySQL is féidir leis an DBMS féin na comhaid binlog a rothlú sula gcuirtear an nascacht ar ais. Cuirfidh sé seo faoi deara go rachaidh an cónascaire isteach sa staid theip, agus chun an gnáthoibriú a athbhunú, beidh ort atosú i mód seat tosaigh chun leanúint ar aghaidh ag léamh ó na boscaí bruscair.
    • Про MongoDB. Deir an doiciméadú: is ionann iompar an chónascaire i gcás go bhfuil comhaid logála/oploga scriosta agus nach féidir leis an gcónascaire leanúint ar aghaidh ag léamh ón suíomh inar scoir sé do gach DBMS. Ciallaíonn sé go rachaidh an cónascaire isteach sa stát Theip ar agus beidh gá le atosú i mód pictiúr tosaigh.

      Mar sin féin, tá eisceachtaí ann. Más rud é go raibh an cónascaire dícheangailte ar feadh i bhfad (nó nach bhféadfadh sé teacht ar shampla MongoDB), agus go ndeachaigh an oplog trí rothlú le linn an ama seo, ansin nuair a athchóirítear an nasc, leanfaidh an cónascaire ar aghaidh go socair ag léamh sonraí ón gcéad suíomh atá ar fáil, agus sin an fáth go bhfuil cuid de na sonraí i Kafka aon buailfidh.

Conclúid

Is é Debezium mo chéad taithí le córais CDC agus ar an iomlán an-dearfach. Bhí an bua ag an tionscadal lena thacaíocht do mhór-DBMSanna, éascaíocht cumraíochta, tacaíocht cnuasaithe, agus pobal gníomhach. Dóibh siúd a bhfuil suim acu i gcleachtas, molaim duit na treoracha le haghaidh a léamh Kafka Ceangail и Déibéisiam.

I gcomparáid leis an gcónascaire JDBC do Kafka Connect, is é príomhbhuntáiste Debezium ná go léitear athruithe ó logaí DBMS, rud a fhágann gur féidir sonraí a fháil le latency íosta. Ceistíonn Nascóir JDBC (ó Kafka Connect) an tábla monatóireachta ag eatramh seasta agus (ar an gcúis chéanna) ní ghineann sé teachtaireachtaí nuair a scriostar sonraí (conas is féidir leat sonraí nach bhfuil ann a cheistiú?).

Chun fadhbanna den chineál céanna a réiteach, is féidir leat aird a thabhairt ar na réitigh seo a leanas (chomh maith le Debezium):

PS

Léigh freisin ar ár mblag:

Foinse: will.com

Add a comment