Представљамо Дебезиум - ЦДЦ за Апацхе Кафку

Представљамо Дебезиум - ЦДЦ за Апацхе Кафку

У свом раду често наилазим на нова техничка решења/софтверске производе, о којима су информације прилично оскудне на интернету на руском језику. Овим чланком покушаћу да попуним једну такву празнину примером из моје недавне праксе, када је требало да конфигуришем слање ЦДЦ догађаја из два популарна ДБМС-а (ПостгреСКЛ и МонгоДБ) у Кафка кластер користећи Дебезиум. Надам се да ће овај прегледни чланак, који се појављује као резултат обављеног посла, бити користан другима.

Шта је Дебезијум и ЦДЦ уопште?

Дебезијум — представник категорије ЦДЦ софтвера (Снимите промену података), тачније, то је скуп конектора за различите ДБМС-ове компатибилне са Апацхе Кафка Цоннецт фрамеворк-ом.

Она Пројекат отвореног кода, лиценциран под Апацхе лиценцом в2.0 и спонзорисан од стране Ред Хата. Развој је у току од 2016. године и тренутно пружа званичну подршку за следеће ДБМС: МиСКЛ, ПостгреСКЛ, МонгоДБ, СКЛ Сервер. Постоје и конектори за Цассандру и Орацле, али тренутно су у статусу „рани приступ“, а нова издања не гарантују компатибилност уназад.

Ако упоредимо ЦДЦ са традиционалним приступом (када апликација директно чита податке из ДБМС-а), његове главне предности укључују имплементацију стримовања промене података на нивоу реда са малим кашњењем, високом поузданошћу и доступношћу. Последње две тачке се постижу коришћењем Кафка кластера као спремишта за ЦДЦ догађаје.

Још једна предност је чињеница да се за складиштење догађаја користи један модел, тако да крајња апликација не мора да брине о нијансама рада различитих ДБМС-ова.

Коначно, коришћење брокера порука омогућава апликацијама које прате промене у подацима да се хоризонтално скалирају. Истовремено, утицај на извор података је минимизиран, пошто се подаци не добијају директно из ДБМС-а, већ из Кафка кластера.

О архитектури Дебезијума

Коришћење Дебезиума се своди на ову једноставну шему:

ДБМС (као извор података) → конектор у Кафка Цоннецт → Апацхе Кафка → потрошач

Као илустрација, ево дијаграма са веб странице пројекта:

Представљамо Дебезиум - ЦДЦ за Апацхе Кафку

Међутим, ова шема ми се баш и не свиђа, јер се чини да је могућа само употреба конектора за судопер.

У стварности, ситуација је другачија: пуњење вашег језера података (последња веза на дијаграму изнад) Ово није једини начин да се користи Дебезиум. Ваше апликације могу да користе догађаје послате Апацхе Кафки за решавање разних ситуација. На пример:

  • уклањање небитних података из кеша;
  • слање обавештења;
  • ажурирања индекса претраживања;
  • нека врста евиденције ревизије;
  • ...

У случају да имате Јава апликацију и нема потребе/могућности да користите Кафка кластер, постоји и могућност рада кроз ембеддед-цоннецтор. Очигледна предност је што елиминише потребу за додатном инфраструктуром (у облику конектора и Кафке). Међутим, ово решење је застарело од верзије 1.1 и више се не препоручује за употребу (подршка за њега може бити уклоњена у будућим издањима).

Овај чланак ће расправљати о архитектури коју препоручују програмери, која обезбеђује толеранцију грешака и скалабилност.

Конфигурација конектора

Да бисмо почели да пратимо промене најважније вредности – података – потребно нам је:

  1. извор података, који може бити МиСКЛ почевши од верзије 5.7, ПостгреСКЛ 9.6+, МонгоДБ 3.2+ (Комплетна листа);
  2. Апацхе Кафка кластер;
  3. Кафка Цоннецт инстанца (верзије 1.к, 2.к);
  4. конфигурисан Дебезиум конектор.

Радите на прве две тачке, тј. Процес инсталације ДБМС-а и Апацхе Кафке је ван оквира овог чланка. Међутим, за оне који желе све да распореде у сандбок-у, званично складиште са примерима има готов доцкер-цомпосе.иамл.

Задржаћемо се детаљније на последње две тачке.

0. Кафка Цоннецт

