Changes

Jump to: navigation, search

Apache Kafka

2,357 bytes added, 18:20, 20 April 2019
Kafka bemutatása
=Kafka bemutatása=
:[[File:ClipCapIt-190420-200836.PNG]]Egy Kafka architektúra legalább egy Kafka szerverből (bróker) áll ami a konfigurációját kötelezően a Zookeeper nevű elosztott konfigurációs management rendszerben tárolja. A Kafka borker-hez csatlakoznak a termelők és fogyasztók. A Kafka cluster-ben úgynevezett topic-ok találhatók. A termelők mindig egy dedikált topik-ra írnak, és a fogyasztók mindig egy dedikált topic-ról olvasnak, tehát a topic az a logikai egység, ami egy termelő-fogyasztó páros számára az üzeneteket tárolja és továbbítja. Mikor elindítunk egy Kafa példányt, akkor valójában egy kafka brokert indítunk el. A brokereknek van száma, ezeket nem lehet konfigurációból felskálázni. Ha producer-ek mindig egy brokerhez csatlakoznak. A teljes konfiguráció zookeeper-ben van tárolva. A zookeeper tudja értesíteni a klienseket ha a konfiguráció változik, ezért hamar elterjed a hálózaton a változás.
Egy topic úgynevezett partíciókra van osztva. Minden üzenet csak egy partícióba kerül be.
:[[File:ClipCapIt-190420-201500.PNG]]
A producer-ek egy megadott topic-kra dobálják be az üzeneteket, amit onnan a consumer-ek kiolvasnak. Egy topic tetszőleges számú partícióból állhat. Egy partíció az a logikai egység, aminek rá kell férnie egy lemezre. A topic-kot úgy kell felskálázni, hogy egyre több partíciót adunk hozzá, amik különböző brokereken fognak létrejönni. Minden partíciónak lehet egy vagy több replikája, amik biztonsági másolatok. Mikor a producer beküld egy üzenetet egy partícióba, akkor fog committed üzenetnek minősülni, ha minden replikára is eljutott.
Azt, hogy egy producer melyik partícióba dobja az üzenetet vagy a kulcs határozza meg, vagy round-rubin módon mindig egy másikba teszi. Ha van kulcs, akkor az abból készült hash fogja meghatározni, hogy melyik partícióba kerüljön. Ugyan az a kulcs így mindig ugyan abba a partícióba fog kerülni. De a kulcs nem kötelező. A sorrend tartás csak egy partíción belül garantált, de ott nagyon. Ha nagyon kritikus bizonyos üzenetek sorrendje, akkor azokat egy partícióba kell rakni azonos kulcsot használva. Loggolásnál ez nem kritikus, egyrészt mert a logstash sorba rakja az üzeneteket, másrészt mikor elastichsearch-be szúrjuk, ott a dátum lesz az egyik attribútum, ami alapján már sorba lehet majd újra rendezni a logokat. Az meg amúgy sem kritikus, ha a log egy része enyhe csúszással kerül be az adatbázisba, lényeg, hogy végül helyes lesz a sorrend.
A comsumer-eket úgynevezett consumer-group-okba szervezzük az azonosítójuk szerint. Egy csoport mindig ugyan azon topic üzeneteit olvassa, de minden egyes consumer a csoporotban más és más partícióból. Minden partíció csak egy consumer-hez rendelhető hozzá egy csoporton belül. De ha nincs annyi consumer a csoportban mind ahány partíció, akkor egy consumer több partíciót is fog olvasni(ahogy ez a fenti ábrán is látszik, az alsó consumer két partíciót olvas. Viszont ha több consumer van mint partíció egy csoportban, akkor bizonyos consumer-ek mindig idle állapotban lesznek. Minden csoporton belül van egy vezető consumer, általában az aki először csatlakozott. Ő teríti a többieknek a cluster információkat. A kafka nem tudja értelmezni sem a kulcsot sem az üzenetet. Ez számára egy bájt tömb. Az, hogy egy objektumból hogy lesz bájt tömb kulcs és bájt tömb üzenet a producer-ben lévő serializátor dolga. A consumer-ben pedig a deserializázor dolga, hogy a bájt folyamból újra értelmes objektumot állítson elő.
minden partíció újabb üzenete mindig A Kafka nem tudja értelmezni sem a partíció végére íródik. A partíció elejétől számoljuk kulcsot sem az üzenetek sorszámát, ezt hívjuk offset-neküzenetet. Mikor Ez számára egy consumer kiolvas egy üzentetbájt tömb. Az, attól az még ott marad a partícióba egészen addig, amíg len nem jár, alapértelmezetten ez hogy egy nap. Tehát ez eltér objektumból hogy lesz bájt tömb kulcs és bájt tömb üzenet a hagyományos sor kezeléstőlproducer-ben lévő serializátor dolga. A Kafka nyilvántartja, hogy melyik consumer egy adott partícióban melyik offset-nél tartott. Ezt egy speciális topic-ban tartja nyilván: "__...". Ha újra is indul ben pedig a világdeserializázor dolga, akkor is tudni fogják hogy a consumer-ek hogy hol tartottak, és onnan folytatjákbájt folyamból újra értelmes objektumot állítson elő.
Minden partíció új üzenete mindig a partíció végére íródik. A partíció elejétől számoljuk az üzenetek sorszámát, ezt hívjuk offset-nek. Mikor egy consumer kiolvas egy üzentet, attól az még ott marad a partícióba egészen addig, amíg len nem jár, alapértelmezetten ez egy nap. Tehát ez eltér a hagyományos sor kezeléstől. A Kafka nyilvántartja, hogy melyik consumer egy adott partícióban melyik offset-nél tartott. Ezt egy speciális topic-ban tartja nyilván: "__...". Ha újra is indul a világ, akkor is tudni fogják a consumer-ek hogy hol tartottak, és onnan folytatják.
Producer -> serializator -> partitioner -> batch (partícionként) ->|idáig tart a producer | kafa broker
Producer:
bootstrapA docker alapú claud világban egy tipikus architektúra a logok centralizált gyűjtésére, mikor egy logstash példány a producer és egy másik logstash példány a consumer.servers: A konténer logokat a producer logstash kapja meg, aki a log sorok különböző paraméterei mentén a brokerek listájamegfelelő Topic-ba tudja irányítani az üzeneteket. Itt nem kell A consumer logstash pedig leszedi a Topic-rol az összes brokerüzenetet és beírja Elasticsearch-be. :[[File:ClipCapIt-190420-200104.PNG]]   :[[File:ClipCapIt-190420-200500.PNG]]file:///home/adam/Repositories/svn/OPT/kafka/abrak/many-t felsorolni, mert ha már az egyikhez hozzá tud csatlakozni, az elküldi a teljes producer-kafka-many-consumer.png    =Környezet kialakítása= Az Avro futtatásához szükséges környezet egy két node-os swarm cluster topológiátlesz. <pre># virsh list Id Name State---------------------------------------------------- 1 mg0 running 2 worker0 running</pre> <pre># docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONmaigxlyagj1fl4sgcf6rnn9pc * mg0 Ready Active Leader 18. Viszont ajánlatos többet megadni hibatűrés céljából05.0-cevox99u5s1g1su742mc6npm370 worker0 Ready Active 18.05.0-ce</pre>  Itt fogunk futtatni egy docker stack-et ami tartalmaz majd egy kafka brókert és egy zookeeper példányt. <source lang="C++">version: '3.2'services: zookeeper:key image: confluentinc/cp-zookeeper:5.1.serializer2 networks: Akkor is meg kell adni, ha nem használunk kulcsot - kafka-net ports: - "32181:32181" deploy: placement: constraints: - node. A kulcs is mindig bájt tömb, ezért a serializátor implementációnknak bájt tömböt kell visszaadnirole == worker environment: ZOOKEEPER_CLIENT_PORT: 32181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_SYNC_LIMIT: 2 kafka: image: confluentinc/cp-kafka:5. Vannak beépítettek a java kliensbe a java alaptípusokra1.2 networks: - kafka-net ports: - target: 29092 published: 29092 protocol: tcp deploy: placement:value constraints: - node.serializerrole == worker environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:32181" KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:29092" KAFKA_BROKER_ID: 2 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1</source>
=Producer=

Navigation menu