{"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\/de\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","title":{"rendered":"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/6557ce69c2b3070622feca8b3c228b09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">in einem fr\u00fcheren Artikel<\/a><\/noindex> Wir haben die Clusterbildung von RabbitMQ f\u00fcr Ausfallsicherheit und hohe Verf\u00fcgbarkeit betrachtet. Jetzt tauchen wir tief in Apache Kafka ein.<\/p>\n<p>Hier ist die Replizierungseinheit die Partition. Jeder Topic besteht aus einer oder mehreren Partitionen. Jede Partition hat einen Leader, entweder mit oder ohne Follower. Beim Erstellen eines Topics wird die Anzahl der Partitionen und der Replikationsfaktor angegeben. Ein g\u00e4ngiger Wert ist 3, was drei Replikate bedeutet: ein Leader und zwei Follower.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/36deb6d506223c2ee2ec147d5c215789.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 1. Vier Partitionen sind auf drei Broker verteilt<\/i><\/p>\n<p>Alle Lese- und Schreibanfragen gehen an den Leader. Follower senden periodisch Anfragen an den Leader, um die neuesten Nachrichten zu erhalten. Verbraucher wenden sich niemals an die Follower; letztere existieren nur f\u00fcr Redundanz und Ausfallsicherheit.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/715c51d75cb45863cfad4b37e81b9a9a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h1>Partitionausfall<\/h1>\n<p>\nWenn ein Broker ausf\u00e4llt, brechen oft die F\u00fchrungspunkte mehrerer Partitionen zusammen. In jedem dieser F\u00e4lle wird ein Follower von einem anderen Knoten zum neuen Leader. Das ist jedoch nicht immer der Fall, da auch der Synchronisierungsfaktor eine Rolle spielt: Gibt es synchronisierte Follower, und falls nicht, ist der Wechsel zu einer unsynchronisierten Replik erlaubt? Lassen Sie uns das vorerst nicht komplizierter machen.<\/p>\n<p>Broker 3 f\u00e4llt aus \u2013 und f\u00fcr Partition 2 wird ein neuer Leader auf Broker 2 gew\u00e4hlt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/b8cfce64cf6b848b0659de023f9d9b63.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 2. Broker 3 ist ausgefallen, und sein Follower auf Broker 2 wird zum neuen Leader von Partition 2 gew\u00e4hlt.<\/i><\/p>\n<p>Dann f\u00e4llt Broker 1 aus und Partition 1 verliert ebenfalls ihren Leader, dessen Rolle an Broker 2 \u00fcbergeht.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/9f5409c723da7ff059b93f9b23e7d5f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 3. Es bleibt nur ein Broker \u00fcbrig. Alle Leader befinden sich auf einem Broker ohne Redundanz.<\/i><\/p>\n<p>Wenn Broker 1 wieder ins Netzwerk kommt, f\u00fcgt er vier Follower hinzu, wodurch f\u00fcr jede Partition eine gewisse Redundanz geschaffen wird. Doch alle Leader bleiben weiterhin auf Broker 2.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/f9c8e42f51258b7fd7f6f35dc7b8cc3b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 4. Die Leader bleiben auf Broker 2.<\/i><\/p>\n<p>Wenn Broker 3 wieder hochgefahren wird, kehren wir zu drei Replikaten pro Partition zur\u00fcck. Aber alle Leader sind immer noch auf Broker 2.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/9c8c02be4161f8468b5dbc1e3f6ecb3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 5. Unausgewogene Platzierung der Leader nach der Wiederherstellung von Broker 1 und 3.<\/i><\/p>\n<p>Kafka bietet ein besseres Werkzeug f\u00fcr das Rebalancing von Leadern als RabbitMQ. Dort musste man auf ein externes Plugin oder Skript zur\u00fcckgreifen, das die Policies f\u00fcr die Migration des Hauptknotens \u00e4nderte, um die Redundanz w\u00e4hrend der Migration zu reduzieren. Zudem musste man bei gro\u00dfen Warteschlangen mit einer Nichterreichbarkeit w\u00e4hrend der Synchronisation rechnen.<\/p>\n<p>In Kafka gibt es das Konzept der 'bevorzugten Replikate' f\u00fcr die Rolle des Leaders. Bei der Erstellung von Topic-Partitionen versucht Kafka, die Leader gleichm\u00e4\u00dfig auf die Knoten zu verteilen und markiert diese ersten Leader als bevorzugt. Durch Serverneustarts, Ausf\u00e4lle und Netzwerkunterbrechungen k\u00f6nnen die Leader jedoch im Laufe der Zeit auf andere Knoten verschoben werden, wie im oben beschriebenen Extremfall.<\/p>\n<p>Um dies zu beheben, bietet Kafka zwei Optionen an:<\/p>\n<ul>\n<li>Option <i>auto.leader.rebalance.enable=true<\/i> erm\u00f6glicht es dem Controller-Knoten, die Leader automatisch auf die bevorzugten Replikate zur\u00fcckzuweisen und so eine gleichm\u00e4\u00dfige Verteilung wiederherzustellen.\n<\/li>\n<li>Ein Administrator kann das Skript <i>kafka-preferred-replica-election.sh<\/i> manuell ausf\u00fchren, um die Neuzuweisung vorzunehmen.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/831930b06809637018fecb6d7d5a558d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 6. Replikate nach dem Rebalancing<\/i><\/p>\n<p>Dies war eine vereinfachte Darstellung des Fehlers, aber die Realit\u00e4t ist komplexer, auch wenn hier nichts allzu kompliziert ist. Es dreht sich alles um synchronisierte Replikate (In-Sync Replicas, ISR).<\/p>\n<h1>Synchronisierte Replikate (ISR)<\/h1>\n<p>\nISR ist eine Gruppe von Replikaten eines Abschnitts, die als \u201esynchronisiert\u201c (in-sync) gelten. Es gibt einen Leader, und Followers m\u00fcssen nicht vorhanden sein. Ein Follower gilt als synchronisiert, wenn er exakte Kopien aller Nachrichten des Leaders innerhalb des Intervalls erstellt hat. <i>replica.lag.time.max.ms<\/i>.<\/p>\n<p>Ein Follower wird aus der ISR-Gruppe entfernt, wenn er:<\/p>\n<ul>\n<li>keine Fetch-Anfrage innerhalb des Intervalls gestellt hat <i>replica.lag.time.max.ms<\/i> (gilt als tot)\n<\/li>\n<li>es vers\u00e4umt hat, sich innerhalb des Intervalls zu aktualisieren <i>replica.lag.time.max.ms<\/i> (gilt als langsam)<\/li>\n<\/ul>\n<p>\nFollower stellen Fetch-Anfragen innerhalb des Intervalls <i>replica.fetch.wait.max.ms<\/i>, das standardm\u00e4\u00dfig 500 ms betr\u00e4gt.<\/p>\n<p>Um den Zweck von ISR klar zu erkl\u00e4ren, m\u00fcssen wir uns die Best\u00e4tigungen vom Producer und einige Fehlerszenarien ansehen. Producer k\u00f6nnen w\u00e4hlen, wann der Broker die Best\u00e4tigung sendet:<\/p>\n<ul>\n<li>acks=0, keine Best\u00e4tigung wird gesendet\n<\/li>\n<li>acks=1, die Best\u00e4tigung wird gesendet, nachdem der Leader die Nachricht in sein lokales Protokoll geschrieben hat.\n<\/li>\n<li>acks=all, die Best\u00e4tigung wird gesendet, nachdem alle Replikate im ISR die Nachricht in ihren lokalen Protokollen gespeichert haben.<\/li>\n<\/ul>\n<p>\nIn der Kafka-Terminologie erfolgt ein \"Commit\", wenn ISR die Nachricht gespeichert hat. Acks=all ist die sicherste Option, f\u00fchrt jedoch zu zus\u00e4tzlicher Verz\u00f6gerung. Betrachten wir zwei Ausfallbeispiele und wie verschiedene \"acks\"-Optionen mit dem Konzept von ISR interagieren.<\/p>\n<h3>Acks=1 und ISR<\/h3>\n<p>\nIn diesem Beispiel werden wir sehen, dass, wenn der Leader nicht darauf wartet, dass jede Nachricht von allen Followers gespeichert wird, bei einem Ausfall des Leaders Daten verloren gehen k\u00f6nnen. Der \u00dcbergang zu einem unsynchronisierten Follower kann durch die Einstellung \"unclean.leader.election.enable\" erlaubt oder verboten werden. <i>unclean.leader.election.enable<\/i>.<\/p>\n<p>In diesem Beispiel hat der Producer den Wert acks=1 gesetzt. Die Partition ist auf alle drei Broker verteilt. Broker 3 hinkt hinterher; er hat sich vor acht Sekunden mit dem Leader synchronisiert und fehlt jetzt 7456 Nachrichten. Broker 1 hinkt nur eine Sekunde hinterher. Unser Producer sendet die Nachricht und erh\u00e4lt schnell eine Ack zur\u00fcck, ohne Overhead aufgrund langsamer oder ausgefallener Followers, auf die der Leader nicht wartet.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/f194e6309b732b772574392eff482a8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 7. ISR mit drei Replikaten<\/i><\/p>\n<p>Broker 2 f\u00e4llt aus, und der Produzent erh\u00e4lt einen Verbindungsfehler. Nach dem Wechsel der F\u00fchrungsrolle zu Broker 1 verlieren wir 123 Nachrichten. Der Follower auf Broker 1 war im ISR, konnte sich jedoch nicht vollst\u00e4ndig mit dem Leader synchronisieren, als dieser ausfiel.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/367f219daebafefe585059f67fdedf6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 8. Nachrichten gehen bei einem Ausfall verloren<\/i><\/p>\n<p>In der Konfiguration <i>bootstrap.servers<\/i> sind mehrere Broker f\u00fcr den Produzenten aufgelistet, und er kann einen anderen Broker fragen, wer der neue Leader der Partition geworden ist. Dann stellt er eine Verbindung zu Broker 1 her und sendet weiterhin Nachrichten.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/ba45c51f4ce1f63f10b2fa0e1487b223.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 9. Die Nachrichten\u00fcbertragung wird nach einer kurzen Unterbrechung fortgesetzt<\/i><\/p>\n<p>Broker 3 ist noch weiter im R\u00fcckstand. Er stellt Abfragen zur Datenabfrage, kann sich jedoch nicht synchronisieren. Das kann an einer langsamen Netzwerkverbindung zwischen den Brokern, einem Speicherproblem usw. liegen. Er wird aus dem ISR entfernt. Jetzt besteht der ISR nur noch aus einer Replik \u2014 dem Leader! Der Produzent sendet weiterhin Nachrichten und erh\u00e4lt Best\u00e4tigungen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/592c74632e3a8d80c2b4fc15bde5d401.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 10. Der Follower auf Broker 3 wird aus dem ISR entfernt<\/i><\/p>\n<p>Broker 1 f\u00e4llt aus, und die F\u00fchrungsrolle geht an Broker 3 mit dem Verlust von 15.286 Nachrichten! Der Produzent erh\u00e4lt eine Fehlermeldung \u00fcber die Verbindung. Der Wechsel zum F\u00fchrenden au\u00dferhalb des ISR war nur durch die Konfiguration m\u00f6glich. <i>unclean.leader.election.enable=true<\/i>. Wenn es auf <i>false<\/i>gesetzt ist, w\u00fcrde kein Wechsel stattfinden, und alle Lese- und Schreibanfragen w\u00fcrden abgelehnt. In diesem Fall warten wir auf die R\u00fcckkehr von Broker 1 mit seinen unber\u00fchrten Daten in der Replik, die wieder die F\u00fchrung \u00fcbernehmen wird.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/30f01ca715ccc194890ae061a3ef7396.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 11. Broker 1 f\u00e4llt aus. Bei einem Ausfall gehen viele Nachrichten verloren.<\/i><\/p>\n<p>Der Produzent stellt eine Verbindung zum letzten Broker her und sieht, dass dieser nun der F\u00fchrer des Abschnitts ist. Er beginnt, Nachrichten an Broker 3 zu senden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/986532d9b22b6514b6039c8460b1beb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 12. Nach einer kurzen Unterbrechung werden die Nachrichten wieder an Abschnitt 0 gesendet.<\/i><\/p>\n<p>Wir haben gesehen, dass der Produzent trotz kurzer Unterbrechungen zum Einrichten neuer Verbindungen und zum Finden eines neuen F\u00fchrers st\u00e4ndig Nachrichten gesendet hat. Diese Konfiguration gew\u00e4hrleistet Verf\u00fcgbarkeit auf Kosten der Konsistenz (Datensicherheit). Kafka hat Tausende von Nachrichten verloren, akzeptierte aber weiterhin neue Eintr\u00e4ge.<\/p>\n<h3>Acks=all und ISR<\/h3>\n<p>\nLass uns dieses Szenario noch einmal durchspielen, aber mit <i>acks=all<\/i>. Die Broker-Latenz betr\u00e4gt im Durchschnitt vier Sekunden. Der Producer sendet eine Nachricht, <i>acks=all<\/i>, und erh\u00e4lt nun keine schnelle Antwort. Der Leader wartet, bis die Nachricht alle Replikate im ISR gespeichert hat.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/95b1abdc92e699f7bc41ebab249a2e08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 13. ISR mit drei Replikaten. Eine arbeitet langsam, was zu einer Verz\u00f6gerung bei der Speicherung f\u00fchrt.<\/i><\/p>\n<p>Nach vier Sekunden zus\u00e4tzlicher Verz\u00f6gerung sendet Broker 2 ein ACK. Alle Replikate sind jetzt vollst\u00e4ndig aktualisiert.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/64356dc8d2641a3e22947126dd047f39.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 14. Alle Replikate speichern Nachrichten und es wird ein ACK gesendet.<\/i><\/p>\n<p>Broker 3 hinkt nun noch weiter hinterher und wird aus dem ISR entfernt. Die Latenz wird erheblich reduziert, da im ISR keine langsamen Replikate mehr vorhanden sind. Broker 2 wartet nun nur noch auf Broker 1, der eine durchschnittliche Verz\u00f6gerung von 500 ms hat.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/5d3bd67dc53cb868fa40b358ed483a1d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 15. Die Replikation auf Broker 3 wird aus dem ISR entfernt.<\/i><\/p>\n<p>Dann f\u00e4llt Broker 2 aus, und die F\u00fchrung geht ohne Verlust von Nachrichten an Broker 1 \u00fcber.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/e3f0417aa7714ea5eae8a8e8d61662bd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 16. Broker 2 f\u00e4llt aus.<\/i><\/p>\n<p>Der Producer findet einen neuen Leader und beginnt, ihm Nachrichten zu senden. Die Latenz verringert sich weiter, da der ISR jetzt aus einem einzigen Replikat besteht! Daher tr\u00e4gt die Option <i>acks=all<\/i> keine Redundanz bei.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/fec9aae9977757d5f61c2909ceae0536.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 17. Die Replikation auf Broker 1 \u00fcbernimmt die F\u00fchrung ohne Verlust von Nachrichten.<\/i><\/p>\n<p>Dann f\u00e4llt Broker 1 aus, und die F\u00fchrung geht an Broker 3 mit dem Verlust von 14.238 Nachrichten!<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/730b3951fb75ab3a782fc6d064615212.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 18. Broker 1 f\u00e4llt aus, und der Wechsel der F\u00fchrung mit der unclean-Konfiguration f\u00fchrt zu einem erheblichen Datenverlust<\/i><\/p>\n<p>Wir k\u00f6nnten die Option nicht aktivieren <i>unclean.leader.election.enable<\/i> auf <i>true<\/i>. Standardm\u00e4\u00dfig ist sie auf <i>false<\/i>. Die Konfiguration <i>acks=all<\/i> mit <i>unclean.leader.election.enable=true<\/i> stellt eine Verf\u00fcgbarkeit mit zus\u00e4tzlichem Schutz der Daten sicher. Aber wie Sie sehen k\u00f6nnen, k\u00f6nnen wir dennoch Nachrichten verlieren.<\/p>\n<p>Aber was, wenn wir die Datensicherheit erh\u00f6hen wollen? Wir k\u00f6nnen setzen <i>unclean.leader.election.enable = false<\/i>, aber das wird uns nicht unbedingt vor Datenverlust sch\u00fctzen. Wenn der Leader hart ausf\u00e4llt und Daten verliert, sind die Nachrichten weiterhin verloren, zudem verliert man die Verf\u00fcgbarkeit, bis der Administrator die Situation wiederherstellt.<\/p>\n<p>Es ist besser, die Redundanz aller Nachrichten sicherzustellen, andernfalls sollte man auf das Schreiben verzichten. Dann ist aus Sicht des Brokers der Datenverlust nur bei zwei oder mehr gleichzeitigen Ausf\u00e4llen m\u00f6glich.<\/p>\n<h3>Acks=all, min.insync.replicas und ISR<\/h3>\n<p>\nMit der Topic-Konfiguration <i>min.insync.replicas<\/i> erh\u00f6hen wir die Datensicherheit. Lassen Sie uns noch einmal den letzten Teil des vorherigen Szenarios durchgehen, aber diesmal mit <i>min.insync.replicas=2<\/i>.<\/p>\n<p>Also hat Broker 2 einen F\u00fchrer von Replikaten, w\u00e4hrend der Follower auf Broker 3 aus ISR entfernt ist.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/5831463293f1837d3232756894e97162.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 19. ISR aus zwei Replikaten<\/i><\/p>\n<p>Broker 2 f\u00e4llt aus, und die F\u00fchrung wechselt ohne Nachrichtenverlust zu Broker 1. Aber nun besteht der ISR nur aus einem Replikat. Das entspricht nicht der minimalen Anzahl zur Erfassung von Aufzeichnungen, und daher antwortet der Broker auf den Schreibversuch mit einem Fehler. <i>NotEnoughReplicas<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/6b2ee477f4c33ec84f3068b792814e5d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 20. Die Anzahl der ISR liegt um eins niedriger als in min.insync.replicas angegeben.<\/i><\/p>\n<p>Diese Konfiguration opfert die Verf\u00fcgbarkeit zugunsten der Konsistenz. Bevor eine Nachricht best\u00e4tigt wird, stellen wir sicher, dass sie auf mindestens zwei Replikate geschrieben wird. Das gibt dem Produzenten ein viel gr\u00f6\u00dferes Vertrauen. Hier ist ein Nachrichtenverlust nur m\u00f6glich, wenn zwei Replikate gleichzeitig in einem kurzen Zeitraum ausfallen, bevor die Nachricht auf einen zus\u00e4tzlichen Follower repliziert wird, was unwahrscheinlich ist. Wenn Sie jedoch extrem paranoid sind, k\u00f6nnen Sie einen Replikationsfaktor von 5 einstellen. <i>min.insync.replicas<\/i> Hier m\u00fcssen sofort drei Broker gleichzeitig ausfallen, um einen Verlust der Aufzeichnung zu verursachen! Nat\u00fcrlich werden Sie f\u00fcr diese Zuverl\u00e4ssigkeit mit einer zus\u00e4tzlichen Verz\u00f6gerung bezahlen.<\/p>\n<h1>Wenn Verf\u00fcgbarkeit zur Datensicherheit notwendig ist,<\/h1>\n<p>\nWie im <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">im Fall von RabbitMQ,<\/a><\/noindex>, ist manchmal Verf\u00fcgbarkeit notwendig f\u00fcr die Datensicherheit. Sie sollten Folgendes bedenken:<\/p>\n<ul>\n<li>Kann ein Publisher einfach einen Fehler zur\u00fcckgeben, w\u00e4hrend der \u00fcbergeordnete Dienst oder Benutzer sp\u00e4ter einen neuen Versuch starten?\n<\/li>\n<li>Kann der Publisher die Nachricht lokal oder in einer Datenbank speichern, um es sp\u00e4ter erneut zu versuchen?<\/li>\n<\/ul>\n<p>\nWenn die Antwort negativ ist, erh\u00f6ht die Optimierung der Verf\u00fcgbarkeit die Datensicherheit. Sie verlieren weniger Daten, wenn Sie Verf\u00fcgbarkeit anstelle einer Schreibverweigerung w\u00e4hlen. Letztendlich geht es darum, ein Gleichgewicht zu finden, und die Entscheidung h\u00e4ngt von der jeweiligen Situation ab.<\/p>\n<h1>Bedeutung von ISR<\/h1>\n<p>\nDas ISR-Set erm\u00f6glicht es, das optimale Gleichgewicht zwischen Datensicherheit und Latenz zu w\u00e4hlen. Beispielsweise kann die Verf\u00fcgbarkeit w\u00e4hrend eines Ausfalls der meisten Replikate sichergestellt werden, w\u00e4hrend die Auswirkungen von toten oder langsamen Replikaten hinsichtlich der Latenz minimiert werden.<\/p>\n<p>Wir bestimmen selbst den Wert <i>replica.lag.time.max.ms<\/i> entsprechend unseren Bed\u00fcrfnissen. Im Wesentlichen bedeutet diese Einstellung, welche Latenz wir bereit sind hinzunehmen bei <i>acks=all<\/i>. Der Standardwert betr\u00e4gt zehn Sekunden. Wenn dies f\u00fcr Sie zu lang ist, k\u00f6nnen Sie ihn verringern. In diesem Fall erh\u00f6ht sich die \u00c4nderungsfrequenz im ISR, da Follower h\u00e4ufiger entfernt und hinzugef\u00fcgt werden.<\/p>\n<p>In RabbitMQ gibt es einfach eine Reihe von Spiegeln, die repliziert werden m\u00fcssen. Langsame Spiegel f\u00fchren zu zus\u00e4tzlicher Verz\u00f6gerung, und auf die Antwort von toten Spiegeln kann man bis zum Ablauf der Lebensdauer der Pakete warten, die die Verf\u00fcgbarkeit jedes Knotens \u00fcberpr\u00fcfen (net tick). ISR ist eine interessante Methode, um diese Probleme mit erh\u00f6hten Latenzen zu vermeiden. Allerdings riskieren wir, Redundanz zu verlieren, da ISR nur auf den Leader reduziert werden kann. Um dieses Risiko zu umgehen, verwenden Sie die Einstellung. <i>min.insync.replicas<\/i>.<\/p>\n<h1>Kundenverbindungs-Garantie<\/h1>\n<p>\nIn den Einstellungen <i>bootstrap.servers<\/i> k\u00f6nnen f\u00fcr Produzenten und Verbraucher mehrere Broker zur Verbindung der Clients angegeben werden. Die Idee ist, dass bei der Trennung eines Knotens mehrere Backups verf\u00fcgbar bleiben, mit denen der Client eine Verbindung herstellen kann. Diese m\u00fcssen nicht unbedingt die Leader der Partitionen sein, sondern dienen lediglich als Plattform f\u00fcr den anf\u00e4nglichen Zugriff. Der Client kann sie fragen, auf welchem Knoten der Leader der Partition f\u00fcr Lese-\/Schreiboperationen gehostet wird.<\/p>\n<p>In RabbitMQ k\u00f6nnen Clients sich mit jedem Knoten verbinden, w\u00e4hrend die interne Routing-Logik die Anfragen an den richtigen Ort sendet. Das bedeutet, dass Sie einen Lastenausgleichsmechanismus vor RabbitMQ einrichten k\u00f6nnen. Kafka hingegen erfordert, dass sich Clients mit dem Knoten verbinden, auf dem der Leader des entsprechenden Bereichs gehostet wird. In solchen Situationen l\u00e4sst sich kein Lastenausgleich einrichten. Die Liste <i>bootstrap.servers<\/i> ist von entscheidender Bedeutung, damit die Clients auf die richtigen Knoten zugreifen und sie nach einem Ausfall finden k\u00f6nnen.<\/p>\n<h1>Die Konsensarchitektur von Kafka<\/h1>\n<p>\nBisher haben wir nicht besprochen, wie der Cluster von einem Ausfall eines Brokers erf\u00e4hrt und wie ein neuer Leader ausgew\u00e4hlt wird. Um zu verstehen, wie Kafka mit Netzwerkpartitionen umgeht, m\u00fcssen wir zun\u00e4chst die Konsensarchitektur verstehen.<\/p>\n<p>Jeder Kafka-Cluster wird zusammen mit einem Zookeeper-Cluster bereitgestellt \u2013 einem Dienst f\u00fcr verteilten Konsens, der es dem System erm\u00f6glicht, einen Konsens \u00fcber einen bestimmten Zustand zu erzielen, wobei die Konsistenz \u00fcber die Verf\u00fcgbarkeit priorisiert wird. F\u00fcr die Genehmigung von Lese- und Schreiboperationen ist das Einverst\u00e4ndnis der Mehrheit der Zookeeper-Knoten erforderlich.<\/p>\n<p>Zookeeper speichert den Zustand des Clusters:<\/p>\n<ul>\n<li>Liste der Themen, Segmente, Konfiguration, aktuelle Replikate des Leaders, bevorzugte Replikate.\n<\/li>\n<li>Cluster-Mitglieder. Jeder Broker pingt den Zookeeper-Cluster. Wenn der Zookeeper innerhalb eines festgelegten Zeitraums kein Ping erh\u00e4lt, wird der Broker als nicht erreichbar vermerkt.\n<\/li>\n<li>Auswahl der Haupt- und Backup-Knoten f\u00fcr den Controller.<\/li>\n<\/ul>\n<p>\nDer Controller-Knoten ist einer der Kafka-Broker, der f\u00fcr die Wahl der Leaders der Replikate verantwortlich ist. Der Zookeeper sendet dem Controller Benachrichtigungen \u00fcber die Mitgliedschaft im Cluster und \u00c4nderungen an Themen, und der Controller muss entsprechend diesen \u00c4nderungen reagieren.<\/p>\n<p>Nehmen wir zum Beispiel ein neues Thema mit zehn Segmenten und einem Replikationsfaktor von 3. Der Controller muss einen Leader f\u00fcr jedes Segment w\u00e4hlen und versucht dabei, die Leader optimal auf die Broker zu verteilen. <\/p>\n<p>F\u00fcr jedes Segment aktualisiert der Controller:<\/p>\n<ul>\n<li>Informationen im Zookeeper \u00fcber ISR und Leader;\n<\/li>\n<li>sendet jedem Broker, der eine Replikation dieses Segments hostet, den LeaderAndISRCommand und informiert die Broker \u00fcber ISR und Leader.<\/li>\n<\/ul>\n<p>\nWenn ein Broker mit dem Leader ausf\u00e4llt, sendet Zookeeper eine Benachrichtigung an den Controller, der dann einen neuen Leader ausw\u00e4hlt. Der Controller aktualisiert zuerst Zookeeper, bevor er jedem Broker einen Befehl sendet, um sie \u00fcber den F\u00fchrungswechsel zu informieren.<\/p>\n<p>Jeder Leader ist f\u00fcr die Zusammenstellung der ISR verantwortlich. Die Konfiguration <i>replica.lag.time.max.ms<\/i> bestimmt, wer darin aufgenommen wird. Bei einer \u00c4nderung der ISR \u00fcbergibt der Leader Zookeeper die neuen Informationen.<\/p>\n<p>Zookeeper ist stets \u00fcber alle \u00c4nderungen informiert, damit im Falle eines Ausfalls die Leitung reibungslos auf den neuen Leader \u00fcbergeben werden kann.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/3adb1d204b28e3ed85bef3530fa2b738.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 21. Konsens von Kafka<\/i><\/p>\n<h1>Replikationsprotokoll<\/h1>\n<p>\nDas Verst\u00e4ndnis der Replikationsdetails hilft, potenzielle Datenausfall-Szenarien besser zu verstehen.<\/p>\n<h3>Abrufanfragen, Log End Offset (LEO) und Highwater Mark (HW)<\/h3>\n<p>\nWir haben gesehen, dass Follower dem Leader periodisch Abrufanfragen (fetch) senden. Das Standardintervall betr\u00e4gt 500 ms. Dies unterscheidet sich von RabbitMQ, bei dem die Replikation nicht durch das Spiegeln der Warteschlange, sondern durch den Master initiiert wird. Der Master sendet die \u00c4nderungen an die Spiegel.<\/p>\n<p>Der Leader und alle Follower behalten den Log End Offset (LEO) und das Highwater-Merkmal (HW) bei. Der LEO speichert die Offset-Position der letzten Nachricht in der lokalen Replik, w\u00e4hrend HW das Offset der letzten Commit-Nachricht speichert. Beachten Sie, dass f\u00fcr den Status \u201eCommit\u201c die Nachricht in allen Replikaten innerhalb des ISR (In-Sync Replicas) aufgezeichnet sein muss. Das bedeutet, dass LEO normalerweise etwas vor HW liegt.<\/p>\n<p>Wenn der Leader eine Nachricht erh\u00e4lt, speichert er sie lokal. Der Follower sendet eine Abfrage mit seinem LEO. Der Leader sendet dann ein Paket von Nachrichten, beginnend mit diesem LEO und \u00fcbertr\u00e4gt auch das aktuelle HW. Sobald der Leader die Information erh\u00e4lt, dass alle Replikate die Nachricht mit dem angegebenen Offset gespeichert haben, verschiebt er das HW-Merkmal. Nur der Leader kann das HW verschieben, und so erfahren alle Follower den aktuellen Wert in ihrenAntworten auf ihre Abfragen. Das bedeutet, dass die Follower sowohl bei den Nachrichten als auch beim Wissen \u00fcber HW hinter dem Leader zur\u00fcckbleiben k\u00f6nnen. Verbraucher erhalten Nachrichten nur bis zum aktuellen HW.<\/p>\n<p>Bitte beachten Sie, dass \u201epersistiert\u201c hier bedeutet, dass es im Speicher und nicht auf der Festplatte geschrieben wird. Zu Leistungszwecken synchronisiert Kafka die Daten mit einem bestimmten Intervall auf die Festplatte. Auch RabbitMQ hat ein solches Intervall, schickt jedoch die Best\u00e4tigung an den Publisher erst, nachdem sowohl der Master als auch alle Spiegel das Nachricht auf die Festplatte geschrieben haben. Aus Leistungsgr\u00fcnden haben die Entwickler von Kafka entschieden, die Best\u00e4tigung zu senden, sobald die Nachricht im Speicher abgelegt ist. Kafka setzt darauf, dass Redundanz das Risiko eines kurzfristigen Speicherns best\u00e4tigter Nachrichten nur im Speicher ausgleicht.<\/p>\n<h1>Leaderausfall<\/h1>\n<p>\nWenn der Leader ausf\u00e4llt, informiert Zookeeper den Controller, der dann eine neue Leader-Replik ausw\u00e4hlt. Der neue Leader setzt einen neuen HW-Punkt gem\u00e4\u00df seinem LEO fest. Dann erhalten die Follower die Information \u00fcber den neuen Leader. Abh\u00e4ngig von der version von Kafka w\u00e4hlt der Follower eines von zwei Szenarien:<\/p>\n<ol>\n<li>Er wird das lokale Protokoll bis zur bekannten HW k\u00fcrzen und den neuen Leader um Nachrichten nach diesem Punkt bitten.\n<\/li>\n<li>Sendet eine Anfrage an den neuen Leader, um die HW zum Zeitpunkt seiner Wahl zu erfahren, und k\u00fcrzt dann das Log bis zu diesem Offset. Anschlie\u00dfend beginnt es, regelm\u00e4\u00dfige Abfragen zur Abtastung zu machen, beginnend mit diesem Offset.<\/li>\n<\/ol>\n<p>\nEin Follower muss sein Log aus folgenden Gr\u00fcnden k\u00fcrzen:<\/p>\n<ul>\n<li>Wenn ein Leader ausf\u00e4llt, gewinnt der erste Follower aus der ISR-Gruppe, der in Zookeeper registriert ist, die Wahl und wird zum Leader. Alle Follower in der ISR, obwohl als \u201esynchronisiert\u201c betrachtet, haben m\u00f6glicherweise nicht alle Nachrichtenkopien vom vorherigen Leader erhalten. Es ist durchaus m\u00f6glich, dass der gew\u00e4hlte Follower nicht die aktuellste Kopie hat. Kafka garantiert, dass es keine Diskrepanzen zwischen den Replikaten gibt. Damit jede Diskrepanz vermieden wird, muss jeder Follower sein Log auf den HW-Wert des neuen Leaders zum Zeitpunkt seiner Wahl k\u00fcrzen. Dies ist ein weiterer Grund, warum die Konfiguration <i>acks=all<\/i> f\u00fcr die Konsistenz so wichtig ist.\n<\/li>\n<li>Nachrichten werden regelm\u00e4\u00dfig auf die Festplatte geschrieben. Wenn alle Knoten des Clusters gleichzeitig ausfallen, werden die Replikate mit unterschiedlichen Offsets auf den Platten gespeichert. Es ist gut m\u00f6glich, dass beim Wiedereintritt der Broker in das Netzwerk der neu gew\u00e4hlte Leader hinter seinen Followern zur\u00fcckbleibt, weil er sich fr\u00fcher auf der Festplatte gespeichert hat als die anderen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Wiedereingliederung in das Cluster<\/h3>\n<p>\nBei der Wiedereingliederung in das Cluster verfahren die Replikate wie bei einem Ausfall des Leaders: Sie pr\u00fcfen die Replik des Leaders und k\u00fcrzen ihr Protokoll auf dessen HW (zum Zeitpunkt der Wahl). Im Vergleich dazu behandelt RabbitMQ wiederverbundene Knoten als v\u00f6llig neu. In beiden F\u00e4llen verwirft der Broker jeden bestehenden Zustand. Bei Verwendung der automatischen Synchronisierung muss der Master s\u00e4mtliche aktuellen Inhalte in das neue Spiegelbild replizieren, und der Master akzeptiert w\u00e4hrend dieser Operation keine Lese- oder Schreibvorg\u00e4nge. Dieser Ansatz f\u00fchrt zu Problemen bei gro\u00dfen Warteschlangen.<\/p>\n<p>Kafka ist ein verteiltes Logsystem, das insgesamt mehr Nachrichten speichert als eine RabbitMQ-Warteschlange, in der Daten nach dem Lesen aus der Warteschlange gel\u00f6scht werden. Aktive Warteschlangen sollten relativ klein bleiben. Kafka hingegen ist ein Logsystem mit einer eigenen Speicherpolitik, die Fristen in Tagen oder Wochen festlegen kann. Der Ansatz mit Warteschlangen-Sperrung und vollst\u00e4ndiger Synchronisation ist f\u00fcr ein verteiltes Log v\u00f6llig inakzeptabel. Stattdessen k\u00fcrzen die Kafka-Follower ihr Log auf den HW-Leser (zum Zeitpunkt seiner Wahl), falls ihre Kopie dem F\u00fchrer voraus ist. In dem wahrscheinlicheren Fall, dass der Follower hinterherhinkt, beginnt er einfach, Anfragen zur Abholung zu stellen, beginnend mit seinem aktuellen LEO.<\/p>\n<p>Neue oder wiederverbundene Follower starten au\u00dferhalb des ISR und nehmen nicht an den Commits teil. Sie arbeiten einfach neben der Gruppe und empfangen Nachrichten so schnell sie k\u00f6nnen, bis sie den F\u00fchrer eingeholt haben und in das ISR eintreten. Hier gibt es keine Sperrung, und es ist nicht notwendig, alle eigenen Daten zu verwerfen.<\/p>\n<h1>Verletzung der Konsistenz<\/h1>\n<p>\nKafka verf\u00fcgt \u00fcber mehr Komponenten als RabbitMQ, daher gibt es hier ein komplexeres Verhalten, wenn die Konnektivit\u00e4t im Cluster beeintr\u00e4chtigt wird. Kafka wurde jedoch urspr\u00fcnglich f\u00fcr Cluster entworfen, sodass die L\u00f6sungen sehr gut durchdacht sind.<\/p>\n<p>Im Folgenden sind einige Szenarien f\u00fcr Konnektivit\u00e4tsst\u00f6rungen aufgef\u00fchrt:<\/p>\n<ul>\n<li>Szenario 1. Der Follower sieht den Leader nicht, kann aber noch Zookeeper sehen.\n<\/li>\n<li>Szenario 2. Der Leader sieht keinen Follower, kann aber noch Zookeeper sehen.\n<\/li>\n<li>Szenario 3. Der Follower sieht den Leader, sieht aber Zookeeper nicht.\n<\/li>\n<li>Szenario 4. Der Leader sieht die Follower, sieht aber Zookeeper nicht.\n<\/li>\n<li>Szenario 5. Der Follower ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper getrennt.\n<\/li>\n<li>Szenario 6. Der Leader ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper getrennt.\n<\/li>\n<li>Szenario 7. Der Kafka-Controller sieht keinen anderen Kafka-Knoten.\n<\/li>\n<li>Szenario 8. Der Kafka-Controller sieht Zookeeper nicht.<\/li>\n<\/ul>\n<p>\nF\u00fcr jedes Szenario gibt es spezifisches Verhalten.<\/p>\n<h3>Szenario 1. Der Follower sieht den Leader nicht, kann aber noch Zookeeper sehen.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/5f51ae679933b2b5a69e21831465d121.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 22. Szenario 1. ISR aus drei Replikaten.<\/i><\/p>\n<p>Die Konnektivit\u00e4tsst\u00f6rung trennt Broker 3 von Broker 1 und 2, nicht jedoch von Zookeeper. Broker 3 kann keine Abfrageanfragen mehr senden. Nach Ablauf der Zeit. <i>replica.lag.time.max.ms<\/i> Er wird aus dem ISR entfernt und nimmt nicht an den Nachrichtencommits teil. Sobald die Konnektivit\u00e4t wiederhergestellt ist, wird er die Abfragen f\u00fcr die Auswahl fortsetzen und sich dem ISR anschlie\u00dfen, sobald er den Leader einholt. Zookeeper wird weiterhin Pings erhalten und annehmen, dass der Broker aktiv und gesund ist.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/976b7ff080ee6a6d76a165f614f40e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 23. Szenario 1. Der Broker wird aus dem ISR entfernt, wenn er innerhalb des Intervalls replica.lag.time.max.ms keine Auswahlanfrage erh\u00e4lt.<\/i><\/p>\n<p>Es gibt keine logische Trennung (Split-Brain) oder eine Unterbrechung des Knotens, wie es bei RabbitMQ der Fall ist. Stattdessen wird die Redundanz verringert. <\/p>\n<h3>Szenario 2. Der Leader sieht keinen einzigen Follower, sieht aber immer noch Zookeeper.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/ff6aaa053d73e8b7c97111979bcf97aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 24. Szenario 2. Leader und zwei Follower.<\/i><\/p>\n<p>Ein Verlust der Netzwerkverbindung trennt den Leader von den Followern, aber der Broker sieht immer noch Zookeeper. Wie im ersten Szenario wird der ISR komprimiert, aber diesmal nur bis zum Leader, da alle Follower aufh\u00f6ren, Auswahlanfragen zu senden. Auch hier gibt es keine logische Trennung. Stattdessen entsteht ein Verlust der Redundanz f\u00fcr neue Nachrichten, bis die Konnektivit\u00e4t wiederhergestellt ist. Zookeeper erh\u00e4lt weiterhin Pings und nimmt an, dass der Broker aktiv und gesund ist.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/3c69e8327da241407f76719fc022c37a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 25. Szenario 2. Der ISR hat sich nur bis zum Leader komprimiert.<\/i><\/p>\n<h3>Szenario 3. Der Follower sieht den Leader, aber nicht den Zookeeper<\/h3>\n<p>\nDer Follower trennt sich vom Zookeeper, bleibt jedoch mit dem Broker, der den Leader hat, verbunden. Infolgedessen f\u00fchrt der Follower weiterhin Abfrageanforderungen durch und bleibt Mitglied des ISR. Der Zookeeper erh\u00e4lt keine Pings mehr und registriert den Ausfall des Brokers, aber da es sich nur um einen Follower handelt, gibt es nach der Wiederherstellung keine Konsequenzen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/1183bcfe45a3225ae3ef1a0651f61350.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 26. Szenario 3. Der Follower sendet weiterhin Abfrageanforderungen an den Leader<\/i><\/p>\n<h3>Szenario 4. Der Leader sieht die Follower, aber nicht den Zookeeper<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/b3bf27fcb0eb806b27ad00f098e50a26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 27. Szenario 4. Leader und zwei Follower<\/i><\/p>\n<p>Der Leader ist vom Zookeeper getrennt, aber nicht von den Brokern mit den Followern. <\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/82d9f2e5868566678befc414d1885bfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 28. Szenario 4. Der Leader ist vom Zookeeper isoliert<\/i><\/p>\n<p>Nach einiger Zeit wird der Zookeeper den Ausfall des Brokers registrieren und den Controller dar\u00fcber informieren. Dieser wird unter den Followern einen neuen Leader ausw\u00e4hlen. Der urspr\u00fcngliche Leader wird jedoch weiterhin glauben, dass er der Leader ist, und weiterhin Eintr\u00e4ge mit <i>acks=1<\/i>. Da die Follower ihm keine Abfrageanforderungen mehr senden, wird er sie als tot betrachten und versuchen, das ISR auf sich selbst zu reduzieren. Aber da er keine Verbindung zum Zookeeper hat, wird er dies nicht tun k\u00f6nnen und in diesem Moment aufh\u00f6ren, weitere Eintr\u00e4ge zu empfangen. <\/p>\n<p>Nachrichten <i>acks=all<\/i> werden nicht best\u00e4tigt, da der ISR zun\u00e4chst alle Replikate einschlie\u00dft und die Nachrichten sie nicht erreichen. Wenn der urspr\u00fcngliche F\u00fchrer versucht, sie aus dem ISR zu entfernen, kann er dies nicht tun und h\u00f6rt ganz auf, irgendwelche Nachrichten zu empfangen.<\/p>\n<p>Die Clients bemerken bald den F\u00fchrungswechsel und fangen an, Nachrichten an den neuen Server zu senden. Sobald das Netzwerk wiederhergestellt ist, sieht der urspr\u00fcngliche F\u00fchrer, dass er nicht mehr der F\u00fchrer ist, und k\u00fcrzt sein Log auf den HW-Wert, den der neue F\u00fchrer zum Zeitpunkt des Ausfalls hatte, um Log-Divergenzen zu vermeiden. Dann beginnt er, Abfragen an den neuen F\u00fchrer zu senden. Alle Nachrichten des urspr\u00fcnglichen F\u00fchrers, die nicht an den neuen F\u00fchrer repliziert wurden, gehen verloren. Das bedeutet, dass Nachrichten, die in den paar Sekunden nicht vom urspr\u00fcnglichen F\u00fchrer best\u00e4tigt wurden, verloren gehen, als zwei F\u00fchrer aktiv waren.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/d88d6f33c13dccb814c0f206ec72512b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 29. Szenario 4. Der F\u00fchrer auf Broker 1 wird nach der Wiederherstellung des Netzwerks zum Folger.<\/i><\/p>\n<h3>Szenario 5. Der Folger ist vollst\u00e4ndig vom Rest der Kafka-Knoten und von Zookeeper getrennt.<\/h3>\n<p>\nDer Folger ist vollst\u00e4ndig isoliert von den anderen Kafka-Knoten und von Zookeeper. Er wird einfach aus dem ISR entfernt, bis das Netzwerk wiederhergestellt ist, und holt dann die anderen nach.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/b092607f777014fd945f18734dd7f4e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 30. Szenario 5. Isolierter Follower wird aus dem ISR entfernt<\/i><\/p>\n<h3>Szenario 6. Der Leader ist vollst\u00e4ndig von anderen Kafka-Knoten und Zookeeper isoliert<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/bb808d534dbf65748eb0b481f86b4926.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 31. Szenario 6. Leader und zwei Follower<\/i><\/p>\n<p>Der Leader ist vollst\u00e4ndig von seinen Followern, dem Controller und Zookeeper isoliert. F\u00fcr kurze Zeit wird er weiterhin Aufzeichnungen entgegennehmen von <i>acks=1<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/6fda78bcd26ef6b916579d447e9fb1f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 32. Szenario 6. Isolation des Leaders von anderen Kafka-Knoten und Zookeeper<\/i><\/p>\n<p>Wenn er nach Ablauf von <i>replica.lag.time.max.ms<\/i>keine Anfragen erh\u00e4lt, wird er versuchen, den ISR auf sich selbst zu reduzieren, wird dies jedoch nicht tun k\u00f6nnen, da keine Verbindung zu Zookeeper besteht. Dann h\u00f6rt er auf, Aufzeichnungen entgegenzunehmen. <\/p>\n<p>In der Zwischenzeit wird Zookeeper den isolierten Broker als tot markieren, und der Controller wird einen neuen Leader ausw\u00e4hlen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/73d611a411fc64d835af2c714e9eba0a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 33. Szenario 6. Zwei Leader<\/i><\/p>\n<p>Der urspr\u00fcngliche Leader kann f\u00fcr einige Sekunden Aufzeichnungen entgegennehmen, h\u00f6rt dann jedoch auf, Nachrichten zu akzeptieren. Die Clients werden alle 60 Sekunden mit den neuesten Metadaten aktualisiert. Sie werden \u00fcber den Wechsel des Leaders informiert und beginnen, Aufzeichnungen an den neuen Leader zu senden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/ae99380c8a84fac15f440b699b9c552b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 34. Szenario 6. Produzenten wechseln zu dem neuen Leader<\/i><\/p>\n<p>Alle best\u00e4tigten Eintr\u00e4ge, die seit dem Verlust der Konnektivit\u00e4t vom urspr\u00fcnglichen Leader gemacht wurden, gehen verloren. Sobald das Netzwerk wiederhergestellt ist, wird der urspr\u00fcngliche Leader \u00fcber Zookeeper feststellen, dass er nicht mehr der Leader ist. Dann wird er sein Log auf den Stand des neuen Leaders zum Zeitpunkt seiner Wahl zur\u00fcckschneiden und die Anfragen als Follower senden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ vs. Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/10f0983a829b03ca9bbc62e12cbf8a5d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Abb. 35. Szenario 6. Der urspr\u00fcngliche Leader wird nach der Wiederherstellung der Netzwerkverbindung Follower.<\/i><\/p>\n<p>In dieser Situation kann f\u00fcr einen kurzen Zeitraum eine logische Partition beobachtet werden, jedoch nur, wenn <i>acks=1<\/i> und <i>min.insync.replicas<\/i> auch 1. Die logische Partition wird automatisch beendet, entweder nach der Wiederherstellung des Netzwerks, wenn der urspr\u00fcngliche Leader erkennt, dass er nicht mehr der Leader ist, oder wenn alle Clients verstehen, dass der Leader gewechselt hat und beginnen, an den neuen Leader zu schreiben \u2013 je nachdem, was zuerst eintritt. In jedem Fall wird es zu einem Verlust einiger Nachrichten kommen, jedoch nur mit <i>acks=1<\/i>.<\/p>\n<p>Es gibt eine andere Variante dieses Szenarios, bei der die Follower kurz vor der Netzwerktrennung zur\u00fcckbleiben und der Leader das ISR auf sich selbst komprimiert. Dann isoliert er sich aufgrund von Verbindungsverlust. Ein neuer Leader wird gew\u00e4hlt, aber der urspr\u00fcngliche Leader nimmt weiterhin Aufzeichnungen an, da es im ISR niemanden au\u00dfer ihm gibt. Diese Aufzeichnungen gehen nach der Wiederherstellung des Netzwerks verloren. Der einzige Weg, um dieses Szenario zu vermeiden, ist <i>acks=all<\/i>min.insync.replicas = 2 <i>Szenario 7. Der Kafka-Controller sieht keinen anderen Kafka-Knoten<\/i>.<\/p>\n<h3>Im Allgemeinen kann der Controller nach einem Verbindungsverlust mit einem Kafka-Knoten ihm keine Informationen \u00fcber die \u00c4nderung des Leaders \u00fcbermitteln. Im schlimmsten Fall f\u00fchrt dies zu einer kurzfristigen logischen Trennung, wie im Szenario 6. In der Regel wird der Broker einfach kein Kandidat f\u00fcr die F\u00fchrung im Falle eines Ausfalls des letzten Knotens.<\/h3>\n<p>\nSzenario 8. Der Kafka-Controller sieht Zookeeper nicht<\/p>\n<h3>Szenario 8. Der Kafka-Controller kann Zookeeper nicht sehen<\/h3>\n<p>\nVon einem ausgefallenen Zookeeper-Controller erh\u00e4lt ein Kafka-Controller kein Ping mehr und w\u00e4hlt einen neuen Knoten aus. Der urspr\u00fcngliche Controller kann weiterhin so auftreten, erh\u00e4lt jedoch keine Benachrichtigungen von Zookeeper, weshalb er keine Aufgaben zu erledigen hat. Sobald das Netzwerk wiederhergestellt ist, erkennt er, dass er kein Controller mehr ist und nun ein normaler Kafka-Knoten geworden ist.<\/p>\n<h3>Ergebnisse aus den Szenarien<\/h3>\n<p>\nWir sehen, dass der Verlust der Konnektivit\u00e4t von Followern nicht zu einem Verlust von Nachrichten f\u00fchrt, sondern vor\u00fcbergehend die Redundanz verringert, bis das Netzwerk wiederhergestellt wird. Dies kann nat\u00fcrlich zu Datenverlust f\u00fchren, wenn ein oder mehrere Knoten verloren gehen.<\/p>\n<p>Wenn der Leader aufgrund von Verbindungsverlust vom Zookeeper getrennt wurde, kann dies zu einem Verlust von Nachrichten f\u00fchren. <i>acks=1<\/i>Das Fehlen der Verbindung zum Zookeeper verursacht eine kurzfristige logische Trennung mit zwei Leaders. Dieses Problem wird durch die Einstellung <i>acks=all<\/i>.<\/p>\n<p>Parameter <i>min.insync.replicas<\/i> in zwei oder mehr Replikaten gel\u00f6st, was zus\u00e4tzliche Garantien bietet, dass solche kurzfristigen Szenarien nicht zu einem Verlust von Nachrichten f\u00fchren, wie im Szenario 6.<\/p>\n<h1>Zusammenfassung zum Verlust von Nachrichten<\/h1>\n<p>\nLassen Sie uns alle M\u00f6glichkeiten auflisten, wie Daten in Kafka verloren gehen k\u00f6nnen:<\/p>\n<ul>\n<li>Jeder Ausfall des Leaders, wenn Nachrichten durch <i>acks=1<\/i>\n<\/li>\n<li>Jeder unsaubere Wechsel der F\u00fchrungsposition, d.h. zu einem Follower au\u00dferhalb des ISR, selbst unter <i>acks=all<\/i>\n<\/li>\n<li>Isolation des Leaders von Zookeeper, wenn Nachrichten durch <i>acks=1<\/i>\n<\/li>\n<li>Vollst\u00e4ndige Isolation des Leaders, der die ISR-Gruppe bereits auf sich selbst reduziert hat. Alle Nachrichten gehen verloren, selbst <i>acks=all<\/i>. Dies gilt nur, wenn <i>min.insync.replicas=1<\/i>.\n<\/li>\n<li>Gleichzeitige Ausf\u00e4lle aller Knoten eines Topics. Da Nachrichten im Speicher best\u00e4tigt werden, k\u00f6nnen einige m\u00f6glicherweise noch nicht auf die Festplatte geschrieben worden sein. Nach dem Neustart der Server k\u00f6nnten einige Nachrichten fehlen.<\/li>\n<\/ul>\n<p>\nUnsaubere F\u00fchrungswechsel k\u00f6nnen entweder durch deren Verbot oder durch Sicherstellung von Redundanz von mindestens zwei vermieden werden. Die robusteste Konfiguration ist eine Kombination aus <i>acks=all<\/i> und <i>min.insync.replicas<\/i> mehr als 1.<\/p>\n<h1>Direkter Vergleich der Zuverl\u00e4ssigkeit von RabbitMQ und Kafka<\/h1>\n<p>\nUm Zuverl\u00e4ssigkeit und hohe Verf\u00fcgbarkeit zu gew\u00e4hrleisten, implementieren beide Plattformen ein System der prim\u00e4ren und sekund\u00e4ren Replikation. Allerdings hat RabbitMQ eine Achillesferse. Bei der Wiederherstellung nach einem Ausfall verwerfen die Knoten ihre Daten, und die Synchronisierung wird blockiert. Diese Doppelbelastung wirft Fragen zur Langlebigkeit gro\u00dfer Warteschlangen in RabbitMQ auf. Sie m\u00fcssen entweder mit einer Verringerung der Redundanz oder mit langen Blockierungen leben. Eine Verringerung der Redundanz erh\u00f6ht das Risiko eines massiven Datenverlusts. Wenn die Warteschlangen jedoch klein sind, kann die Gew\u00e4hrleistung von Redundanz mit kurzen Downtime-Phasen (einige Sekunden) durch Wiederholungsversuche gemeistert werden.<\/p>\n<p>In Kafka gibt es dieses Problem nicht. Sie verwirft Daten nur an dem Punkt, an dem der Leader und der Follower nicht \u00fcbereinstimmen. Alle gemeinsamen Daten bleiben erhalten. Dar\u00fcber hinaus blockiert die Replikation das System nicht. Der Leader nimmt weiterhin Eingaben entgegen, w\u00e4hrend ein neuer Follower ihn einholt, sodass f\u00fcr DevOps das Hinzuf\u00fcgen oder Wiederherstellen des Clusters zu einer trivialen Aufgabe wird. Nat\u00fcrlich gibt es weiterhin Herausforderungen, wie etwa die Netzwerkbandbreite bei der Replikation. Wenn mehrere Follower gleichzeitig hinzugef\u00fcgt werden, k\u00f6nnte man auf Bandbreitenbeschr\u00e4nkungen sto\u00dfen.<\/p>\n<p>RabbitMQ \u00fcbertrifft Kafka in Bezug auf die Zuverl\u00e4ssigkeit beim gleichzeitigen Ausfall mehrerer Server im Cluster. Wie bereits erw\u00e4hnt, sendet RabbitMQ eine Best\u00e4tigung an den Publisher erst nach dem Speichern der Nachricht auf der Festplatte des Masters und aller Spiegel. Aber das f\u00fcgt eine zus\u00e4tzliche Verz\u00f6gerung aus zwei Gr\u00fcnden hinzu:<\/p>\n<ul>\n<li>fsync alle paar Hundert Millisekunden\n<\/li>\n<li>Das Versagen eines Spiegels wird erst nach Ablauf der Lebensdauer der Pakete bemerkt, die die Verf\u00fcgbarkeit jedes Knotens \u00fcberpr\u00fcfen (net tick). Wenn ein Spiegel verz\u00f6gert oder ausgefallen ist, f\u00fchrt das zu Verz\u00f6gerungen.<\/li>\n<\/ul>\n<p>\nKafka setzt darauf, dass wenn eine Nachricht auf mehreren Knoten gespeichert wird, Nachrichten best\u00e4tigt werden k\u00f6nnen, sobald sie in den Speicher gelangen. Dadurch entsteht das Risiko, Nachrichten jeglicher Art zu verlieren (auch <i>acks=all<\/i>, <i>min.insync.Replikate=2<\/i>) bei gleichzeitigen Ausf\u00e4llen.<\/p>\n<p>Insgesamt zeigt Kafka eine h\u00f6here Leistung und ist urspr\u00fcnglich f\u00fcr Cluster konzipiert. Die Anzahl der Follower kann auf bis zu 11 erh\u00f6ht werden, wenn dies f\u00fcr die Zuverl\u00e4ssigkeit erforderlich ist. Ein Replikationsfaktor von 5 und die minimale Anzahl der Replikate im synchronisierten Zustand <i>min.insync.replicas=3<\/i> machen den Verlust von Nachrichten zu einem sehr seltenen Ereignis. Wenn Ihre Infrastruktur einen solchen Replikationsfaktor und ein entsprechendes Ma\u00df an Redundanz gew\u00e4hrleisten kann, k\u00f6nnen Sie diese Option w\u00e4hlen.<\/p>\n<p>Die Clusterbildung von RabbitMQ eignet sich gut f\u00fcr kleine Warteschlangen. Aber selbst kleine Warteschlangen k\u00f6nnen bei hohem Traffic schnell anwachsen. Sobald die Warteschlangen gro\u00df werden, m\u00fcssen Sie eine harte Entscheidung zwischen Verf\u00fcgbarkeit und Zuverl\u00e4ssigkeit treffen. Die Clusterbildung von RabbitMQ ist am besten f\u00fcr untypische Situationen geeignet, in denen die Vorteile der Flexibilit\u00e4t von RabbitMQ die Nachteile seiner Clusterbildung \u00fcberwiegen.<\/p>\n<p>Eine der L\u00f6sungen f\u00fcr die Schwachstelle von RabbitMQ in Bezug auf gro\u00dfe Warteschlangen besteht darin, diese in mehrere kleinere zu unterteilen. Wenn die vollst\u00e4ndige Ordnung der gesamten Warteschlange nicht erforderlich ist, sondern nur die der relevanten Nachrichten (z. B. Nachrichten eines bestimmten Kunden), oder \u00fcberhaupt keine Ordnung erforderlich ist, ist diese Option akzeptabel: Sehen Sie sich mein Projekt an. <noindex><a rel=\"nofollow\" href=\"https:\/\/jack-vanlightly.com\/blog\/2018\/7\/22\/creating-consumer-groups-in-rabbitmq-with-rebalanser-part-1\">Rebalancer<\/a><\/noindex> zum Aufteilen der Warteschlange (das Projekt befindet sich noch in der fr\u00fchen Phase). <\/p>\n<p>Vergessen Sie schlie\u00dflich nicht die Reihe von Bugs in den Cluster- und Replikationsmechanismen sowohl bei RabbitMQ als auch bei Kafka. Mit der Zeit sind die Systeme reifer und stabiler geworden, aber keine Nachricht wird jemals zu 100 % vor dem Verlust gesch\u00fctzt sein! Au\u00dferdem gibt es in Rechenzentren gro\u00dffl\u00e4chige Ausf\u00e4lle!<\/p>\n<p>Wenn ich etwas \u00fcbersehen, einen Fehler gemacht habe oder Sie mit einer der Aussagen nicht einverstanden sind, z\u00f6gern Sie nicht, einen Kommentar zu hinterlassen oder mich zu kontaktieren.<\/p>\n<p>Oft werde ich gefragt: \u201eWas soll ich w\u00e4hlen, Kafka oder RabbitMQ?\u201c, \u201eWelche Plattform ist besser?\u201c. Die Wahrheit ist, dass es wirklich von Ihrer Situation, Ihrem derzeitigen Erfahrungsstand usw. abh\u00e4ngt. Ich m\u00f6chte nicht \u00fcberm\u00e4\u00dfig meinen Standpunkt \u00e4u\u00dfern, da es eine zu gro\u00dfe Vereinfachung w\u00e4re, eine einzige Plattform f\u00fcr alle Anwendungsf\u00e4lle und m\u00f6glichen Einschr\u00e4nkungen zu empfehlen. Ich habe diesen Artikelkreis geschrieben, um Ihnen zu helfen, sich eine eigene Meinung zu bilden.<\/p>\n<p>Ich m\u00f6chte anmerken, dass beide Systeme f\u00fchrend auf diesem Gebiet sind. Vielleicht bin ich etwas voreingenommen, denn aus der Erfahrung meiner Projekte neige ich dazu, Dinge wie die garantierte Reihenfolge von Nachrichten und Zuverl\u00e4ssigkeit mehr zu sch\u00e4tzen. <\/p>\n<p>Ich beobachte andere Technologien, denen diese Zuverl\u00e4ssigkeit und die garantierte Reihenfolge fehlt, schaue dann auf RabbitMQ und Kafka \u2014 und erkenne den unglaublichen Wert beider Systeme.<br \/>\n<br \/>Quelle: <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.0.1 - 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\/de\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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: Ausfallsicherheit und hohe Verf\u00fcgbarkeit | ProHoster","description":"In","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/rabbitmq-protiv-kafka-otkazoustojchivost-i-vysokaya-dostupnost","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/52541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=52541"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/52541\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=52541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=52541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=52541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}