Овде и даље у чланку, сви примери конфигурације се разматрају у контексту Доцкер слике коју дистрибуирају програмери Дебезиума. Садржи све потребне додатке (конекторе) и обезбеђује конфигурацију Кафка Цоннецт-а помоћу променљивих окружења.

Ако намеравате да користите Кафка Цоннецт са Цонфлуент-а, мораћете независно да додате додатке потребних конектора у директоријум наведен у plugin.path или поставити преко променљиве окружења CLASSPATH. Подешавања за Кафка Цоннецт радник и конекторе се одређују преко конфигурационих датотека које се прослеђују као аргументи команди за покретање радника. За више детаља, погледајте документација.

Цео процес подешавања Дебеизума у ​​верзији конектора одвија се у две фазе. Погледајмо сваки од њих:

1. Постављање оквира Кафка Цоннецт

Да бисте стримовали податке у Апацхе Кафка кластер, одређени параметри су подешени у оквиру Кафка Цоннецт, као што су:

  • параметри за повезивање на кластер,
  • имена тема у којима ће се директно чувати конфигурација самог конектора,
  • назив групе у којој се изводи конектор (ако се користи дистрибуирани режим).

Званична Доцкер слика пројекта подржава конфигурацију помоћу променљивих окружења - то је оно што ћемо користити. Дакле, преузмите слику:

docker pull debezium/connect

Минимални скуп променљивих окружења потребних за покретање конектора је следећи:

  • BOOTSTRAP_SERVERS=kafka-1:9092,kafka-2:9092,kafka-3:9092 — почетна листа Кафка сервера кластера да би се добила комплетна листа чланова кластера;
  • OFFSET_STORAGE_TOPIC=connector-offsets — тема за чување позиција на којима се конектор тренутно налази;
  • CONNECT_STATUS_STORAGE_TOPIC=connector-status — тема за чување статуса конектора и његових задатака;
  • CONFIG_STORAGE_TOPIC=connector-config — тема за чување података о конфигурацији конектора и његових задатака;
  • GROUP_ID=1 — идентификатор групе радника на којој се може извршити задатак конектора; неопходно при коришћењу дистрибуираних (дистрибуирано) režima.

Покрећемо контејнер са овим варијаблама:

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

Напомена о Авру

Дебезиум подразумевано уписује податке у ЈСОН формату, што је прихватљиво за сандбокове и мале количине података, али може постати проблем у високо оптерећеним базама података. Алтернатива ЈСОН конвертору је серијализација порука помоћу Аирбус у бинарни формат, што смањује оптерећење И/О подсистема у Апацхе Кафки.

Да бисте користили Авро, потребно је да примените посебан сцхема-регистри (за чување дијаграма). Променљиве за претварач ће изгледати овако:

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

Детаљи о коришћењу Авро-а и подешавању регистра за њега су ван оквира овог чланка - даље, ради јасноће, користићемо ЈСОН.

2. Конфигурисање самог конектора

Сада можете ићи директно на конфигурацију самог конектора, који ће читати податке из извора.

Погледајмо пример конектора за два ДБМС-а: ПостгреСКЛ и МонгоДБ, у којима имам искуства и у којима постоје разлике (додуше мале, али у неким случајевима значајне!).

Конфигурација је описана у ЈСОН нотацији и отпремљена у Кафка Цоннецт помоћу ПОСТ захтева.

2.1. ПостгреСКЛ

Пример конфигурације конектора за ПостгреСКЛ:

{
  "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"
  }
}

Принцип рада конектора након овог подешавања је прилично једноставан:

  • Када се покрене први пут, повезује се са базом података наведеном у конфигурацији и покреће се у режиму почетни снимак, шаљући Кафки почетни скуп података добијених коришћењем кондиционала SELECT * FROM table_name.
  • Након што је иницијализација завршена, конектор прелази у режим за читање промена из ПостгреСКЛ ВАЛ датотека.

