{"id":52541,"date":"2019-11-11T00:00:00","date_gmt":"2019-11-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost"},"modified":"2020-02-18T14:00:17","modified_gmt":"2020-02-18T11:00:17","slug":"rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","title":{"rendered":"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/6557ce69c2b3070622feca8b3c228b09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">el\u0151z\u0151 cikkben<\/a><\/noindex> Megvizsg\u00e1ltuk a RabbitMQ klaszterez\u00e9s\u00e9t a megb\u00edzhat\u00f3s\u00e1g \u00e9s a magas rendelkez\u00e9sre \u00e1ll\u00e1s \u00e9rdek\u00e9ben. Most m\u00e9lyebben belemer\u00fcl\u00fcnk az Apache Kafka vil\u00e1g\u00e1ba.<\/p>\n<p>Itt a replik\u00e1ci\u00f3 egys\u00e9ge a part\u00edci\u00f3. Minden t\u00e9m\u00e1hoz tartozik egy vagy t\u00f6bb part\u00edci\u00f3. Minden part\u00edci\u00f3 rendelkezik egy vezet\u0151vel, amelynek lehetnek k\u00f6vet\u0151i vagy nem. A t\u00e9ma l\u00e9trehoz\u00e1sakor meg kell adni a part\u00edci\u00f3k sz\u00e1m\u00e1t \u00e9s a replik\u00e1ci\u00f3s ar\u00e1nyt. A megszokott \u00e9rt\u00e9k 3, ami h\u00e1rom replik\u00e1t jelent: egy vezet\u0151t \u00e9s k\u00e9t k\u00f6vet\u0151t.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/36deb6d506223c2ee2ec147d5c215789.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>1. \u00e1bra. N\u00e9gy part\u00edci\u00f3 h\u00e1rom br\u00f3ker k\u00f6z\u00f6tt elosztva<\/i><\/p>\n<p>Minden olvas\u00e1si \u00e9s \u00edr\u00e1si k\u00e9r\u00e9s a vezet\u0151h\u00f6z \u00e9rkezik. A k\u00f6vet\u0151k id\u0151szakonk\u00e9nt k\u00e9rd\u00e9seket k\u00fcldenek a vezet\u0151nek az utols\u00f3 \u00fczenetek megszerz\u00e9s\u00e9re. A fogyaszt\u00f3k soha nem fordulnak a k\u00f6vet\u0151kh\u00f6z, azok csup\u00e1n a redundancia \u00e9s a megb\u00edzhat\u00f3s\u00e1g \u00e9rdek\u00e9ben l\u00e9teznek.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/715c51d75cb45863cfad4b37e81b9a9a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h1>Part\u00edci\u00f3 hiba<\/h1>\n<p>\nAmikor egy br\u00f3ker le\u00e1ll, gyakran t\u00f6bb part\u00edci\u00f3 vezet\u0151je is meghal. Ezek k\u00f6z\u00fcl egy m\u00e1sik csom\u00f3pont k\u00f6vet\u0151je v\u00e1lik a vezet\u0151v\u00e9. Val\u00f3j\u00e1ban ez nem mindig \u00edgy van, mivel a szinkroniz\u00e1l\u00e1s t\u00e9nyez\u0151je is befoly\u00e1sol: vannak-e szinkroniz\u00e1lt k\u00f6vet\u0151k, \u00e9s ha nincsenek, akkor megengedett-e a nem szinkroniz\u00e1lt replik\u00e1ra val\u00f3 \u00e1tt\u00e9r\u00e9s. De egyel\u0151re ne bonyol\u00edtsuk a dolgokat.<\/p>\n<p>A h\u00e1l\u00f3zatb\u00f3l kiker\u00fcl a 3-as br\u00f3ker \u2013 \u00e9s a 2-es part\u00edci\u00f3hoz \u00faj vezet\u0151t v\u00e1lasztanak a 2-es br\u00f3kerb\u0151l.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/b8cfce64cf6b848b0659de023f9d9b63.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>2. \u00e1bra. A 3-as br\u00f3ker meghal, \u00e9s a 2-es br\u00f3ker k\u00f6vet\u0151je \u00faj vezet\u0151k\u00e9nt ker\u00fcl a 2-es part\u00edci\u00f3hoz<\/i><\/p>\n<p>Ezut\u00e1n a 1-es br\u00f3ker is le\u00e1ll, \u00e9s az 1-es part\u00edci\u00f3 is elvesz\u00edti a vezet\u0151j\u00e9t, akinek szerep\u00e9t a 2-es br\u00f3ker veszi \u00e1t.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/9f5409c723da7ff059b93f9b23e7d5f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>3. \u00e1bra. Egyed\u00fcl maradt br\u00f3ker. Az \u00f6sszes vezet\u0151 egy br\u00f3kerben van, nulla redundanci\u00e1val<\/i><\/p>\n<p>Amikor a 1-es br\u00f3ker visszat\u00e9r a h\u00e1l\u00f3zatba, n\u00e9gy k\u00f6vet\u0151t ad hozz\u00e1, biztos\u00edtva ezzel valamennyi part\u00edci\u00f3 sz\u00e1m\u00e1ra a redundanci\u00e1t. De az \u00f6sszes vezet\u0151 tov\u00e1bbra is a 2-es br\u00f3kern\u00e9l maradt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/f9c8e42f51258b7fd7f6f35dc7b8cc3b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>4. \u00e1bra. A vezet\u0151k a 2-es br\u00f3kern\u00e9l maradnak<\/i><\/p>\n<p>Amikor a 3-as br\u00f3ker \u00fajraindul, visszat\u00e9r\u00fcnk a h\u00e1rom replik\u00e1s part\u00edci\u00f3hoz. De az \u00f6sszes vezet\u0151 tov\u00e1bbra is a 2-es br\u00f3kern\u00e9l van.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/9c8c02be4161f8468b5dbc1e3f6ecb3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>5. \u00e1bra. A vezet\u0151k kiegyens\u00falyozatlan elhelyez\u00e9se az 1-es \u00e9s 3-as br\u00f3kerek helyre\u00e1ll\u00edt\u00e1sa ut\u00e1n<\/i><\/p>\n<p>A Kafka rendelkezik egy eszk\u00f6zzel, amely a vezet\u0151k jobb \u00fajraeloszt\u00e1s\u00e1t teszi lehet\u0151v\u00e9, mint a RabbitMQ-n\u00e1l. Ott harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 b\u0151v\u00edtm\u00e9nyt vagy szkriptet kellett haszn\u00e1lni, amely megv\u00e1ltoztatta a politik\u00e1kat a f\u0151 csom\u00f3pont migr\u00e1l\u00e1s\u00e1nak cs\u00f6kkent\u00e9s\u00e9re a redundancia cs\u00f6kkent\u00e9se \u00e9rdek\u00e9ben a migr\u00e1ci\u00f3 sor\u00e1n. Ezenk\u00edv\u00fcl nagyobb sorok eset\u00e9n a szinkroniz\u00e1ci\u00f3 idej\u00e9re a meg nem felel\u00e9s elfogad\u00e1s\u00e1val kellett egy\u00fctt \u00e9lni.<\/p>\n<p>A Kafka a vezet\u0151 prefer\u00e1lt replik\u00e1kkal rendelkezik. Amikor a t\u00e9ma part\u00edci\u00f3k l\u00e9trej\u00f6nnek, a Kafka megpr\u00f3b\u00e1lja egyenletesen sz\u00e9tosztani a vezet\u0151ket a csom\u00f3pontok k\u00f6z\u00f6tt, \u00e9s ezeket az els\u0151 vezet\u0151ket prefer\u00e1ltk\u00e9nt jel\u00f6li meg. Az id\u0151 m\u00fal\u00e1s\u00e1val a szerverek \u00fajraindul\u00e1sa, meghib\u00e1sod\u00e1sok \u00e9s a kapcsolati hib\u00e1k miatt a vezet\u0151k m\u00e1s csom\u00f3pontokon is megjelenhetnek, ahogy az a fent le\u00edrt sz\u00e9ls\u0151 esetben is megt\u00f6rt\u00e9nik.<\/p>\n<p>Ezek kijav\u00edt\u00e1s\u00e1ra a Kafka k\u00e9t lehet\u0151s\u00e9get k\u00edn\u00e1l:<\/p>\n<ul>\n<li>Opci\u00f3 <i>auto.leader.rebalance.enable=true<\/i> lehet\u0151v\u00e9 teszi a vez\u00e9rl\u0151csom\u00f3pont sz\u00e1m\u00e1ra, hogy automatikusan vissz\u00e1j\u00e1ra rendeljen \u00fajra prefer\u00e1lt replik\u00e1kra \u00e9s \u00edgy helyre\u00e1ll\u00edtsa az egyenletes eloszl\u00e1st.\n<\/li>\n<li>Az adminisztr\u00e1tor futtathat egy szkriptet <i>kafka-preferred-replica-election.sh<\/i> a manu\u00e1lis \u00fajraoszt\u00e1shoz.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/831930b06809637018fecb6d7d5a558d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>6. \u00e1bra. Replik\u00e1k az \u00fajraeloszt\u00e1s ut\u00e1n<\/i><\/p>\n<p>Ez egy leegyszer\u0171s\u00edtett hibaeset volt, de a val\u00f3s\u00e1g bonyolultabb, b\u00e1r itt semmi t\u00fal neh\u00e9z nem \u00e1ll. Minden az \u00f6sszeszinkroniz\u00e1lt replik\u00e1kra (In-Sync Replicas, ISR) reduk\u00e1l\u00f3dik.<\/p>\n<h1>Az \u00f6sszeszinkroniz\u00e1lt replik\u00e1k (ISR)<\/h1>\n<p>\nAz ISR az a replik\u00e1k halmaza, amely egy part\u00edci\u00f3t \u201e\u00f6sszeszinkroniz\u00e1ltnak\u201d tart. Itt van egy vezet\u0151, \u00e9s a k\u00f6vet\u0151k ak\u00e1r nincsenek is. A k\u00f6vet\u0151 akkor sz\u00e1m\u00edt \u00f6sszeszinkroniz\u00e1ltnak, ha az \u00f6sszes vezet\u0151i \u00fczenetet pontosan m\u00e1solta le az id\u0151korl\u00e1t lej\u00e1rta el\u0151tt <i>replica.lag.time.max.ms<\/i>.<\/p>\n<p>A k\u00f6vet\u0151t elt\u00e1vol\u00edtj\u00e1k az ISR-b\u0151l, ha:<\/p>\n<ul>\n<li>nem k\u00e9rte az adatok lek\u00e9rdez\u00e9s\u00e9t az id\u0151kereten bel\u00fcl <i>replica.lag.time.max.ms<\/i> (halottnak sz\u00e1m\u00edt)\n<\/li>\n<li>nem tudott friss\u00fclni az id\u0151kereten bel\u00fcl <i>replica.lag.time.max.ms<\/i> (lass\u00fanak sz\u00e1m\u00edt)<\/li>\n<\/ul>\n<p>\nA k\u00f6vet\u0151k az id\u0151keretben k\u00e9rik az adatokat <i>replica.fetch.wait.max.ms<\/i>, amely alap\u00e9rtelmezetten 500 ms.<\/p>\n<p>Az ISR c\u00e9lj\u00e1nak pontos ismertet\u00e9s\u00e9hez l\u00e1tnunk kell a gy\u00e1rt\u00f3t\u00f3l (producer) \u00e9rkez\u0151 visszaigazol\u00e1sokat \u00e9s n\u00e9h\u00e1ny hibaesetet. A gy\u00e1rt\u00f3k v\u00e1laszthatj\u00e1k meg, mikor k\u00fcld a br\u00f3ker visszaigazol\u00e1st:<\/p>\n<ul>\n<li>acks=0, nem k\u00fcld visszaigazol\u00e1st\n<\/li>\n<li>acks=1, visszaigazol\u00e1s \u00e9rkezik, miut\u00e1n a vezet\u0151 feljegyezte az \u00fczenetet a helyi napl\u00f3j\u00e1ba\n<\/li>\n<li>acks=all, visszaigazol\u00e1s \u00e9rkezik, miut\u00e1n az \u00f6sszes ISR replik\u00e1hoz elmentett\u00e9k az \u00fczenetet a helyi napl\u00f3kba<\/li>\n<\/ul>\n<p>\nA Kafka terminol\u00f3gi\u00e1j\u00e1ban, ha az ISR meg\u0151rizte az \u00fczenetet, akkor az \"elk\u00f6telez\u00e9s\" megt\u00f6rt\u00e9nik. Az Acks=all a legbiztons\u00e1gosabb lehet\u0151s\u00e9g, de ez tov\u00e1bbi k\u00e9sleltet\u00e9st is jelent. Vizsg\u00e1ljunk meg k\u00e9t p\u00e9lda le\u00e1ll\u00e1st, \u00e9s hogyan k\u00f6lcs\u00f6nhat\u00e1sba l\u00e9pnek a k\u00fcl\u00f6nb\u00f6z\u0151 \"acks\" opci\u00f3k az ISR fogalm\u00e1val.<\/p>\n<h3>Acks=1 \u00e9s ISR<\/h3>\n<p>\nEbben a p\u00e9ld\u00e1ban l\u00e1thatjuk, hogy ha a vezet\u0151 nem v\u00e1rja el, hogy minden k\u00f6vet\u0151 meg\u0151rizze az \u00fczenetet, akkor a vezet\u0151 hib\u00e1ja eset\u00e9n adatok elveszhetnek. Az \u00e1tv\u00e1lt\u00e1s nem szinkroniz\u00e1lt k\u00f6vet\u0151re enged\u00e9lyezhet\u0151 vagy letilthat\u00f3 a be\u00e1ll\u00edt\u00e1ssal. <i>unclean.leader.election.enable<\/i>.<\/p>\n<p>Ebben a p\u00e9ld\u00e1ban a gy\u00e1rt\u00f3nak az acks=1 \u00e9rt\u00e9ke van be\u00e1ll\u00edtva. A part\u00edci\u00f3 minden h\u00e1rom broker k\u00f6zt elosztva van. A 3-as broker lemaradt, nyolc m\u00e1sodperccel ezel\u0151tt szinkroniz\u00e1l\u00f3dott a vezet\u0151vel \u00e9s most 7456 \u00fczenettel lemaradt. Az 1-es broker mind\u00f6ssze egy m\u00e1sodpercet k\u00e9slekedett. A gy\u00e1rt\u00f3nk gyorsan visszakapja az ack-t, a lass\u00fa vagy halott k\u00f6vet\u0151k v\u00e1rakoz\u00e1sa n\u00e9lk\u00fcl, akit a vezet\u0151 nem v\u00e1r.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/f194e6309b732b772574392eff482a8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>7. \u00e1bra. ISR h\u00e1rom replik\u00e1val<\/i><\/p>\n<p>A 2-es broker le\u00e1ll, \u00e9s a gy\u00e1rt\u00f3 kapcsolati hib\u00e1t kap. Miut\u00e1n a vezet\u0151s\u00e9g a 1-es brokerre v\u00e1lt, 123 \u00fczenetet vesz\u00edt\u00fcnk el. Az 1-es broker k\u00f6vet\u0151je az ISR-ben volt, de nem szinkroniz\u00e1l\u00f3dott teljesen a vezet\u0151vel, amikor az le\u00e1llt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/367f219daebafefe585059f67fdedf6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>8. \u00e1bra. \u00dczenetek vesznek el a hib\u00e1k sor\u00e1n<\/i><\/p>\n<p>A konfigur\u00e1ci\u00f3ban <i>bootstrap.servers<\/i> a gy\u00e1rt\u00f3 t\u00f6bb brokert sorol fel, \u00e9s megk\u00e9rdezheti egy m\u00e1sik brokert, hogy ki lett az \u00faj part\u00edci\u00f3vezet\u0151. Ezut\u00e1n kapcsolatot l\u00e9tes\u00edt az 1-es brokerrel, \u00e9s folytatja az \u00fczenetek k\u00fcld\u00e9s\u00e9t.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/ba45c51f4ce1f63f10b2fa0e1487b223.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>9. \u00e1bra. Az \u00fczenetek k\u00fcld\u00e9se egy r\u00f6vid sz\u00fcnet ut\u00e1n \u00fajraindul<\/i><\/p>\n<p>A 3-as broker m\u00e9g ink\u00e1bb lemaradt. Lek\u00e9rdez\u00e9sek v\u00e9grehajt\u00e1s\u00e1ra k\u00e9pes, de nem tud szinkroniz\u00e1l\u00f3dni. Ennek oka lehet a brokers k\u00f6z\u00f6tti lass\u00fa h\u00e1l\u00f3zati kapcsolat, t\u00e1rol\u00e1si probl\u00e9ma stb. Az ISR-b\u0151l elt\u00e1vol\u00edtj\u00e1k. Most az ISR csup\u00e1n egy replik\u00e1b\u00f3l \u00e1ll \u2014 a vezet\u0151b\u0151l! A gy\u00e1rt\u00f3 tov\u00e1bbra is k\u00fcldi az \u00fczeneteket, \u00e9s megkapja a visszaigazol\u00e1sokat.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/592c74632e3a8d80c2b4fc15bde5d401.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>10. \u00e1bra. A 3-as broker k\u00f6vet\u0151je elt\u00e1vol\u00edtva az ISR-b\u0151l<\/i><\/p>\n<p>Az 1-es broker le\u00e1ll, \u00e9s a vezet\u0151 szerepe a 3-as brokerhez ker\u00fcl 15286 \u00fczenet vesztes\u00e9ggel! A gy\u00e1rt\u00f3 kapcsolati hib\u00e1t kap. Az ISR-en k\u00edv\u00fclre t\u00f6rt\u00e9n\u0151 v\u00e1lt\u00e1s csak a be\u00e1ll\u00edt\u00e1s miatt volt lehets\u00e9ges. <i>unclean.leader.election.enable=true<\/i>. Ha ez be van \u00e1ll\u00edtva <i>hamis<\/i>, akkor az \u00e1tv\u00e1lt\u00e1s nem t\u00f6rt\u00e9nt volna meg, \u00e9s minden olvas\u00e1si \u00e9s \u00edr\u00e1si k\u00e9r\u00e9s elutas\u00edt\u00e1sra ker\u00fclt volna. Ebben az esetben v\u00e1runk, hogy az 1-es broker visszat\u00e9rjen az \u00e9rintetlen adataival a replik\u00e1ban, amely \u00fajb\u00f3l \u00e1tveszi a vezet\u0151s\u00e9get.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/30f01ca715ccc194890ae061a3ef7396.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>11. \u00e1bra. Az 1-es broker le\u00e1ll. Nagy mennyis\u00e9g\u0171 \u00fczenet vesztes\u00e9g a hiba sor\u00e1n<\/i><\/p>\n<p>A gy\u00e1rt\u00f3 kapcsolatot l\u00e9tes\u00edt az utols\u00f3 br\u00f3kerrel, \u00e9s l\u00e1tja, hogy \u0151 most a r\u00e9szleg vezet\u0151je. \u00dczeneteket kezd k\u00fcldeni a 3. br\u00f3kernek.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/986532d9b22b6514b6039c8460b1beb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>12. \u00e1bra. R\u00f6vid sz\u00fcnet ut\u00e1n az \u00fczenetek ism\u00e9t a 0. r\u00e9szlegbe ker\u00fclnek.<\/i><\/p>\n<p>L\u00e1ttuk, hogy a gy\u00e1rt\u00f3 folyamatosan k\u00fcldte az \u00fczeneteket a r\u00f6vid megszak\u00edt\u00e1sok mellett, amikor \u00faj kapcsolatokat l\u00e9tes\u00edtettek \u00e9s \u00faj vezet\u0151t kerestek. Ez a konfigur\u00e1ci\u00f3 a rendelkez\u00e9sre \u00e1ll\u00e1st biztos\u00edtja az \u00f6sszhang fenntart\u00e1s\u00e1val (adatbiztons\u00e1g). A Kafka ezer \u00fczenetet vesztett, de tov\u00e1bbra is \u00faj bejegyz\u00e9seket fogadott.<\/p>\n<h3>Acks=all \u00e9s ISR<\/h3>\n<p>\nIsm\u00e9telj\u00fck meg ezt a forgat\u00f3k\u00f6nyvet, de <i>acks=all<\/i>. A 3. br\u00f3ker k\u00e9sleked\u00e9se \u00e1tlagosan n\u00e9gy m\u00e1sodperc. A gy\u00e1rt\u00f3 \u00fczenetet k\u00fcld <i>acks=all<\/i>, \u00e9s most nem kap gyors v\u00e1laszt. A vezet\u0151 v\u00e1r arra, hogy az \u00fczenetet az \u00f6sszes replik\u00e1i az ISR-ben elments\u00e9k.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/95b1abdc92e699f7bc41ebab249a2e08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>13. \u00e1bra. ISR h\u00e1rom replik\u00e1val. Az egyik lassan m\u0171k\u00f6dik, ami \u00edr\u00e1si k\u00e9sleked\u00e9st eredm\u00e9nyez.<\/i><\/p>\n<p>N\u00e9gy m\u00e1sodpercnyi tov\u00e1bbi k\u00e9sleked\u00e9s ut\u00e1n a 2. br\u00f3ker ack-t k\u00fcld. Minden replika most teljesen friss\u00edtve van.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/64356dc8d2641a3e22947126dd047f39.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>14. \u00e1bra. Minden replika menti az \u00fczeneteket \u00e9s ack-t k\u00fcld.<\/i><\/p>\n<p>A 3. br\u00f3ker most m\u00e9g jobban lemarad, \u00e9s t\u00f6rlik az ISR-b\u0151l. A k\u00e9sleked\u00e9s jelent\u0151sen cs\u00f6kken, mivel az ISR-b\u0151l elt\u0171ntek a lass\u00fa replik\u00e1k. A 2. br\u00f3ker most csak az 1. br\u00f3kerre v\u00e1r, amelynek \u00e1tlagos k\u00e9sleked\u00e9se 500 ms.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/5d3bd67dc53cb868fa40b358ed483a1d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>15. \u00e1bra. A 3. br\u00f3ker replik\u00e1ja t\u00f6rl\u00e9sre ker\u00fcl az ISR-b\u0151l.<\/i><\/p>\n<p>Ezut\u00e1n a 2. br\u00f3ker \u00f6sszeomlik, \u00e9s a vezet\u00e9s az 1. br\u00f3kerre sz\u00e1ll \u00e1t an\u00e9lk\u00fcl, hogy \u00fczenetek veszn\u00e9nek el.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/e3f0417aa7714ea5eae8a8e8d61662bd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>16. \u00e1bra. A 2. br\u00f3ker \u00f6sszeomlik.<\/i><\/p>\n<p>A gy\u00e1rt\u00f3 \u00faj vezet\u0151t tal\u00e1l, \u00e9s elkezd \u00fczeneteket k\u00fcldeni neki. A k\u00e9sleked\u00e9s tov\u00e1bb cs\u00f6kken, mivel most az ISR egy replik\u00e1b\u00f3l \u00e1ll! Ez\u00e9rt a be\u00e1ll\u00edt\u00e1s <i>acks=all<\/i> nem ad redundanci\u00e1t.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/fec9aae9977757d5f61c2909ceae0536.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>17. \u00e1bra. A 1. br\u00f3ker replik\u00e1ja a vezet\u00e9st veszi \u00e1t \u00fczenetek elveszt\u00e9se n\u00e9lk\u00fcl.<\/i><\/p>\n<p>Ezut\u00e1n a 1. br\u00f3ker \u00f6sszeomlik, \u00e9s a vezet\u00e9s a 3. br\u00f3kerre sz\u00e1ll \u00e1t, 14238 \u00fczenet elveszt\u00e9s\u00e9vel!<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/730b3951fb75ab3a782fc6d064615212.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>18. \u00e1bra. A 1. br\u00f3ker meghal, \u00e9s a nem tiszta be\u00e1ll\u00edt\u00e1ssal t\u00f6rt\u00e9n\u0151 vezet\u00e9sv\u00e1lt\u00e1s kiterjedt adatok elveszt\u00e9s\u00e9t okozza.<\/i><\/p>\n<p>Nem kellett volna be\u00e1ll\u00edtanunk a be\u00e1ll\u00edt\u00e1st <i>unclean.leader.election.enable<\/i> az \u00e9rt\u00e9kre <i>igaz<\/i>. Alap\u00e9rtelmez\u00e9s szerint ez <i>hamis<\/i>. A be\u00e1ll\u00edt\u00e1s <i>acks=all<\/i> a <i>unclean.leader.election.enable=true<\/i> biztos\u00edtja a rendelkez\u00e9sre \u00e1ll\u00e1st n\u00e9mi tov\u00e1bbi adatbiztons\u00e1ggal. De, ahogy l\u00e1tod, m\u00e9g mindig elvesz\u00edthet\u00fcnk \u00fczeneteket.<\/p>\n<p>De mi van, ha n\u00f6velni akarjuk az adatok biztons\u00e1g\u00e1t? Be\u00e1ll\u00edthatjuk a <i>unclean.leader.election.enable = false<\/i>, de ez nem felt\u00e9tlen\u00fcl v\u00e9d meg minket az adatveszt\u00e9st\u0151l. Ha a vezet\u0151 hirtelen le\u00e1ll, \u00e9s vele egy\u00fctt az adatok is elt\u0171nnek, akkor az \u00fczenetek tov\u00e1bbra is elvesznek, \u00e9s hozz\u00e1f\u00e9rhetetlenn\u00e9 v\u00e1lnak, am\u00edg az adminisztr\u00e1tor helyre nem \u00e1ll\u00edtja a helyzetet.<\/p>\n<p>Jobb biztos\u00edtani az \u00f6sszes \u00fczenet redundanci\u00e1j\u00e1t, ellenkez\u0151 esetben \u00e9rdemes lemondani a feljegyz\u00e9sr\u0151l. \u00cdgy legal\u00e1bb a br\u00f3ker szempontj\u00e1b\u00f3l az adatveszt\u00e9s lehet\u0151s\u00e9ge csak k\u00e9t vagy t\u00f6bb egyidej\u0171 hiba eset\u00e9n mer\u00fcl fel.<\/p>\n<h3>Acks=all, min.insync.replicas \u00e9s ISR<\/h3>\n<p>\nA t\u00e9ma konfigur\u00e1ci\u00f3ja <i>min.insync.replicas<\/i> n\u00f6velj\u00fck az adatok biztons\u00e1gi szintj\u00e9t. N\u00e9zz\u00fck \u00e1t \u00fajra a m\u00faltbeli forgat\u00f3k\u00f6nyv utols\u00f3 r\u00e9sz\u00e9t, de ez\u00fattal <i>min.insync.replicas=2<\/i>.<\/p>\n<p>Teh\u00e1t a 2. br\u00f3kernek van egy replika vezet\u0151je, m\u00edg a k\u00f6vet\u0151 a 3. br\u00f3kerb\u0151l ki lett z\u00e1rva az ISR-b\u0151l.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/5831463293f1837d3232756894e97162.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>19. \u00e1bra. ISR k\u00e9t replik\u00e1val<\/i><\/p>\n<p>A 2. br\u00f3ker le\u00e1ll, a vezet\u00e9s \u00e1tker\u00fcl az 1. br\u00f3kerhez an\u00e9lk\u00fcl, hogy \u00fczenetek veszedelmesen elt\u0171nn\u00e9nek. De most az ISR csak egy replik\u00e1t tartalmaz. Ez nem felel meg a minim\u00e1lis k\u00f6vetelm\u00e9nynek a feljegyz\u00e9sek megszerz\u00e9s\u00e9re, ez\u00e9rt a br\u00f3ker hib\u00e1t jelez a feljegyz\u00e9si k\u00eds\u00e9rlet sor\u00e1n. <i>NotEnoughReplicas<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/6b2ee477f4c33ec84f3068b792814e5d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>20. \u00e1bra. Az ISR sz\u00e1ma egyel alacsonyabb, mint amit a min.insync.replicas megad.<\/i><\/p>\n<p>Ez a konfigur\u00e1ci\u00f3 a rendelkez\u00e9sre \u00e1ll\u00e1st az \u00f6sszef\u00e9rhet\u0151s\u00e9g \u00e9rdek\u00e9ben \u00e1ldozza fel. Miel\u0151tt meger\u0151s\u00edten\u00e9nk az \u00fczenetet, biztos\u00edtjuk, hogy legal\u00e1bb k\u00e9t replik\u00e1ra r\u00f6gz\u00edtve legyen. Ez sokkal nagyobb bizalmat ad a gy\u00e1rt\u00f3nak. Itt az \u00fczenetek veszt\u00e9se csak abban az esetben lehets\u00e9ges, ha k\u00e9t replika egy id\u0151ben meghib\u00e1sodik egy r\u00f6vid id\u0151intervallumban, m\u00edg az \u00fczenet nem lett replik\u00e1lva egy tov\u00e1bbi k\u00f6vet\u0151re, ami val\u00f3sz\u00edn\u0171tlen. De ha szuperparanoid vagy, be\u00e1ll\u00edthatod az 5-\u00f6s replik\u00e1ci\u00f3s ar\u00e1nyt, \u00e9s <i>min.insync.replicas<\/i> 3-ra. Itt egyszerre h\u00e1rom br\u00f3kernak kellene le\u00e1llnia az adatveszt\u00e9shez! Term\u00e9szetesen az ilyen megb\u00edzhat\u00f3s\u00e1g\u00e9rt extra k\u00e9s\u00e9ssel fizetsz.<\/p>\n<h1>Amikor a rendelkez\u00e9sre \u00e1ll\u00e1s sz\u00fcks\u00e9ges az adatok biztons\u00e1g\u00e1hoz<\/h1>\n<p>\nMint a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">a RabbitMQ eset\u00e9ben<\/a><\/noindex>, n\u00e9ha a rendelkez\u00e9sre \u00e1ll\u00e1s sz\u00fcks\u00e9ges az adatok biztons\u00e1g\u00e1hoz. Ezen \u00e9rdemes elgondolkodni:<\/p>\n<ul>\n<li>Visszaadhat-e a kiad\u00f3 egyszer\u0171en hib\u00e1t, \u00e9s a felette \u00e1ll\u00f3 szolg\u00e1ltat\u00e1s vagy felhaszn\u00e1l\u00f3 k\u00e9s\u0151bb megpr\u00f3b\u00e1lhatja \u00fajra?\n<\/li>\n<li>Visszatarthat-e a kiad\u00f3 egy \u00fczenetet helyben, vagy az adatb\u00e1zisban, hogy k\u00e9s\u0151bb \u00fajrapr\u00f3b\u00e1lkozzon?<\/li>\n<\/ul>\n<p>\nHa a v\u00e1lasz negat\u00edv, akkor a rendelkez\u00e9sre \u00e1ll\u00e1s optimaliz\u00e1l\u00e1sa n\u00f6veli az adatok biztons\u00e1g\u00e1t. Kevesebb adatot fogsz vesz\u00edteni, ha a rendelkez\u00e9sre \u00e1ll\u00e1st v\u00e1lasztod a feljegyz\u00e9st\u0151l val\u00f3 lemond\u00e1s helyett. \u00cdgy minden a kiegyens\u00falyoz\u00e1s keres\u00e9s\u00e9re vezethet\u0151 vissza, \u00e9s a megold\u00e1s a konkr\u00e9t helyzett\u0151l f\u00fcgg.<\/p>\n<h1>Az ISR \u00e9rtelme<\/h1>\n<p>\nAz ISR be\u00e1ll\u00edt\u00e1s lehet\u0151v\u00e9 teszi az optim\u00e1lis egyens\u00faly kiv\u00e1laszt\u00e1s\u00e1t az adatok biztons\u00e1ga \u00e9s a k\u00e9sleltet\u00e9s k\u00f6z\u00f6tt. P\u00e9ld\u00e1ul biztos\u00edtja a rendelkez\u00e9sre \u00e1ll\u00e1st a t\u00f6bbsz\u00f6r\u00f6s replik\u00e1k hib\u00e1ja eset\u00e9n, minimaliz\u00e1lva a halott vagy lass\u00fa replik\u00e1k k\u00e9sleltet\u00e9sre gyakorolt hat\u00e1s\u00e1t.<\/p>\n<p>Mi magunk v\u00e1lasztjuk ki az \u00e9rt\u00e9ket <i>replica.lag.time.max.ms<\/i> az ig\u00e9nyeinknek megfelel\u0151en. L\u00e9nyeg\u00e9ben ez a param\u00e9ter azt jelenti, hogy mekkora k\u00e9sleltet\u00e9st hajland\u00f3k vagyunk elviselni <i>acks=all<\/i>. Az alap\u00e9rtelmezett \u00e9rt\u00e9k t\u00edz m\u00e1sodperc. Ha ez t\u00fal hossz\u00fa a sz\u00e1motokra, cs\u00f6kkenthetitek. Ekkor n\u00f6vekedni fog az ISR v\u00e1ltoz\u00e1sok frequenci\u00e1ja, mivel a k\u00f6vet\u0151k gyakrabban lesznek elt\u00e1vol\u00edtva \u00e9s hozz\u00e1adva.<\/p>\n<p>A RabbitMQ eset\u00e9ben egyszer\u0171 t\u00fck\u00f6rhalmazok vannak, amelyeket replik\u00e1lni kell. A lass\u00fa t\u00fckr\u00f6k tov\u00e1bbi k\u00e9sleltet\u00e9st okoznak, a halott t\u00fckr\u00f6k v\u00e1lasz\u00e1ra pedig a csomagok \u00e9lettartam\u00e1nak lej\u00e1rt\u00e1ig kell v\u00e1rni, amelyek ellen\u0151rzik minden csom\u00f3pont el\u00e9rhet\u0151s\u00e9g\u00e9t (net tick). Az ISR \u00e9rdekes m\u00f3dja annak, hogy elker\u00fclj\u00fck ezeket a k\u00e9sleltet\u00e9si probl\u00e9m\u00e1kat. De kock\u00e1ztatjuk a f\u00f6l\u00f6sleg elveszt\u00e9s\u00e9t, mivel az ISR csak a vezet\u0151re cs\u00f6kkenthet\u0151. E kock\u00e1zat elker\u00fcl\u00e9se \u00e9rdek\u00e9ben haszn\u00e1lja a k\u00f6vetkez\u0151 be\u00e1ll\u00edt\u00e1st. <i>min.insync.replicas<\/i>.<\/p>\n<h1>Az \u00fcgyfelek csatlakoz\u00e1si garanci\u00e1ja<\/h1>\n<p>\nA be\u00e1ll\u00edt\u00e1sokban <i>bootstrap.servers<\/i> a gy\u00e1rt\u00f3 \u00e9s a fogyaszt\u00f3 sz\u00e1m\u00e1ra t\u00f6bb br\u00f3kert megadhatunk az \u00fcgyfelek csatlakoztat\u00e1s\u00e1ra. Az \u00f6tlet az, hogy ha az egyik csom\u00f3pont lekapcsol, t\u00f6bb tartal\u00e9k marad, amellyel az \u00fcgyf\u00e9l kapcsolatot tud l\u00e9tes\u00edteni. Ezek nem felt\u00e9tlen\u00fcl a particion\u00e1l\u00e1s vezet\u0151i, hanem egyszer\u0171en egy l\u00e9p\u00e9s a kezdeti bet\u00f6lt\u00e9shez. Az \u00fcgyf\u00e9l megk\u00e9rdezheti \u0151ket, hogy melyik csom\u00f3ponton tal\u00e1lhat\u00f3 a partici\u00f3 vezet\u0151je az olvas\u00e1shoz\/\u00edr\u00e1shoz.<\/p>\n<p>A RabbitMQ-ban az \u00fcgyfelek b\u00e1rmely csom\u00f3ponthoz csatlakozhatnak, \u00e9s a bels\u0151 ir\u00e1ny\u00edt\u00e1s a k\u00e9r\u00e9seket a megfelel\u0151 helyre k\u00fcldi. Ez azt jelenti, hogy a RabbitMQ el\u00e9 terhel\u00e9seloszt\u00f3t \u00e1ll\u00edthatsz. A Kafka megk\u00f6veteli, hogy az \u00fcgyfelek kifejezetten ahhoz a csom\u00f3ponthoz csatlakozzanak, ahol a megfelel\u0151 partici\u00f3 vezet\u0151je van. Ilyen helyzetben nem lehet terhel\u00e9seloszt\u00f3t alkalmazni. A lista <i>bootstrap.servers<\/i> kritikus fontoss\u00e1g\u00fa, hogy az \u00fcgyfelek el\u00e9rhess\u00e9k a sz\u00fcks\u00e9ges csom\u00f3pontokat \u00e9s megtal\u00e1lj\u00e1k \u0151ket hiba eset\u00e9n.<\/p>\n<h1>A Kafka konszenzus architekt\u00far\u00e1ja<\/h1>\n<p>\nEddig nem t\u00e1rgyaltuk, hogyan tud a klaszter a br\u00f3ker le\u00e1ll\u00e1s\u00e1r\u00f3l, \u00e9s hogyan v\u00e1lasztanak \u00faj vezet\u0151t. A Kafka h\u00e1l\u00f3zati sz\u00e9tv\u00e1laszt\u00e1sokkal kapcsolatos m\u0171k\u00f6d\u00e9s\u00e9nek meg\u00e9rt\u00e9s\u00e9hez el\u0151sz\u00f6r meg kell \u00e9rten\u00fcnk a konszenzus architekt\u00far\u00e1j\u00e1t.<\/p>\n<p>Minden Kafka klasztert egy\u00fctt telep\u00edtenek a Zookeeper klaszterrel \u2014 ez egy elosztott konszenzus szolg\u00e1ltat\u00e1s, amely lehet\u0151v\u00e9 teszi a rendszer sz\u00e1m\u00e1ra, hogy el\u00e9rje a konszenzust egy adott \u00e1llapotban, priorit\u00e1st adva a konzisztenci\u00e1nak a rendelkez\u00e9sre \u00e1ll\u00e1ssal szemben. Az olvas\u00e1si \u00e9s \u00edr\u00e1si m\u0171veletek j\u00f3v\u00e1hagy\u00e1s\u00e1hoz a Zookeeper t\u00f6bbs\u00e9gi egyet\u00e9rt\u00e9se sz\u00fcks\u00e9ges.<\/p>\n<p>A Zookeeper t\u00e1rolja a klaszter \u00e1llapot\u00e1t:<\/p>\n<ul>\n<li>A t\u00e9m\u00e1k, part\u00edci\u00f3k list\u00e1ja, a konfigur\u00e1ci\u00f3, a jelenlegi vezet\u0151 p\u00e9ld\u00e1nyok, a prefer\u00e1lt p\u00e9ld\u00e1nyok.\n<\/li>\n<li>A klaszter tagjai. Minden broker pingelni a Zookeeper klasztert. Ha az nem kap pinget egy adott id\u0151tartamon bel\u00fcl, a Zookeeper a brokert el\u00e9rhetetlennek jel\u00f6li.\n<\/li>\n<li>A vez\u00e9rl\u0151 f\u0151 \u00e9s tartal\u00e9k csom\u00f3pontjainak kiv\u00e1laszt\u00e1sa.<\/li>\n<\/ul>\n<p>\nA vez\u00e9rl\u0151 csom\u00f3pont egy Kafka broker, amely a p\u00e9ld\u00e1nyok vezet\u0151inek megv\u00e1laszt\u00e1s\u00e1\u00e9rt felel\u0151s. A Zookeeper \u00e9rtes\u00edt\u00e9seket k\u00fcld a vez\u00e9rl\u0151nek a klaszter tags\u00e1g\u00e1r\u00f3l \u00e9s a t\u00e9ma v\u00e1ltoz\u00e1sair\u00f3l, \u00e9s a vez\u00e9rl\u0151nek ezek szerint kell cselekednie.<\/p>\n<p>P\u00e9ld\u00e1ul vegy\u00fcnk egy \u00faj t\u00e9m\u00e1t t\u00edz part\u00edci\u00f3val \u00e9s 3-as replik\u00e1ci\u00f3s t\u00e9nyez\u0151vel. A vez\u00e9rl\u0151nek ki kell v\u00e1lasztania minden part\u00edci\u00f3 vezet\u0151j\u00e9t, mik\u00f6zben optim\u00e1lisan kell elosztania a vezet\u0151ket a broker-ek k\u00f6z\u00f6tt. <\/p>\n<p>Minden part\u00edci\u00f3 eset\u00e9ben a vez\u00e9rl\u0151:<\/p>\n<ul>\n<li>friss\u00edti a Zookeeper-ben az ISR \u00e9s vezet\u0151 inform\u00e1ci\u00f3kat;\n<\/li>\n<li>minden broker-nek, amely ezt a part\u00edci\u00f3t replik\u00e1lja, megk\u00fcldi a LeaderAndISRCommand parancsot, \u00e9rtes\u00edtve a broker-eket az ISR-r\u0151l \u00e9s a vezet\u0151r\u0151l.<\/li>\n<\/ul>\n<p>\nAmikor a vezet\u0151 broker le\u00e1ll, a Zookeeper \u00e9rtes\u00edt\u00e9st k\u00fcld a vez\u00e9rl\u0151nek, aki kiv\u00e1laszt egy \u00faj vezet\u0151t. A vez\u00e9rl\u0151 el\u0151sz\u00f6r friss\u00edti a Zookeeper-t, majd parancsot k\u00fcld minden brokernek, \u00e9rtes\u00edtve \u0151ket a vezet\u0151s\u00e9g v\u00e1ltoz\u00e1s\u00e1r\u00f3l.<\/p>\n<p>Minden vezet\u0151 felel\u0151s az ISR halmaz\u00e9rt. A konfigur\u00e1l\u00e1s <i>replica.lag.time.max.ms<\/i> meghat\u00e1rozza, hogy ki ker\u00fcl oda. Az ISR v\u00e1ltoz\u00e1sa eset\u00e9n a vezet\u0151 \u00faj inform\u00e1ci\u00f3kat ad \u00e1t a Zookeeper-nek.<\/p>\n<p>A Zookeeper mindig t\u00e1j\u00e9koztatva van minden v\u00e1ltoz\u00e1sr\u00f3l, \u00edgy ha hiba l\u00e9p fel, a vezet\u00e9s z\u00f6kken\u0151mentesen \u00e1tv\u00e1lt az \u00faj vezet\u0151re.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/3adb1d204b28e3ed85bef3530fa2b738.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>21. \u00e1bra. Kafka konszenzus<\/i><\/p>\n<h1>Replik\u00e1ci\u00f3s protokoll<\/h1>\n<p>\nA replik\u00e1ci\u00f3 r\u00e9szleteinek meg\u00e9rt\u00e9se seg\u00edt jobban meg\u00e9rteni a potenci\u00e1lis adatveszt\u00e9si forgat\u00f3k\u00f6nyveket.<\/p>\n<h3>Lek\u00e9rdez\u00e9sek, Log End Offset (LEO) \u00e9s Highwater Mark (HW)<\/h3>\n<p>\nMegvizsg\u00e1ltuk, hogy a k\u00f6vet\u0151k id\u0151nk\u00e9nt lek\u00e9rdez\u00e9seket k\u00fcldenek a vezet\u0151nek. Az alap\u00e9rtelmezett intervallum 500 ms. Ez elt\u00e9r a RabbitMQ-t\u00f3l, ahol a replik\u00e1l\u00e1s nem a v\u00e1laszsor t\u00fck\u00f6r, hanem a mester \u00e1ltali kezdem\u00e9nyez\u00e9s alapj\u00e1n t\u00f6rt\u00e9nik. A mester nyomja a v\u00e1ltoz\u00e1sokat a t\u00fckr\u00f6kre.<\/p>\n<p>A vezet\u0151 \u00e9s minden k\u00f6vet\u0151 t\u00e1rolja a napl\u00f3 v\u00e9g\u00e9nek eltol\u00f3d\u00e1s\u00e1t (Log End Offset, LEO) \u00e9s a Highwater c\u00edmk\u00e9t (HW). Az LEO c\u00edmke t\u00e1rolja az utols\u00f3 \u00fczenet eltol\u00f3d\u00e1s\u00e1t a helyi replik\u00e1ban, m\u00edg a HW az utols\u00f3 commit eltol\u00f3d\u00e1s\u00e1t. Ne feledje, hogy a \"commit\" st\u00e1tuszhoz a \u00fczenetet minden replik\u00e1ba el kell menteni az ISR-ben. Ez azt jelenti, hogy az LEO \u00e1ltal\u00e1ban egy kicsit megel\u0151zi a HW-t.<\/p>\n<p>Amikor a vezet\u0151 \u00fczenetet kap, azt helyben t\u00e1rolja. A k\u00f6vet\u0151 lek\u00e9rdez\u00e9st k\u00fcld, \u00e1tadva a saj\u00e1t LEO-j\u00e1t. Ezt k\u00f6vet\u0151en a vezet\u0151 \u00fczenetcsomagot k\u00fcld, kezdve ezzel a LEO-val, \u00e9s \u00e1tadja a jelenlegi HW-t. Amikor a vezet\u0151 \u00e9rtes\u00edt\u00e9st kap, hogy minden replik\u00e1tor elt\u00e1rolta az \u00fczenetet a megadott eltol\u00f3d\u00e1ssal, \u00e1thelyezi a HW c\u00edmk\u00e9t. Csak a vezet\u0151 k\u00e9pes \u00e1thelyezni a HW-t, \u00edgy minden k\u00f6vet\u0151 megtudja a jelenlegi \u00e9rt\u00e9ket a lek\u00e9rdez\u00e9seik v\u00e1laszaiban. Ez azt jelenti, hogy a k\u00f6vet\u0151k lemaradhatnak a vezet\u0151t\u0151l mind \u00fczenetekben, mind a HW tud\u00e1s\u00e1val kapcsolatban. A fogyaszt\u00f3k csak a jelenlegi HW-ig kapj\u00e1k meg az \u00fczeneteket.<\/p>\n<p>Figyeljen arra, hogy a \"t\u00e1rolt\" (persisted) az mem\u00f3ri\u00e1ba \u00edrt, nem pedig lemezen t\u00e1rolt. A teljes\u00edtm\u00e9ny \u00e9rdek\u00e9ben a Kafka el\u0151re meghat\u00e1rozott id\u0151k\u00f6z\u00f6nk\u00e9nt szinkroniz\u00e1l a lemezen. A RabbitMQ-nak is van egy ilyen id\u0151k\u00f6ze, de csak akkor k\u00fcld vissza meger\u0151s\u00edt\u00e9st a publik\u00e1l\u00f3nak, amikor a mester \u00e9s minden t\u00fck\u00f6r lemezre \u00edrta az \u00fczenetet. A Kafka fejleszt\u0151i a teljes\u00edtm\u00e9ny \u00e9rdek\u00e9ben \u00fagy d\u00f6nt\u00f6ttek, hogy az \u00fczenet mem\u00f3ri\u00e1ba \u00edr\u00e1sakor azonnal visszak\u00fcldik az ack-t. A Kafka arra j\u00e1tszik, hogy a redundancia kompenz\u00e1lja a kock\u00e1zatot, hogy a meger\u0151s\u00edtett \u00fczenetek r\u00f6vid t\u00e1von csak mem\u00f3ri\u00e1ban t\u00e1rol\u00f3djanak.<\/p>\n<h1>Vezet\u0151 le\u00e1ll\u00e1s<\/h1>\n<p>\nAmikor a vezet\u0151 meghib\u00e1sodik, a Zookeeper \u00e9rtes\u00edti a vez\u00e9rl\u0151t, amely ezt k\u00f6vet\u0151en kiv\u00e1laszt egy \u00faj vezet\u0151 replik\u00e1t. Az \u00faj vezet\u0151 be\u00e1ll\u00edt egy \u00faj HW c\u00edmk\u00e9t a saj\u00e1t LEO-j\u00e1hoz k\u00e9pest. Ezt k\u00f6vet\u0151en a k\u00f6vet\u0151k \u00e9rtes\u00edt\u00e9st kapnak az \u00faj vezet\u0151r\u0151l. A Kafka verzi\u00f3j\u00e1t\u00f3l f\u00fcgg\u0151en a k\u00f6vet\u0151 k\u00e9t forgat\u00f3k\u00f6nyv k\u00f6z\u00fcl v\u00e1laszt:<\/p>\n<ol>\n<li>Megszor\u00edtja a helyi napl\u00f3t a megismert HW-ig, \u00e9s a \u00faj vezet\u0151nek \u00fczenetlek\u00e9rdez\u00e9st k\u00fcld az ezen c\u00edmke ut\u00e1ni \u00fczenetekre.\n<\/li>\n<li>K\u00fcldj\u00f6n egy k\u00e9r\u00e9st a vezet\u0151nek, hogy megtudja a HW-t a vezet\u0151v\u00e9 v\u00e1laszt\u00e1s\u00e1nak id\u0151pontj\u00e1ban, majd v\u00e1gja vissza a napl\u00f3t erre az eltol\u00e1sra. Ezut\u00e1n elkezd peri\u00f3dikus k\u00e9r\u00e9seket v\u00e9gezni a mintav\u00e9telez\u00e9sre, kezdve ezzel az eltol\u00e1ssal.<\/li>\n<\/ol>\n<p>\nA k\u00f6vet\u0151nek vissza kell v\u00e1gnia a napl\u00f3t az al\u00e1bbi okok miatt:<\/p>\n<ul>\n<li>Amikor a vezet\u0151 meghib\u00e1sodik, az ISR k\u00e9szletb\u0151l az els\u0151 k\u00f6vet\u0151, aki be van jegyezve a Zookeeperbe, megnyeri a v\u00e1laszt\u00e1sokat \u00e9s vezet\u0151v\u00e9 v\u00e1lik. Minden k\u00f6vet\u0151 az ISR-ben, noha 'szinkroniz\u00e1ltak', nem biztos, hogy a volt vezet\u0151t\u0151l megkapt\u00e1k az \u00f6sszes \u00fczenet m\u00e1solat\u00e1t. Teljesen lehets\u00e9ges, hogy a v\u00e1lasztott k\u00f6vet\u0151nek nincs a legfrissebb m\u00e1solata. A Kafka garant\u00e1lja, hogy a replik\u00e1k k\u00f6z\u00f6tt nincs elt\u00e9r\u00e9s. \u00cdgy a k\u00fcl\u00f6nbs\u00e9gek elker\u00fcl\u00e9se \u00e9rdek\u00e9ben minden k\u00f6vet\u0151nek vissza kell v\u00e1gnia a napl\u00f3j\u00e1t az \u00faj vezet\u0151 HW \u00e9rt\u00e9k\u00e9ig a vezet\u0151v\u00e9 v\u00e1laszt\u00e1s\u00e1nak id\u0151pontj\u00e1ban. Ez egy \u00fajabb oka annak, hogy a konfigur\u00e1l\u00e1s <i>acks=all<\/i> ennyire fontos a konzisztencia szempontj\u00e1b\u00f3l.\n<\/li>\n<li>Az \u00fczenetek id\u0151szakonk\u00e9nt le\u00edr\u00f3dnak a lemezekre. Ha a klaszter \u00f6sszes csom\u00f3pontja egyszerre hib\u00e1sodott meg, akkor a lemezeken elt\u00e9r\u0151 eltol\u00e1sokkal rendelkez\u0151 replik\u00e1k maradnak. Teljesen lehets\u00e9ges, hogy amikor a br\u00f3kerek visszat\u00e9rnek a h\u00e1l\u00f3zatba, az \u00faj vezet\u0151, akit v\u00e1lasztanak, lemarad a k\u00f6vet\u0151kt\u0151l, mert \u0151 kor\u00e1bban t\u00e1rolta a lemezen az adatokat.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00dajra csatlakoz\u00e1s a klaszterhez<\/h3>\n<p>\n\u00dajra csatlakoz\u00e1skor a replik\u00e1k ugyanolyan m\u00f3don l\u00e9pnek be, mint a vezet\u0151 meghib\u00e1sod\u00e1sakor: ellen\u0151rzik a vezet\u0151 replik\u00e1j\u00e1t \u00e9s visszav\u00e1gj\u00e1k a napl\u00f3jukat a HW-j\u00e1hoz (a v\u00e1laszt\u00e1s id\u0151pontj\u00e1ban). \u00d6sszehasonl\u00edt\u00e1sk\u00e9ppen, a RabbitMQ a csatlakozott csom\u00f3pontokat teljesen \u00fajk\u00e9nt kezeli. Mindk\u00e9t esetben a br\u00f3ker elveti az \u00f6sszes megl\u00e9v\u0151 \u00e1llapotot. Ha automatikus szinkroniz\u00e1l\u00e1s t\u00f6rt\u00e9nik, akkor a mesternek minden jelenlegi tartalmat teljesen replik\u00e1lnia kell az \u00faj t\u00fck\u00f6rbe, 'ja, hogy a vil\u00e1g v\u00e1rjon'. Ezen m\u0171velet sor\u00e1n a mester nem fogad el olvas\u00e1si vagy \u00edr\u00e1si m\u0171veleteket. Ez a megk\u00f6zel\u00edt\u00e9s probl\u00e9m\u00e1kat okoz nagy sorok eset\u00e9n.<\/p>\n<p>A Kafka \u2014 egy elosztott napl\u00f3, \u00e9s \u00f6sszess\u00e9g\u00e9ben t\u00f6bb \u00fczenetet t\u00e1rol, mint a RabbitMQ sor, ahol az adatok elt\u00e1vol\u00edt\u00e1sra ker\u00fclnek a sorb\u00f3l, miut\u00e1n el lettek olvasva. Az akt\u00edv soroknak viszonylag kicsiknek kell maradniuk. De a Kafka egy olyan napl\u00f3, amely saj\u00e1t t\u00e1rol\u00e1si politik\u00e1val rendelkezik, amely napok vagy hetek id\u0151tartamot \u00e1ll\u00edthat be. A sor z\u00e1rol\u00e1si \u00e9s teljes szinkroniz\u00e1ci\u00f3s megk\u00f6zel\u00edt\u00e9se teljesen elfogadhatatlan egy elosztott napl\u00f3 eset\u00e9ben. Ehelyett a Kafka k\u00f6vet\u0151i egyszer\u0171en lev\u00e1gj\u00e1k a napl\u00f3jukat a HW vezet\u0151h\u00f6z (az \u0151 megv\u00e1laszt\u00e1s\u00e1nak id\u0151pontj\u00e1ban), ha a m\u00e1solatuk megel\u0151zi a vezet\u0151t. A val\u00f3sz\u00edn\u0171bb esetben, amikor a k\u00f6vet\u0151 lemarad, egyszer\u0171en lek\u00e9rdez\u00e9seket kezdenek v\u00e9gezni, kezdve a jelenlegi LEO-jukt\u00f3l.<\/p>\n<p>Az \u00faj vagy \u00fajraegyes\u00edtett k\u00f6vet\u0151k az ISR-en k\u00edv\u00fcl kezdik, \u00e9s nem vesznek r\u00e9szt a commitokban. Egyszer\u0171en a csoport mellett dolgoznak, \u00e9s gyorsan kapj\u00e1k az \u00fczeneteket, am\u00edg be nem \u00e9rnek a vezet\u0151h\u00f6z \u00e9s be nem l\u00e9pnek az ISR-be. Itt nincs z\u00e1rol\u00e1s, \u00e9s nem sz\u00fcks\u00e9ges minden adatokat eldobni.<\/p>\n<h1>Konzisztencia megs\u00e9rt\u00e9se<\/h1>\n<p>\nA Kafka t\u00f6bb komponenssel rendelkezik, mint a RabbitMQ, ez\u00e9rt itt bonyolultabb viselked\u00e9sek figyelhet\u0151k meg, amikor a klaszterben megszakad a kapcsolat. De a Kafka-t alapvet\u0151en klaszterek sz\u00e1m\u00e1ra tervezt\u00e9k, \u00edgy a megold\u00e1sok nagyon j\u00f3l \u00e1tgondoltak.<\/p>\n<p>Az al\u00e1bbiakban n\u00e9h\u00e1ny kapcsolati megszak\u00edt\u00e1ssal kapcsolatos forgat\u00f3k\u00f6nyvet tal\u00e1l:<\/p>\n<ul>\n<li>Forgat\u00f3k\u00f6nyv 1. A k\u00f6vet\u0151 nem l\u00e1tja a vezet\u0151t, de m\u00e9g mindig l\u00e1tja a Zookeeper-t.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 2. A vezet\u0151 nem l\u00e1t egyetlen k\u00f6vet\u0151t sem, de m\u00e9g mindig l\u00e1tja a Zookeeper-t.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 3. A k\u00f6vet\u0151 l\u00e1tja a vezet\u0151t, de nem l\u00e1tja a Zookeeper-t.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 4. A vezet\u0151 l\u00e1tja a k\u00f6vet\u0151ket, de nem l\u00e1tja a Zookeeper-t.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 5. A k\u00f6vet\u0151 teljesen elk\u00fcl\u00f6n\u00fclt a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 6. A vezet\u0151 teljesen elk\u00fcl\u00f6n\u00fclt a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 7. A Kafka vez\u00e9rl\u0151 csom\u00f3pont a m\u00e1sik Kafka csom\u00f3pontot nem l\u00e1tja.\n<\/li>\n<li>Forgat\u00f3k\u00f6nyv 8. A Kafka vez\u00e9rl\u0151 nem l\u00e1tja a Zookeeper-t.<\/li>\n<\/ul>\n<p>\nMinden forgat\u00f3k\u00f6nyvhez saj\u00e1t viselked\u00e9s tartozik.<\/p>\n<h3>Forgat\u00f3k\u00f6nyv 1. A k\u00f6vet\u0151 nem l\u00e1tja a vezet\u0151t, de m\u00e9g mindig l\u00e1tja a Zookeeper-t.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/5f51ae679933b2b5a69e21831465d121.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 22. Forgat\u00f3k\u00f6nyv 1. ISR h\u00e1rom p\u00e9ld\u00e1nyb\u00f3l.<\/i><\/p>\n<p>A kapcsolat megszak\u00edt\u00e1sa a 3-as br\u00f3kert a 1-es \u00e9s 2-es br\u00f3kert\u0151l, de a Zookeeper-t\u0151l nem v\u00e1lasztja el. A 3-as br\u00f3ker t\u00f6bb\u00e9 nem tud lek\u00e9rdez\u00e9seket v\u00e9gezni. Az id\u0151 letelt\u00e9vel. <i>replica.lag.time.max.ms<\/i> Elt\u00e1vol\u00edtj\u00e1k az ISR-b\u0151l \u00e9s nem vesz r\u00e9szt az \u00fczenetek elk\u00f6telez\u00e9s\u00e9ben. Amint a kapcsolat helyre\u00e1ll, \u00fajra megkezdi a lek\u00e9rdez\u00e9seket \u00e9s csatlakozik az ISR-hez, amikor utol\u00e9ri a vezet\u0151t. A Zookeeper tov\u00e1bbra is kapja a pingeket, \u00e9s azt hiszi, hogy a br\u00f3ker \u00e9l \u00e9s eg\u00e9szs\u00e9ges.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/976b7ff080ee6a6d76a165f614f40e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 23. Forgat\u00f3k\u00f6nyv 1. A br\u00f3ker elt\u00e1vol\u00edt\u00e1sra ker\u00fcl az ISR-b\u0151l, ha nem kap lek\u00e9rdez\u00e9st t\u0151le a replica.lag.time.max.ms intervallum alatt.<\/i><\/p>\n<p>Nincs logikai feloszt\u00e1s (split-brain) vagy csom\u00f3pont felf\u00fcggeszt\u00e9se, mint a RabbitMQ eset\u00e9ben. Ehelyett a redundancia cs\u00f6kken. <\/p>\n<h3>Forgat\u00f3k\u00f6nyv 2. A vezet\u0151 nem l\u00e1t egyetlen k\u00f6vet\u0151t sem, de m\u00e9g mindig l\u00e1tja a Zookeeper-t.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/ff6aaa053d73e8b7c97111979bcf97aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 24. Forgat\u00f3k\u00f6nyv 2. A vezet\u0151 \u00e9s k\u00e9t k\u00f6vet\u0151.<\/i><\/p>\n<p>A h\u00e1l\u00f3zati kapcsolat megszakad a vezet\u0151 \u00e9s a k\u00f6vet\u0151k k\u00f6z\u00f6tt, de a br\u00f3ker m\u00e9g mindig l\u00e1tja a Zookeeper-t. Mint az els\u0151 forgat\u00f3k\u00f6nyvben, az ISR \u00f6sszeh\u00faz\u00f3dik, de ez\u00fattal csak a vezet\u0151re, mivel minden k\u00f6vet\u0151 le\u00e1ll a lek\u00e9rdez\u00e9sek k\u00fcld\u00e9s\u00e9vel. Ism\u00e9telten, nincs logikai feloszt\u00e1s. Helyette a redundancia elveszt\u00e9se t\u00f6rt\u00e9nik az \u00faj \u00fczenetekn\u00e9l, am\u00edg a kapcsolat helyre nem \u00e1ll. A Zookeeper tov\u00e1bbra is kap pingeket, \u00e9s azt hiszi, hogy a br\u00f3ker \u00e9l \u00e9s eg\u00e9szs\u00e9ges.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/3c69e8327da241407f76719fc022c37a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 25. Forgat\u00f3k\u00f6nyv 2. Az ISR csak a vezet\u0151re sz\u0171k\u00fclt.<\/i><\/p>\n<h3>Forgat\u00f3k\u00f6nyv 3. A k\u00f6vet\u0151 l\u00e1tja a vezet\u0151t, de nem l\u00e1tja a Zookeeper-t.<\/h3>\n<p>\nA k\u00f6vet\u0151 el van v\u00e1lasztva a Zookeeper-t\u0151l, de nem a br\u00f3kert\u0151l a vezet\u00e9ssel. Ennek eredm\u00e9nyek\u00e9nt a k\u00f6vet\u0151 tov\u00e1bbra is k\u00fcldi a lek\u00e9rdez\u00e9seket \u00e9s tagja marad az ISR-nek. A Zookeeper m\u00e1r nem kap pingeket, \u00e9s regisztr\u00e1lja a br\u00f3ker le\u00e1ll\u00e1s\u00e1t, de mivel ez csak egy k\u00f6vet\u0151, a helyre\u00e1ll\u00e1s ut\u00e1n nincs k\u00f6vetkezm\u00e9nye.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/1183bcfe45a3225ae3ef1a0651f61350.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 26. Forgat\u00f3k\u00f6nyv 3. A k\u00f6vet\u0151 tov\u00e1bbra is k\u00fcldi a lek\u00e9rdez\u00e9seket a vezet\u0151nek.<\/i><\/p>\n<h3>Forgat\u00f3k\u00f6nyv 4. A vezet\u0151 l\u00e1tja a k\u00f6vet\u0151ket, de nem l\u00e1tja a Zookeeper-t.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/b3bf27fcb0eb806b27ad00f098e50a26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 27. Forgat\u00f3k\u00f6nyv 4. A vezet\u0151 \u00e9s k\u00e9t k\u00f6vet\u0151.<\/i><\/p>\n<p>A vezet\u0151 el van v\u00e1lasztva a Zookeeper-t\u0151l, de nem a k\u00f6vet\u0151 br\u00f3kerekt\u0151l. <\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/82d9f2e5868566678befc414d1885bfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 28. Forgat\u00f3k\u00f6nyv 4. A vezet\u0151 el van szigetelve a Zookeeper-t\u0151l.<\/i><\/p>\n<p>N\u00e9h\u00e1ny id\u0151 eltelt\u00e9vel a Zookeeper regisztr\u00e1lja a br\u00f3ker le\u00e1ll\u00e1s\u00e1t \u00e9s \u00e9rtes\u00edti a vez\u00e9rl\u0151t. Az \u00faj vezet\u0151t a k\u00f6vet\u0151k k\u00f6z\u00fcl v\u00e1lasztja ki. Azonban az eredeti vezet\u0151 tov\u00e1bbra is azt fogja gondolni, hogy \u0151 a vezet\u0151, \u00e9s folytatni fogja a felv\u00e9telek fogad\u00e1s\u00e1t. <i>acks=1<\/i>. A k\u00f6vet\u0151k m\u00e1r nem k\u00fcldenek neki lek\u00e9rdez\u00e9seket, ez\u00e9rt \u0151 halottnak fogja \u0151ket tartani, \u00e9s megpr\u00f3b\u00e1lja az ISR-t \u00f6nmag\u00e1ra \u00f6sszeszor\u00edtani. De mivel nincs kapcsolata a Zookeeper-rel, nem fogja tudni megtenni, \u00e9s ezen a ponton le fog mondani a tov\u00e1bbi felv\u00e9telek fogad\u00e1s\u00e1r\u00f3l. <\/p>\n<p>\u00dczenetek <i>acks=all<\/i> nem kapnak meger\u0151s\u00edt\u00e9st, mert el\u0151sz\u00f6r az ISR minden replik\u00e1t tartalmaz, \u00e9s az \u00fczenetek nem jutnak el hozz\u00e1juk. Amikor az eredeti vezet\u0151 megpr\u00f3b\u00e1lja elt\u00e1vol\u00edtani \u0151ket az ISR-b\u0151l, nem tudja ezt megtenni, \u00e9s teljesen le\u00e1ll\u00edtja az \u00f6sszes \u00fczenet fogad\u00e1s\u00e1t.<\/p>\n<p>Az \u00fcgyfelek hamarosan \u00e9szreveszik a vez\u00e9rv\u00e1lt\u00e1st, \u00e9s elkezdenek feljegyz\u00e9seket k\u00fcldeni az \u00faj szerverre. Amint a h\u00e1l\u00f3zat helyre\u00e1ll, az eredeti vezet\u0151 l\u00e1tja, hogy m\u00e1r nem vezet\u0151, \u00e9s lev\u00e1gja a napl\u00f3j\u00e1t az \u00faj vezet\u0151 HW \u00e9rt\u00e9k\u00e9re, amely a hiba pillanat\u00e1ban volt, hogy elker\u00fclje a napl\u00f3k elt\u00e9r\u00e9seit. Ekkor elkezdi \u00faj vezet\u0151t\u0151l lek\u00e9rni a m\u00e1solatokat. Az \u00f6sszes eredeti vezet\u0151 feljegyz\u00e9se, amelyet nem replik\u00e1ltak az \u00faj vezet\u0151vel, elveszik. Vagyis elvesznek az \u00fczenetek, amelyeket az eredeti vezet\u0151 nem er\u0151s\u00edtett meg azokban a n\u00e9h\u00e1ny m\u00e1sodpercben, amikor k\u00e9t vezet\u0151 m\u0171k\u00f6d\u00f6tt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/d88d6f33c13dccb814c0f206ec72512b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>33. \u00e1bra. 4. forgat\u00f3k\u00f6nyv. A vezet\u0151 az 1-es brokerben k\u00f6vet\u0151v\u00e9 v\u00e1lik a h\u00e1l\u00f3zat helyre\u00e1ll\u00edt\u00e1sa ut\u00e1n<\/i><\/p>\n<h3>5. forgat\u00f3k\u00f6nyv. A k\u00f6vet\u0151 teljesen el van k\u00fcl\u00f6n\u00edtve a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l<\/h3>\n<p>\nA k\u00f6vet\u0151 teljesen el van k\u00fcl\u00f6n\u00edtve a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l. Egyszer\u0171en elt\u00e1vol\u00edtj\u00e1k az ISR-b\u0151l, am\u00edg a h\u00e1l\u00f3zat helyre nem \u00e1ll, majd utol\u00e9ri a t\u00f6bbieket.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/b092607f777014fd945f18734dd7f4e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>34. \u00e1bra. 5. forgat\u00f3k\u00f6nyv. Az elszigetelt k\u00f6vet\u0151 elt\u00e1vol\u00edt\u00e1sa az ISR-b\u0151l<\/i><\/p>\n<h3>6. forgat\u00f3k\u00f6nyv. A vezet\u0151 teljesen el van k\u00fcl\u00f6n\u00edtve a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/bb808d534dbf65748eb0b481f86b4926.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>35. \u00e1bra. 6. forgat\u00f3k\u00f6nyv. A vezet\u0151 \u00e9s k\u00e9t k\u00f6vet\u0151<\/i><\/p>\n<p>A vezet\u0151 teljesen el van k\u00fcl\u00f6n\u00edtve a k\u00f6vet\u0151it\u0151l, a kontroller\u00e9t\u0151l \u00e9s a Zookeeper-t\u0151l. R\u00f6vid id\u0151re tov\u00e1bbra is fogadni fogja a feljegyz\u00e9seket a <i>acks=1<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/6fda78bcd26ef6b916579d447e9fb1f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>36. \u00e1bra. 6. forgat\u00f3k\u00f6nyv. A vezet\u0151 elszigetel\u00e9se a t\u00f6bbi Kafka csom\u00f3pontt\u00f3l \u00e9s a Zookeeper-t\u0151l<\/i><\/p>\n<p>A k\u00e9r\u00e9sek elmarad\u00e1s\u00e1val, <i>replica.lag.time.max.ms<\/i>, pr\u00f3b\u00e1lni fogja a legkisebbre zsugor\u00edtani az ISR-t, de nem tudja ezt megtenni, mivel nincs kapcsolat a Zookeeper-rel, akkor le\u00e1ll\u00edtja az \u00f6sszes feljegyz\u00e9s fogad\u00e1s\u00e1t. <\/p>\n<p>K\u00f6zben a Zookeeper halottnak nyilv\u00e1n\u00edtja az elszigetelt brokert, \u00e9s a kontroller \u00faj vezet\u0151t v\u00e1laszt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/73d611a411fc64d835af2c714e9eba0a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>37. \u00e1bra. 6. forgat\u00f3k\u00f6nyv. K\u00e9t vezet\u0151<\/i><\/p>\n<p>Az eredeti vezet\u0151 n\u00e9h\u00e1ny m\u00e1sodpercig fogadhatja a feljegyz\u00e9seket, de ezut\u00e1n le\u00e1ll\u00edtja az \u00f6sszes \u00fczenet fogad\u00e1s\u00e1t. Az \u00fcgyfelek 60 m\u00e1sodpercenk\u00e9nt friss\u00edtik a legut\u00f3bbi metaadatokat. \u00c9rtes\u00edt\u00e9st kapnak a vez\u00e9rv\u00e1lt\u00e1sr\u00f3l, \u00e9s elkezdenek feljegyz\u00e9seket k\u00fcldeni az \u00faj vezet\u0151nek.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/ae99380c8a84fac15f440b699b9c552b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>38. \u00e1bra. 6. forgat\u00f3k\u00f6nyv. A gy\u00e1rt\u00f3k \u00e1t kapcsolnak az \u00faj vezet\u0151re<\/i><\/p>\n<p>Minden meger\u0151s\u00edtett bejegyz\u00e9s elveszik, amelyet az eredeti vezet\u0151 k\u00e9sz\u00edtett a kapcsolat megszak\u00edt\u00e1sa \u00f3ta. Amint a h\u00e1l\u00f3zat helyre\u00e1ll, az eredeti vezet\u0151 a Zookeeper-en kereszt\u00fcl \u00e9szleli, hogy m\u00e1r nem vezet\u0151. Ekkor lev\u00e1gja a napl\u00f3j\u00e1t az \u00faj vezet\u0151 HW-\u00e1nak \u00e1llapot\u00e1ig a megv\u00e1laszt\u00e1s id\u0151pontj\u00e1ban, \u00e9s k\u00f6vet\u0151k\u00e9nt kezd el lek\u00e9rdez\u00e9seket k\u00fcldeni.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\" src=\"\/wp-content\/uploads\/2019\/11\/10f0983a829b03ca9bbc62e12cbf8a5d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>34. \u00e1bra. 6. forgat\u00f3k\u00f6nyv. Az eredeti vezet\u0151 k\u00f6vet\u0151v\u00e9 v\u00e1lik a h\u00e1l\u00f3zat kapcsolat\u00e1nak helyre\u00e1ll\u00edt\u00e1sa ut\u00e1n<\/i><\/p>\n<p>Ebben a helyzetben r\u00f6vid id\u0151re logikai sz\u00e9tv\u00e1l\u00e1s figyelhet\u0151 meg, de csak akkor, ha <i>acks=1<\/i> \u00e9s <i>min.insync.replicas<\/i> szint\u00e9n 1. A logikai sz\u00e9tv\u00e1l\u00e1s automatikusan megsz\u0171nik, amikor a h\u00e1l\u00f3zat helyre\u00e1ll, amikor az eredeti vezet\u0151 meg\u00e9rti, hogy m\u00e1r nem vezet\u0151, vagy amikor minden \u00fcgyf\u00e9l meg\u00e9rti, hogy a vezet\u0151 megv\u00e1ltozott, \u00e9s elkezdenek \u00edrni az \u00faj vezet\u0151nek - att\u00f3l f\u00fcgg\u0151en, hogy mi t\u00f6rt\u00e9nik el\u0151bb. Mindenesetre n\u00e9h\u00e1ny \u00fczenet elveszik, de csak <i>acks=1<\/i>.<\/p>\n<p>Van egy m\u00e1sik v\u00e1ltozata ennek a forgat\u00f3k\u00f6nyvnek, amikor k\u00f6zvetlen\u00fcl a h\u00e1l\u00f3zat sz\u00e9tv\u00e1l\u00e1sa el\u0151tt a k\u00f6vet\u0151k lemaradtak, \u00e9s a vezet\u0151 az ISR-t egyetlen saj\u00e1t mag\u00e1ra szor\u00edtotta. Ekkor izol\u00e1l\u00f3dik a kapcsolat megsz\u0171n\u00e9se miatt. \u00daj vezet\u0151t v\u00e1lasztanak, de az eredeti vezet\u0151 tov\u00e1bbra is fogad bejegyz\u00e9seket, an\u00e9lk\u00fcl, hogy <i>acks=all<\/i>, mert az ISR-ben rajta k\u00edv\u00fcl senki sincs. Ezek a bejegyz\u00e9sek elvesznek a h\u00e1l\u00f3zat helyre\u00e1ll\u00edt\u00e1sa ut\u00e1n. Az egyetlen m\u00f3dja ennek a helyzetnek a elker\u00fcl\u00e9s\u00e9re - <i>min.insync.replicas = 2<\/i>.<\/p>\n<h3>7. forgat\u00f3k\u00f6nyv. A Kafka vez\u00e9rl\u0151csom\u00f3pont nem l\u00e1t m\u00e1sik Kafka csom\u00f3pontot<\/h3>\n<p>\n\u00c1ltal\u00e1noss\u00e1gban, miut\u00e1n a kapcsolat megszakadt egy Kafka csom\u00f3ponttal, a vez\u00e9rl\u0151 nem tudja \u00e1tadni neki a vezet\u0151v\u00e1ltoztat\u00e1sr\u00f3l sz\u00f3l\u00f3 inform\u00e1ci\u00f3t. A legrosszabb esetben ez r\u00f6vid t\u00e1v\u00fa logikai sz\u00e9tv\u00e1l\u00e1st eredm\u00e9nyez, mint a 6. forgat\u00f3k\u00f6nyvben. Gyakran el\u0151fordul, hogy a br\u00f3ker egyszer\u0171en nem v\u00e1lik vezet\u0151jel\u00f6ltt\u00e9 a legutols\u00f3 hiba eset\u00e9n.<\/p>\n<h3>8. forgat\u00f3k\u00f6nyv. A Kafka vez\u00e9rl\u0151 nem l\u00e1tja Zookeeper-t<\/h3>\n<p>\nA lev\u00e1lasztott vez\u00e9rl\u0151 nem kap pingi \u00fczenetet Zookeeper-t\u0151l, \u00e9s \u00faj Kafka csom\u00f3pontot v\u00e1laszt vez\u00e9rl\u0151nek. Az eredeti vez\u00e9rl\u0151 tov\u00e1bbra is \u00fagy k\u00e9pzelheti el mag\u00e1t, de nem kap \u00e9rtes\u00edt\u00e9st Zookeeper-t\u0151l, ez\u00e9rt nem lesz semmilyen feladata. Amint a h\u00e1l\u00f3zat helyre\u00e1ll, r\u00e1j\u00f6n, hogy m\u00e1r nem vez\u00e9rl\u0151, hanem egy szokv\u00e1nyos Kafka csom\u00f3pontt\u00e1 v\u00e1lt.<\/p>\n<h3>K\u00f6vetkeztet\u00e9sek a forgat\u00f3k\u00f6nyvekb\u0151l<\/h3>\n<p>\nAzt l\u00e1tjuk, hogy a k\u00f6vet\u0151k kapcsolati elveszt\u00e9se nem vezet az \u00fczenetek elveszt\u00e9s\u00e9hez, hanem csak ideiglenesen cs\u00f6kkenti a redundanci\u00e1t, m\u00edg a h\u00e1l\u00f3zat helyre\u00e1ll. Ez term\u00e9szetesen adatveszt\u00e9shez vezethet, ha egy vagy t\u00f6bb csom\u00f3pont elveszik.<\/p>\n<p>Ha a kapcsolat elveszt\u00e9se miatt a vezet\u0151 lev\u00e1lik a Zookeeperr\u0151l, ez \u00fczenetveszt\u00e9shez vezethet a <i>acks=1<\/i>. A Zookeeperrel val\u00f3 kapcsolat hi\u00e1nya r\u00f6vid t\u00e1v\u00fa logikai sz\u00e9tv\u00e1l\u00e1st okoz k\u00e9t vezet\u0151 k\u00f6z\u00f6tt. Ezt a probl\u00e9m\u00e1t a <i>acks=all<\/i>.<\/p>\n<p>A parameter <i>min.insync.replicas<\/i> k\u00e9t vagy t\u00f6bb replik\u00e1ra vonatkoz\u00f3 param\u00e9ter biztos\u00edtja, amely tov\u00e1bbi garanci\u00e1kat ad arra, hogy az ilyen r\u00f6vid t\u00e1v\u00fa forgat\u00f3k\u00f6nyvek ne vezessenek \u00fczenetveszt\u00e9shez, mint a 6. forgat\u00f3k\u00f6nyv.<\/p>\n<h1>\u00d6sszefoglal\u00e1s az \u00fczenetveszt\u00e9sr\u0151l<\/h1>\n<p>\nSoroljunk fel minden lehets\u00e9ges m\u00f3dot, ahogy adatokat lehet elvesz\u00edteni a Kafka-ban:<\/p>\n<ul>\n<li>B\u00e1rmilyen vezet\u0151i hiba, ha az \u00fczeneteket a k\u00f6vetkez\u0151 m\u00f3don er\u0151s\u00edtett\u00e9k meg: <i>acks=1<\/i>\n<\/li>\n<li>B\u00e1rmely nem tiszta (unclean) vezet\u0151v\u00e1lt\u00e1s, teh\u00e1t ha a k\u00f6vet\u0151 k\u00edv\u00fcl esik az ISR-en, m\u00e9g a <i>acks=all<\/i>\n<\/li>\n<li>A vezet\u0151 izol\u00e1ci\u00f3ja a Zookeeper-t\u0151l, ha az \u00fczeneteket a k\u00f6vetkez\u0151 m\u00f3don er\u0151s\u00edtett\u00e9k meg: <i>acks=1<\/i>\n<\/li>\n<li>Teljes vezet\u0151i izol\u00e1ci\u00f3, aki m\u00e1r \u00f6sszenyomta az ISR csoportot csak \u00f6nmag\u00e1ra. Minden \u00fczenet elveszik, m\u00e9g a <i>acks=all<\/i>. Ez csak akkor igaz, ha <i>min.insync.replicas=1<\/i>.\n<\/li>\n<li>A szakasz \u00f6sszes csom\u00f3pontj\u00e1nak egyidej\u0171 hib\u00e1i. Mivel az \u00fczeneteket mem\u00f3ri\u00e1b\u00f3l er\u0151s\u00edtik meg, n\u00e9h\u00e1ny m\u00e9g nem \u00edr\u00f3dott a lemezre. A szerverek \u00fajraind\u00edt\u00e1sa ut\u00e1n n\u00e9h\u00e1ny \u00fczenet hi\u00e1nyozhat.<\/li>\n<\/ul>\n<p>\nA nem tiszta vezet\u0151v\u00e1lt\u00e1sok elker\u00fclhet\u0151k vagy azok megtilt\u00e1s\u00e1val, vagy legal\u00e1bb kett\u0151 redundanci\u00e1val. A legmegb\u00edzhat\u00f3bb konfigur\u00e1ci\u00f3 a <i>acks=all<\/i> \u00e9s <i>min.insync.replicas<\/i> t\u00f6bb mint 1.<\/p>\n<h1>A RabbitMQ \u00e9s a Kafka megb\u00edzhat\u00f3s\u00e1g\u00e1nak k\u00f6zvetlen \u00f6sszehasonl\u00edt\u00e1sa<\/h1>\n<p>\nA megb\u00edzhat\u00f3s\u00e1g \u00e9s a magas rendelkez\u00e9sre \u00e1ll\u00e1s biztos\u00edt\u00e1sa \u00e9rdek\u00e9ben mindk\u00e9t platform els\u0151dleges \u00e9s m\u00e1sodlagos replik\u00e1l\u00e1si rendszert val\u00f3s\u00edt meg. Azonban a RabbitMQ-nak van egy Achilles-sarka. Hiba ut\u00e1n a csom\u00f3pontok eldobj\u00e1k adataikat, \u00e9s a szinkroniz\u00e1ci\u00f3 blokkolva van. Ez a kett\u0151s csap\u00e1s megk\u00e9rd\u0151jelezi a nagy sorok tart\u00f3ss\u00e1g\u00e1t a RabbitMQ-ban. Be kell \u00e9rnie vagy a redundancia cs\u00f6kkent\u00e9s\u00e9vel, vagy a hossz\u00fa blokkokkal. A redundancia cs\u00f6kkent\u00e9se n\u00f6veli a t\u00f6meges adatveszt\u00e9s kock\u00e1zat\u00e1t. De ha a sorok kicsik, akkor a redundancia biztos\u00edt\u00e1sa \u00e9rdek\u00e9ben r\u00f6vid el\u00e9rhetetlens\u00e9gi id\u0151szakokkal (n\u00e9h\u00e1ny m\u00e1sodperc) elv\u00e9gzett \u00fajrapr\u00f3b\u00e1lkoz\u00e1sa seg\u00edts\u00e9g\u00e9vel kezelhet\u0151k.<\/p>\n<p>A Kafka nem szenved ilyen probl\u00e9m\u00e1ban. Csak az adatokat dobja el, amelyek elt\u00e9rnek a vezet\u0151 \u00e9s a k\u00f6vet\u0151 pontjait\u00f3l. Minden k\u00f6z\u00f6s adat megmarad. Ezen k\u00edv\u00fcl a replik\u00e1ci\u00f3 nem blokkolja a rendszert. A vezet\u0151 folytatja a feljegyz\u00e9seket, am\u00edg az \u00faj k\u00f6vet\u0151 utol\u00e9ri, \u00edgy a devopsok sz\u00e1m\u00e1ra a klaszterhez val\u00f3 csatlakoz\u00e1s vagy \u00fajracsatlakoz\u00e1s trivi\u00e1lis feladatt\u00e1 v\u00e1lik. Term\u00e9szetesen m\u00e9g mindig vannak olyan probl\u00e9m\u00e1k, mint a h\u00e1l\u00f3zati s\u00e1vsz\u00e9less\u00e9g a replik\u00e1ci\u00f3 sor\u00e1n. Ha t\u00f6bb k\u00f6vet\u0151t adunk hozz\u00e1 egyszerre, akkor a s\u00e1vsz\u00e9less\u00e9g hat\u00e1r\u00e1val tal\u00e1lkozhatunk.<\/p>\n<p>A RabbitMQ jobb megb\u00edzhat\u00f3s\u00e1got k\u00edn\u00e1l a klaszterben l\u00e9v\u0151 t\u00f6bb szerver egyidej\u0171 meghib\u00e1sod\u00e1sa eset\u00e9n. Ahogy m\u00e1r eml\u00edtett\u00fck, a RabbitMQ csak akkor k\u00fcld visszaigazol\u00e1st a publik\u00e1l\u00f3nak, miut\u00e1n a mester \u00e9s az \u00f6sszes t\u00fck\u00f6r lemezre \u00edrta az \u00fczenetet. De ez tov\u00e1bbi k\u00e9sleked\u00e9st okoz k\u00e9t okb\u00f3l:<\/p>\n<ul>\n<li>fsync n\u00e9h\u00e1ny sz\u00e1z milliszekundumonk\u00e9nt\n<\/li>\n<li>A t\u00fck\u00f6r meghib\u00e1sod\u00e1s\u00e1t csak a csomagok \u00e9lettartam\u00e1nak lej\u00e1rta ut\u00e1n lehet \u00e9szlelni, amelyek ellen\u0151rzik minden csom\u00f3pont el\u00e9rhet\u0151s\u00e9g\u00e9t (net tick). Ha a t\u00fck\u00f6r lelassul vagy \u00f6sszeomlik, az k\u00e9sleltet\u00e9st ad.<\/li>\n<\/ul>\n<p>\nA Kafka arra t\u00e1maszkodik, hogy ha az \u00fczenet t\u00f6bb csom\u00f3ponton van t\u00e1rolva, az \u00fczeneteket akkor lehet visszaigazolni, amint beker\u00fcltek a mem\u00f3ri\u00e1ba. Emiatt kock\u00e1zatot jelent az \u00fczenetek b\u00e1rmilyen t\u00edpus\u00fa (m\u00e9g <i>acks=all<\/i>, <i>min.insync.replika=2<\/i>) egyidej\u0171 meghib\u00e1sod\u00e1sa eset\u00e9n.<\/p>\n<p>\u00d6sszess\u00e9g\u00e9ben a Kafka magasabb teljes\u00edtm\u00e9nyt mutat, \u00e9s eredetileg klaszterekhez tervezt\u00e9k. A k\u00f6vet\u0151k sz\u00e1ma 11-re n\u00f6velhet\u0151, ha ez sz\u00fcks\u00e9ges a megb\u00edzhat\u00f3s\u00e1g \u00e9rdek\u00e9ben. Az 5-\u00f6s replik\u00e1l\u00e1si ar\u00e1ny \u00e9s a minim\u00e1lis sz\u00e1m\u00fa szinkroniz\u00e1lt replik\u00e1k <i>min.insync.replicas=3<\/i> nagyon ritka esem\u00e9nny\u00e9 teszi az \u00fczenetveszt\u00e9st. Ha az infrastrukt\u00far\u00e1ja k\u00e9pes biztos\u00edtani ezt az ar\u00e1nyt \u00e9s szintet, akkor ezt az opci\u00f3t v\u00e1laszthatja.<\/p>\n<p>A RabbitMQ klaszterez\u00e9s j\u00f3 a kis sorok sz\u00e1m\u00e1ra. De m\u00e9g a kis sorok is gyorsan megn\u0151hetnek nagy forgalom eset\u00e9n. Amint a sorok nagyokk\u00e1 v\u00e1lnak, kem\u00e9ny v\u00e1laszt\u00e1st kell tenn\u00fcnk a rendelkez\u00e9sre \u00e1ll\u00e1s \u00e9s a megb\u00edzhat\u00f3s\u00e1g k\u00f6z\u00f6tt. A RabbitMQ klaszterez\u00e9s legjobban a nem tipikus helyzetekhez illik, ahol a RabbitMQ rugalmass\u00e1g\u00e1nak el\u0151nyei fel\u00fclm\u00falj\u00e1k a klaszterez\u00e9s h\u00e1tr\u00e1nyait.<\/p>\n<p>A nagy sorokkal kapcsolatos RabbitMQ sebezhet\u0151s\u00e9g elleni egyik gy\u00f3gym\u00f3d az, hogy azokat sok kisebb r\u00e9szre osszuk. Ha nem k\u00f6vetel\u00fcnk meg teljes sorrendet az \u00f6sszes sorban, csak a megfelel\u0151 \u00fczenetek (p\u00e9ld\u00e1ul egy adott \u00fcgyf\u00e9l \u00fczenetei) eset\u00e9ben, vagy egy\u00e1ltal\u00e1n nem sorba \u00e1ll\u00edtunk, akkor ez a megold\u00e1s elfogadhat\u00f3: n\u00e9zd meg a projektjeimet <noindex><a rel=\"nofollow\" href=\"https:\/\/jack-vanlightly.com\/blog\/2018\/7\/22\/creating-consumer-groups-in-rabbitmq-with-rebalanser-part-1\">\u00dajraeloszt\u00f3<\/a><\/noindex> a sor feloszt\u00e1s\u00e1hoz (a projekt m\u00e9g korai f\u00e1zisban van). <\/p>\n<p>V\u00e9g\u00fcl ne felejtsd el, hogy t\u00f6bb hiba is l\u00e9tezik a RabbitMQ \u00e9s a Kafka klaszterez\u00e9si \u00e9s replik\u00e1l\u00e1si mechanizmusaiban. Az id\u0151 m\u00fal\u00e1s\u00e1val a rendszerek \u00e9rettebb\u00e9 \u00e9s stabilabb\u00e1 v\u00e1ltak, de soha egyetlen \u00fczenet sem lesz 100%-ban v\u00e9dett az elveszt\u00e9st\u0151l! Ezenk\u00edv\u00fcl a datacenterekben nagyszab\u00e1s\u00fa balesetek t\u00f6rt\u00e9nnek!<\/p>\n<p>Ha valamit kihagytam, hib\u00e1t k\u00f6vettem el, vagy nem \u00e9rtesz egyet egyetlen t\u00e9tellel sem, ne habozz \u00edrni egy megjegyz\u00e9st vagy kapcsolatba l\u00e9pni velem.<\/p>\n<p>Gyakran k\u00e9rdezik t\u0151lem: \u201eMit v\u00e1lasszak, Kafka vagy RabbitMQ?\u201d, \u201eMelyik platform a jobb?\u201d. Az igazs\u00e1g az, hogy ez val\u00f3ban a te helyzetedt\u0151l, jelenlegi tapasztalataidt\u00f3l stb. f\u00fcgg. Nem merek v\u00e9lem\u00e9nyt mondani, mivel t\u00fal nagy leegyszer\u0171s\u00edt\u00e9s lenne, ha egyetlen platformot aj\u00e1nlan\u00e9k az \u00f6sszes haszn\u00e1lati esetre \u00e9s lehets\u00e9ges korl\u00e1tra. Ezt a ciklus cikket \u00edrtam, hogy te is kialak\u00edthasd a saj\u00e1t v\u00e9lem\u00e9nyedet.<\/p>\n<p>Szeretn\u00e9m mondani, hogy mindk\u00e9t rendszer vezet\u0151 szerepet j\u00e1tszik ezen a ter\u00fcleten. Lehet, hogy egy kicsit elfogult vagyok, mert a saj\u00e1t projektjeim tapasztalata alapj\u00e1n jobban \u00e9rt\u00e9kelem az olyan dolgokat, mint az \u00fczenetek garant\u00e1lt sorrendje \u00e9s megb\u00edzhat\u00f3s\u00e1g. <\/p>\n<p>L\u00e1tok m\u00e1s technol\u00f3gi\u00e1kat, amelyeknek hi\u00e1nyzik ez a megb\u00edzhat\u00f3s\u00e1g \u00e9s garant\u00e1lt sorrend, azt\u00e1n n\u00e9zem a RabbitMQ-t \u00e9s a Kafka-t - \u00e9s meg\u00e9rtem mindk\u00e9t rendszer hihetetlen \u00e9rt\u00e9k\u00e9t.<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/474984\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e RabbitMQ \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u043a\u043e\u043f\u0430\u0435\u043c\u0441\u044f \u0432 Apache Kafka. \u0417\u0434\u0435\u0441\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b (partition). \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u043e\u043f\u0438\u043a\u0430 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432. \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0435\u0441\u0442\u044c \u043b\u0438\u0434\u0435\u0440 \u0441 \u0444\u043e\u043b\u043b\u043e\u0432\u0435\u0440\u0430\u043c\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0438\u0445. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u043e\u043f\u0438\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3, \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52541","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47RabbitMQ \u043f\u0440\u043e\u0442\u0438\u0432 Kafka: \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:17+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RabbitMQ vs Kafka: hibat\u0171r\u00e9s \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s | ProHoster","description":"A","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47RabbitMQ \u043f\u0440\u043e\u0442\u0438\u0432 Kafka: \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c | ProHoster","og:description":"\u0412","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:17+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52541","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:57:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:41:24","updated":"2026-01-24 03:57:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/52541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=52541"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/52541\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=52541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=52541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=52541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}