О коришћеним опцијама:

  • name — назив конектора за који се користи доле описана конфигурација; у будућности, ово име се користи за рад са конектором (тј. преглед статуса/поновно покретање/ажурирање конфигурације) преко Кафка Цоннецт РЕСТ АПИ-ја;
  • connector.class — класа конектора ДБМС коју ће користити конфигурисани конектор;
  • plugin.name — назив додатка за логичко декодирање података из ВАЛ датотека. Доступан за избор wal2json, decoderbuffs и pgoutput. Прва два захтевају инсталацију одговарајућих екстензија у ДБМС, и pgoutput за ПостгреСКЛ верзију 10 и новију не захтева додатне манипулације;
  • database.* — опције за повезивање са базом података, где database.server.name — Име ПостгреСКЛ инстанце које се користи за формирање назива теме у Кафка кластеру;
  • table.include.list — списак табела у којима желимо да пратимо промене; наведено у формату schema.table_name; не може се користити заједно са table.exclude.list;
  • heartbeat.interval.ms — интервал (у милисекундама) са којим конектор шаље поруке откуцаја срца на посебну тему;
  • heartbeat.action.query — захтев који ће се извршавати приликом слања сваке поруке откуцаја срца (опција се појавила у верзији 1.1);
  • slot.name — назив слота за репликацију који ће користити конектор;
  • publication.name - Име Публикација у ПостгреСКЛ-у, који конектор користи. Ако не постоји, Дебезиум ће покушати да га створи. Ако корисник под којим се успоставља веза нема довољно права за ову акцију, конектор ће се прекинути са грешком;
  • transforms одређује тачно како променити назив циљне теме:
    • transforms.AddPrefix.type означава да ћемо користити регуларне изразе;
    • transforms.AddPrefix.regex — маска која редефинише назив циљне теме;
    • transforms.AddPrefix.replacement - директно оно што редефинишемо.

Више о откуцајима срца и трансформацијама

Подразумевано, конектор шаље податке Кафки за сваку извршену трансакцију, а његов ЛСН (Лог Секуенце Нумбер) је забележен у теми услуге offset. Али шта се дешава ако је конектор конфигурисан да чита не целу базу података, већ само део њених табела (у којима се ажурирања података не дешавају често)?

  • Конектор ће читати ВАЛ датотеке и неће открити никакве трансакције урезивања за табеле које надгледа.
  • Стога, неће ажурирати своју тренутну позицију ни у теми ни у слоту за репликацију.
  • Ово ће заузврат довести до тога да се ВАЛ датотеке држе на диску и вероватно ће остати без простора на диску.

И ту опције долазе у помоћ. heartbeat.interval.ms и heartbeat.action.query. Коришћење ових опција у паровима омогућава да се изврши захтев за промену података у засебној табели сваки пут када се пошаље порука о откуцају срца. Дакле, ЛСН на којем се конектор тренутно налази (у слоту за репликацију) се стално ажурира. Ово омогућава ДБМС-у да уклони ВАЛ датотеке које више нису потребне. Можете сазнати више о томе како опције функционишу документација.

Још једна опција вредна пажње је transforms. Иако се више ради о удобности и лепоти...

Дебезиум подразумевано креира теме користећи следеће смернице за именовање: serverName.schemaName.tableName. Ово можда није увек згодно. Опције transforms Можете да користите регуларне изразе да дефинишете листу табела, догађаје из којих треба да се усмери на тему са одређеним именом.

У нашој конфигурацији хвала transforms дешава се следеће: сви догађаји ЦДЦ-а из надгледане базе података ће ићи на тему са именом data.cdc.dbname. У супротном (без ових подешавања), Дебезиум би подразумевано креирао тему за сваку табелу као што је: pg-dev.public.<table_name>.

Ограничења конектора

Да закључимо опис конфигурације конектора за ПостгреСКЛ, вреди говорити о следећим карактеристикама/ограничењима његовог рада:

  1. Функционалност конектора за ПостгреСКЛ се ослања на концепт логичког декодирања. Стога он не прати захтеве за променом структуре базе података (ДДЛ) - сходно томе, ови подаци неће бити у темама.
  2. Пошто се користе слотови за репликацију, повезивање конектора је могуће само на водећу инстанцу ДБМС.
  3. Ако корисник под којим се конектор повезује са базом података има права само за читање, онда ћете пре првог покретања морати ручно да креирате слот за репликацију и објавите у бази података.

Примена конфигурације

Дакле, учитајмо нашу конфигурацију у конектор:

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

Проверавамо да ли је преузимање било успешно и да је конектор покренут:

$ 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"}

Одлично: постављен је и спреман за рад. Сада хајде да се претварамо да смо потрошач и да се повежемо са Кафком, након чега ћемо додати и променити унос у табели:

$ 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

У нашој теми ће бити приказано на следећи начин:

Веома дугачак ЈСОН са нашим изменама

{
"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
}
}

У оба случаја, записи се састоје од кључа (ПК) записа који је промењен, и саме суштине промена: шта је запис био пре и шта је постао после.

  • У случају INSERT: вредност пре (before) једнако null, а после - линија која је уметнута.
  • У случају UPDATE: ин payload.before приказано је претходно стање линије, а у payload.after — ново са суштином промена.

2.2 МонгоДБ

Овај конектор користи стандардни механизам репликације МонгоДБ, читајући информације из оплога примарног ДБМС чвора.

Слично већ описаном конектору за ПгСКЛ, и овде се при првом покретању прави примарни снимак података, након чега конектор прелази у оплог мод читања.

Пример конфигурације:

{
"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"
}
}

Као што видите, овде нема нових опција у поређењу са претходним примером, већ је само смањен број опција одговорних за повезивање са базом података и њихових префикса.

podešavanja transforms овог пута раде следеће: трансформишу име циљне теме из шеме <server_name>.<db_name>.<collection_name> в data.cdc.mongo_<db_name>.

толеранција грешака

Питање толеранције грешака и високе доступности у наше време је акутније него икад – посебно када је реч о подацима и трансакцијама, а праћење промена података не стоји по страни у овом питању. Хајде да погледамо шта у принципу може поћи по злу и шта ће се десити са Дебезијумом у сваком случају.

Постоје три опције за онемогућавање:

  1. Кафка Цоннецт грешка. Ако је Цоннецт конфигурисан да ради у дистрибуираном режиму, ово захтева да више радника подеси исту групу.ид. Затим, ако један од њих поквари, конектор ће се поново покренути на другом воркер-у и наставити читање са последње урезане позиције у теми у Кафки.
  2. Губитак везе са Кафка кластером. Конектор ће једноставно престати да чита на позицији која није успела да пошаље Кафки, и повремено ће покушавати да је поново пошаље док покушај не успе.
  3. Недоступност извора података. Конектор ће покушати да се поново повеже са извором како је конфигурисан. Подразумевано је 16 покушаја коришћења експоненцијално повлачење. После 16. неуспешног покушаја задатак ће бити означен као фаилед и мораћете да га ручно поново покренете преко Кафка Цоннецт РЕСТ интерфејса.
    • У случају ПостгреСКЛ подаци неће бити изгубљени, јер Коришћење слотова за репликацију ће вас спречити да избришете ВАЛ датотеке које конектор не чита. У овом случају постоји и лоша страна новчића: ако је мрежна веза између конектора и ДБМС-а поремећена дуже време, постоји могућност да понестане простора на диску, а то може довести до квара цео ДБМС.
    • У случају МиСКЛ бинлог датотеке може ротирати сам ДБМС пре него што се конекција поново успостави. Ово ће довести до тога да конектор пређе у неуспешно стање, а да бисте вратили нормалан рад, мораћете да се поново покренете у режиму почетног снимања да бисте наставили са читањем из бинлогова.
    • О томе МонгоДБ. У документацији се наводи: понашање конектора у случају да су лог/оплог датотеке избрисане и конектор не може да настави читање са позиције на којој је стао је исто за све ДБМС. То значи да ће конектор ући у стање фаилед и захтеваће поновно покретање у режиму почетни снимак.

      Међутим, постоје изузеци. Ако је конектор био искључен дуже време (или није могао да дође до МонгоДБ инстанце), а оплог је прошао кроз ротацију за то време, онда када се веза успостави, конектор ће мирно наставити да чита податке са прве доступне позиције, због чега неки од података код Кафке не погодиће.

Закључак

Дебезијум је моје прво искуство са ЦДЦ системима и генерално веома позитивно. Пројекат је освојио својом подршком за главне ДБМС-ове, лакоћом конфигурације, подршком за кластерисање и активном заједницом. За оне који су заинтересовани за праксу, препоручујем да прочитају упутства за Кафка Цоннецт и Дебезијум.

У поређењу са ЈДБЦ конектором за Кафка Цоннецт, главна предност Дебезиума је то што се промене читају из ДБМС дневника, што омогућава пријем података са минималним кашњењем. ЈДБЦ конектор (из Кафка Цоннецт) испитује надзирану табелу у фиксном интервалу и (из истог разлога) не генерише поруке када се подаци бришу (како можете да тражите податке који не постоје?).

Да бисте решили сличне проблеме, можете обратити пажњу на следећа решења (поред Дебезијума):

ПС

Прочитајте и на нашем блогу:

Извор: ввв.хабр.цом

Додај коментар