{"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 gegen Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RabbitMQ gegen Kafka: Ausfallsicherheit und hohe Verf\u00fcgbarkeit\" src=\"\/wp-content\/uploads\/2019\/11\/6557ce69c2b3070622feca8b3c228b09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">im vorherigen Artikel<\/a><\/noindex> Wir haben die Clusterbildung von RabbitMQ zur Gew\u00e4hrleistung der Ausfallsicherheit und hohen Verf\u00fcgbarkeit betrachtet. Jetzt tauchen wir tiefer in Apache Kafka ein.<\/p>\n<p>Hier ist die Replikationseinheit die Partition. Jedes Thema hat ein oder mehrere Partitionen. In jeder Partition gibt es einen Leader mit oder ohne Follower. Bei der Erstellung eines Themas wird die Anzahl der Partitionen und der Replikationsfaktor angegeben. Ein h\u00e4ufig verwendeter 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 gegen 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 werden an den Leader gesendet. Follower senden dem Leader regelm\u00e4\u00dfig Anfragen nach den neuesten Nachrichten. Verbraucher wenden sich niemals an Follower; diese existieren nur f\u00fcr Redundanz und Ausfallsicherheit.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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>Ausfall einer Partition<\/h1>\n<p>\nWenn ein Broker ausf\u00e4llt, fallen h\u00e4ufig die Leader mehrerer Partitionen aus. In jeder von ihnen wird ein Follower von einem anderen Knoten zum Leader. Tats\u00e4chlich ist dies nicht immer so, da auch der Synchronisationsfaktor eine Rolle spielt: Gibt es synchronisierte Follower und wenn nicht, ist der \u00dcbergang zu einer unsynchronisierten Replikat erlaubt? Aber lass uns das vorerst nicht komplizieren.<\/p>\n<p>Broker 3 f\u00e4llt aus \u2014 und f\u00fcr Partition 2 wird ein neuer Leader auf Broker 2 gew\u00e4hlt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 stirbt, und sein Follower auf Broker 2 wird neuer Leader von Partition 2<\/i><\/p>\n<p>Dann f\u00e4llt Broker 1 aus und Partition 1 verliert ebenfalls ihren Leader, dessen Rolle auf Broker 2 \u00fcbergeht.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Nur ein Broker bleibt. Alle Leader befinden sich auf einem Broker mit null Redundanz<\/i><\/p>\n<p>Wenn Broker 1 ins Netzwerk zur\u00fcckkehrt, f\u00fcgt er vier Follower hinzu, sodass jedem Abschnitt eine gewisse Redundanz geboten wird. Aber alle Leader bleiben weiterhin auf Broker 2.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 bleiben weiterhin auf Broker 2.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Verteilung der Leader nach der Wiederherstellung der Broker 1 und 3<\/i><\/p>\n<p>Kafka verf\u00fcgt \u00fcber ein Werkzeug zur hochwertigeren Neubesetzung von Leadern als RabbitMQ. Dort musste ein externes Plugin oder Skript verwendet werden, das die Richtlinien zur Migration des Hauptknotens \u00e4nderte, um die Redundanz w\u00e4hrend der Migration zu verringern. Au\u00dferdem musste man sich bei gro\u00dfen Warteschlangen mit einer Unzug\u00e4nglichkeit w\u00e4hrend der Synchronisation abfinden.<\/p>\n<p>Kafka hat das Konzept der \"bevorzugten Replikate\" f\u00fcr die Rolle des Leaders. Wenn Partitionen eines Topics erstellt werden, versucht Kafka, die Leader gleichm\u00e4\u00dfig auf die Knoten zu verteilen und markiert diese ersten Leader als bevorzugt. Im Laufe der Zeit k\u00f6nnen die Leader aufgrund von Serverneustarts, Ausf\u00e4llen und Verbindungseinbu\u00dfen auf anderen Knoten landen, wie im vorher beschriebenen Extremfall.<\/p>\n<p>Um dies zu beheben, bietet Kafka zwei Optionen:<\/p>\n<ul>\n<li>Option <i>auto.leader.rebalance.enable=true<\/i> erm\u00f6glicht es dem Controller-Knoten, die Leader automatisch wieder auf die bevorzugten Replikate umzubenennen und somit die gleichm\u00e4\u00dfige Verteilung wiederherzustellen.\n<\/li>\n<li>Der Administrator kann das Skript <i>kafka-preferred-replica-election.sh<\/i> zum manuellen Umbenennen ausf\u00fchren.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 der Neubesetzung<\/i><\/p>\n<p>Dies war eine vereinfachte Version des Ausfalls, aber die Realit\u00e4t ist komplexer, obwohl hier nichts \u00fcberm\u00e4\u00dfig kompliziert ist. Alles h\u00e4ngt von den synchronisierten Replikaten (In-Sync Replicas, ISR) ab.<\/p>\n<h1>Synchronisierte Replikate (ISR)<\/h1>\n<p>\nISR ist eine Menge von Partitionen, die als \"synchronisiert\" (in-sync) gelten. Dabei gibt es einen Leader, und es k\u00f6nnen keine Follower vorhanden sein. Ein Follower gilt als synchronisiert, wenn er alle Nachrichten des Leaders rechtzeitig kopiert hat, bis der Zeitintervall <i>replica.lag.time.max.ms<\/i>.<\/p>\n<p>abgelaufen ist. Der Follower wird aus der ISR entfernt, wenn er:<\/p>\n<ul>\n<li>keine Abrufanfrage im Intervall gestellt hat <i>replica.lag.time.max.ms<\/i> (als tot geltend)\n<\/li>\n<li>im Intervall nicht rechtzeitig aktualisiert wurde <i>replica.lag.time.max.ms<\/i> (als langsam geltend)<\/li>\n<\/ul>\n<p>\nFollower stellen Abrufanfragen im Intervall <i>replica.fetch.wait.max.ms<\/i>, das standardm\u00e4\u00dfig 500 ms betr\u00e4gt.<\/p>\n<p>Um das Ziel von ISR klar zu erkl\u00e4ren, muss man sich die Best\u00e4tigungen vom Produzenten und einige Ausfallszenarien ansehen. Produzenten k\u00f6nnen w\u00e4hlen, wann der Broker eine Best\u00e4tigung sendet:<\/p>\n<ul>\n<li>acks=0, Best\u00e4tigung wird nicht gesendet\n<\/li>\n<li>acks=1, Best\u00e4tigung wird gesendet, nachdem der Leader die Nachricht in sein lokales Protokoll geschrieben hat\n<\/li>\n<li>acks=all, Best\u00e4tigung wird gesendet, nachdem alle Replikate in ISR die Nachricht in ihren lokalen Protokollen geschrieben haben<\/li>\n<\/ul>\n<p>\nIn der Terminologie von Kafka, wird eine Nachricht \u201ecommittet\u201c, wenn der ISR sie gespeichert hat. Acks=all ist die sicherste Option, bringt jedoch zus\u00e4tzliche Verz\u00f6gerung mit sich. Lassen Sie uns zwei Ausfallbeispiele betrachten und wie verschiedene Optionen &#8216;acks&#8217; mit dem Konzept des ISR interagieren.<\/p>\n<h3>Acks=1 und ISR<\/h3>\n<p>\nIn diesem Beispiel sehen wir, dass, wenn der Leader nicht darauf wartet, dass jede Nachricht von allen Followern gespeichert wird, bei einem Leader-Ausfall Daten verloren gehen k\u00f6nnen. Der Wechsel zu einem unsynchronisierten Follower kann durch die Einstellung erlaubt oder verweigert werden. <i>unclean.leader.election.enable<\/i>.<\/p>\n<p>In diesem Beispiel hat der Producer den Wert acks=1 eingestellt. Der Partition ist auf alle drei Broker verteilt. Broker 3 hinkt hinterher, synchronisierte sich vor acht Sekunden mit dem Leader und hat jetzt 7456 Nachrichten R\u00fcckstand. Broker 1 hat nur einen Sekunden R\u00fcckstand. Unser Producer sendet eine Nachricht und erh\u00e4lt schnell ack zur\u00fcck, ohne Overhead f\u00fcr langsame oder tote Follower, auf die der Leader nicht wartet.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Producer erh\u00e4lt einen Verbindungsfehler. Nach dem F\u00fchrungswechsel zu Broker 1 verlieren wir 123 Nachrichten. Der Follower auf Broker 1 war im ISR, hatte sich jedoch nicht vollst\u00e4ndig mit dem Leader synchronisiert, als dieser abst\u00fcrzte.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Nachrichtenverlust bei Ausfall<\/i><\/p>\n<p>In der Konfiguration <i>bootstrap.servers<\/i> sind mehrere Broker f\u00fcr den Producer aufgelistet, und er kann einen anderen Broker fragen, wer der neue Leader der Partition ist. Dann stellt er eine Verbindung zu Broker 1 her und sendet weiterhin Nachrichten.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Das Senden von Nachrichten wird nach einer kurzen Unterbrechung fortgesetzt<\/i><\/p>\n<p>Broker 3 hinkt noch weiter hinterher. Er stellt Anfragen zum Abrufen, kann sich jedoch nicht synchronisieren. Das kann mit einer langsamen Netzwerkverbindung zwischen den Brokern, Speicherproblemen usw. zu tun haben. Er wird aus dem ISR entfernt. Jetzt besteht der ISR nur noch aus einer Replik \u2014 dem Leader! Der Producer sendet weiterhin Nachrichten und erh\u00e4lt Best\u00e4tigungen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Follower auf Broker 3 wird aus dem ISR entfernt<\/i><\/p>\n<p>Broker 1 f\u00e4llt aus, und die F\u00fchrungsrolle wechselt zu Broker 3 mit dem Verlust von 15286 Nachrichten! Der Producer erh\u00e4lt eine Fehlermeldung zur Verbindung. Der Wechsel zu einem Leader au\u00dferhalb des ISR war nur wegen der Einstellung m\u00f6glich <i>unclean.leader.election.enable=true<\/i>. Wenn sie eingestellt ist auf <i>false<\/i>, dann w\u00fcrde kein \u00dcbergang stattfinden, und alle Lese- und Schreibanfragen w\u00e4ren abgelehnt worden. In diesem Fall warten wir auf die R\u00fcckkehr von Broker 1 mit seinen unber\u00fchrten Daten in der Replik, die erneut die F\u00fchrung \u00fcbernehmen wird.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 verbindet sich mit dem letzten Broker und sieht, dass dieser jetzt der F\u00fchrer der Partition ist. Er beginnt, Nachrichten an Broker 3 zu senden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Partition 0 gesendet.<\/i><\/p>\n<p>Wir haben gesehen, dass der Produzent kontinuierlich Nachrichten sendete, abgesehen von kurzen Unterbrechungen beim Einrichten neuer Verbindungen und der Suche nach einem neuen F\u00fchrer. Diese Konfiguration gew\u00e4hrleistet Verf\u00fcgbarkeit auf Kosten von Konsistenz (Datensicherheit). Kafka hat Tausende von Nachrichten verloren, aber weiterhin neue Eintr\u00e4ge entgegengenommen.<\/p>\n<h3>Acks=all und ISR<\/h3>\n<p>\nLassen Sie uns dieses Szenario noch einmal wiederholen, jedoch mit <i>acks=all<\/i>. Die Verz\u00f6gerung von Broker 3 betr\u00e4gt im Durchschnitt vier Sekunden. Der Produzent sendet eine Nachricht mit <i>acks=all<\/i>, und erh\u00e4lt jetzt keine schnelle Antwort. Der F\u00fchrer wartet, bis die Nachricht von allen Replikaten im ISR gespeichert wird.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 beim Schreiben f\u00fchrt.<\/i><\/p>\n<p>Nach vier zus\u00e4tzlichen Sekunden Verz\u00f6gerung sendet Broker 2 ein Ack. Alle Replikate sind nun vollst\u00e4ndig aktualisiert.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 die Nachrichten und senden ein Ack.<\/i><\/p>\n<p>Broker 3 hinkt nun noch weiter hinterher und wird aus dem ISR entfernt. Die Verz\u00f6gerung verringert sich erheblich, da es im ISR keine langsamen Replikate mehr gibt. Broker 2 wartet jetzt nur noch auf Broker 1, dessen durchschnittliche Verz\u00f6gerung 500 ms betr\u00e4gt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Replik auf Broker 3 wird aus dem ISR entfernt.<\/i><\/p>\n<p>Dann f\u00e4llt Broker 2 aus, und die F\u00fchrung wechselt zu Broker 1, ohne dass Nachrichten verloren gehen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Produzent findet einen neuen F\u00fchrer und beginnt, ihm Nachrichten zu senden. Die Verz\u00f6gerung verringert sich weiter, da der ISR nun aus einer einzigen Replik besteht! Daher f\u00fcgt die Option <i>acks=all<\/i> keine Redundanz hinzu.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Replik auf Broker 1 \u00fcbernimmt die F\u00fchrung, ohne Nachrichten zu verlieren.<\/i><\/p>\n<p>Dann f\u00e4llt Broker 1 aus, und die F\u00fchrung wechselt zu Broker 3 mit einem Verlust von 14.238 Nachrichten!<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 stirbt, und der F\u00fchrungswechsel mit unclean gesetzt f\u00fchrt zu erheblichen Datenverlusten.<\/i><\/p>\n<p>Wir h\u00e4tten die Option nicht setzen k\u00f6nnen <i>unclean.leader.election.enable<\/i> auf den Wert <i>true<\/i>. Standardm\u00e4\u00dfig betr\u00e4gt sie <i>false<\/i>. Einstellung <i>acks=all<\/i> c <i>unclean.leader.election.enable=true<\/i> stellt die Verf\u00fcgbarkeit mit etwas zus\u00e4tzlicher Datensicherheit sicher. Aber wie Sie sehen, k\u00f6nnen wir immer noch Nachrichten verlieren.<\/p>\n<p>Was ist jedoch, wenn wir die Datensicherheit erh\u00f6hen wollen? Man kann <i>unclean.leader.election.enable = false<\/i>, aber das sch\u00fctzt uns nicht unbedingt vor Datenverlust. Wenn der Leader hart abst\u00fcrzt und die Daten mit sich bringt, gehen die Nachrichten weiterhin verloren, zudem ist die Verf\u00fcgbarkeit verloren, bis der Administrator die Situation wiederherstellt.<\/p>\n<p>Es ist besser, die Redundanz aller Nachrichten zu garantieren, andernfalls auf die Aufzeichnung zu verzichten. Dann ist der Datenverlust aus Sicht des Brokers nur bei zwei oder mehr gleichzeitigen Ausf\u00e4llen m\u00f6glich.<\/p>\n<h3>Acks=alle, min.insync.replicas und ISR<\/h3>\n<p>\nMit der Topic-Konfiguration <i>min.insync.replicas<\/i> erh\u00f6hen wir das Niveau der 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 Leader Replica, und der Follower auf Broker 3 wurde aus dem ISR entfernt.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 st\u00fcrzt ab, und die F\u00fchrung wechselt zu Broker 1, ohne dass Nachrichten verloren gehen. Aber jetzt besteht der ISR nur aus einer Replica. Das entspricht nicht der minimalen Anzahl f\u00fcr Aufzeichnungen, und daher gibt Broker eine Fehlermeldung bei dem Versuch, eine Aufzeichnung zu schreiben. <i>NotEnoughReplicas<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 unter dem in min.insync.replicas angegebenen Wert.<\/i><\/p>\n<p>Diese Konfiguration opfert die Verf\u00fcgbarkeit f\u00fcr Konsistenz. Bevor wir eine Nachricht best\u00e4tigen, stellen wir sicher, dass sie auf mindestens zwei Replikaten gespeichert wird. Das gibt dem Produzenten viel mehr Sicherheit. Hier ist der Verlust von Nachrichten nur m\u00f6glich, wenn zwei Replikate gleichzeitig im kurzen Zeitraum ausfallen, w\u00e4hrend die Nachricht nicht an einen zus\u00e4tzlichen Follower repliziert wurde, was unwahrscheinlich ist. Wenn Sie jedoch super paranoid sind, k\u00f6nnen Sie einen Replikationsfaktor von 5 einstellen, und <i>min.insync.replicas<\/i> auf 3. Hier m\u00fcssen sofort drei Broker gleichzeitig ausfallen, um einen Eintrag zu verlieren! Nat\u00fcrlich zahlen Sie f\u00fcr diese Zuverl\u00e4ssigkeit mit zus\u00e4tzlicher Verz\u00f6gerung.<\/p>\n<h1>Wenn Verf\u00fcgbarkeit f\u00fcr Datensicherheit erforderlich ist<\/h1>\n<p>\nWie in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/471858\/\">im Fall von RabbitMQ<\/a><\/noindex>, ist manchmal die Verf\u00fcgbarkeit f\u00fcr die Datensicherheit erforderlich. Sie sollten Folgendes in Betracht ziehen:<\/p>\n<ul>\n<li>Kann der Publisher einfach einen Fehler zur\u00fcckgeben, und der \u00fcbergeordnete Dienst oder der Benutzer versucht es sp\u00e4ter erneut?\n<\/li>\n<li>Kann der Publisher die Nachricht lokal oder in einer Datenbank speichern, um einen sp\u00e4teren Versuch zu erm\u00f6glichen?<\/li>\n<\/ul>\n<p>\nWenn die Antwort negativ ist, erh\u00f6ht die Verf\u00fcgbarkeit die Datensicherheit. Sie verlieren weniger Daten, wenn Sie die Verf\u00fcgbarkeit anstelle von Schreibverweigerung w\u00e4hlen. Letztendlich kommt es darauf an, ein Gleichgewicht zu finden, und die Entscheidung h\u00e4ngt von der spezifischen Situation ab.<\/p>\n<h1>Bedeutung von ISR<\/h1>\n<p>\nDas ISR-Set erm\u00f6glicht es, ein optimales Gleichgewicht zwischen Datensicherheit und Verz\u00f6gerung zu w\u00e4hlen. Beispielsweise die Verf\u00fcgbarkeit im Falle eines Ausfalls der meisten Repliken zu gew\u00e4hrleisten, w\u00e4hrend der Einfluss toter oder langsamer Repliken in Bezug auf die Verz\u00f6gerung minimiert wird.<\/p>\n<p>Wir w\u00e4hlen den Wert selbst <i>replica.lag.time.max.ms<\/i> entsprechend unseren Bed\u00fcrfnissen. Im Grunde bedeutet dieser Parameter, welche Verz\u00f6gerung wir bei <i>acks=all<\/i>bereitschaft sind. Der Standardwert betr\u00e4gt zehn Sekunden. Wenn Ihnen das zu lange ist, k\u00f6nnen Sie ihn verk\u00fcrzen. In diesem Fall wird die H\u00e4ufigkeit der \u00c4nderungen im ISR steigen, da Nachfolger h\u00e4ufiger hinzugef\u00fcgt und entfernt werden.<\/p>\n<p>In RabbitMQ gibt es einfach eine Reihe von Spiegeln, die repliziert werden m\u00fcssen. Langsame Spiegel verursachen zus\u00e4tzliche Verz\u00f6gerungen, und auf die Antwort toter Spiegel kann gewartet werden, bis die Lebensdauer der Pakete abl\u00e4uft, die die Erreichbarkeit jedes Knotens \u00fcberpr\u00fcfen (net tick). ISR ist ein interessanter Weg, um diese Probleme mit erh\u00f6hten Verz\u00f6gerungen zu umgehen. Aber wir riskieren, Redundanz zu verlieren, da ISR nur bis zum F\u00fchrer verk\u00fcrzt werden kann. Um dieses Risiko zu vermeiden, verwenden Sie die Einstellung <i>min.insync.replicas<\/i>.<\/p>\n<h1>Kundenverbindungs-Garantie<\/h1>\n<p>\nIn den Einstellungen <i>bootstrap.servers<\/i> des Herstellers und des Verbrauchers k\u00f6nnen mehrere Broker f\u00fcr die Verbindung der Kunden angegeben werden. Die Idee ist, dass bei der Trennung eines Knotens mehrere Backup-Knoten bleiben, mit denen der Kunde eine Verbindung herstellen kann. Dies sind nicht unbedingt die F\u00fchrer der Partitionen, sondern einfach eine Grundlage f\u00fcr den initialen Load. Der Kunde kann sie fragen, auf welchem Knoten der F\u00fchrer der Partition f\u00fcr Lese- \/ Schreibzugriffe untergebracht ist.<\/p>\n<p>In RabbitMQ k\u00f6nnen sich Kunden mit jedem Knoten verbinden, und das interne Routing sendet die Anfrage dorthin, wo sie ben\u00f6tigt wird. Das bedeutet, dass Sie vor RabbitMQ einen Lastenausgleichsmechanismus installieren k\u00f6nnen. Kafka erfordert, dass sich die Kunden mit dem Knoten verbinden, auf dem der F\u00fchrer der entsprechenden Partition untergebracht ist. In dieser Situation kann kein Lastenausgleichsmechanismus installiert werden. Die Liste <i>bootstrap.servers<\/i> ist entscheidend, damit die Kunden auf die ben\u00f6tigten Knoten zugreifen und diese nach einem Ausfall finden k\u00f6nnen.<\/p>\n<h1>Kafka-Konsensusarchitektur<\/h1>\n<p>\nBis jetzt haben wir nicht betrachtet, wie der Cluster \u00fcber den Ausfall des Brokers informiert wird und wie ein neuer Leader ausgew\u00e4hlt wird. Um zu verstehen, wie Kafka mit Netzwerkpartitionen umgeht, m\u00fcssen wir zun\u00e4chst die Architektur des Konsenses verstehen.<\/p>\n<p>Jeder Kafka-Cluster wird zusammen mit einem Zookeeper-Cluster bereitgestellt \u2013 einem Service f\u00fcr verteilten Konsens, der es dem System erm\u00f6glicht, einen Konsens \u00fcber einen bestimmten Zustand zu erreichen, 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>Die Liste der Themen, Partitionen, Konfigurationen, aktuellen Leader-Repliken und bevorzugten Repliken.\n<\/li>\n<li>Cluster-Mitglieder. Jeder Broker pingt den Zookeeper-Cluster. Wenn dieser innerhalb eines festgelegten Zeitraums kein Ping erh\u00e4lt, wird der Broker als nicht verf\u00fcgbar eingestuft.\n<\/li>\n<li>Auswahl des Haupt- und Ersatzknotens f\u00fcr den Controller.<\/li>\n<\/ul>\n<p>\nDer Controller-Knoten ist einer der Kafka-Broker, der f\u00fcr die Wahl der Leader-Repliken verantwortlich ist. Zookeeper sendet dem Controller Benachrichtigungen \u00fcber die Mitgliedschaft im Cluster und \u00c4nderungen des Themas, und der Controller muss entsprechend diesen \u00c4nderungen handeln.<\/p>\n<p>Nehmen wir beispielsweise ein neues Thema mit zehn Partitionen und einem Replikationsfaktor von 3. Der Controller muss f\u00fcr jede Partition einen Leader ausw\u00e4hlen und dabei versuchen, die Leader gleichm\u00e4\u00dfig auf die Broker zu verteilen. <\/p>\n<p>F\u00fcr jede Partition aktualisiert der Controller:<\/p>\n<ul>\n<li>die Informationen in Zookeeper \u00fcber ISR und Leader;\n<\/li>\n<li>sendet jedem Broker, der eine Replik dieser Partition 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 und sendet dann den Befehl an jeden Broker, um sie \u00fcber die \u00c4nderung der F\u00fchrung zu informieren.<\/p>\n<p>Jeder Leader ist f\u00fcr eine Menge von ISR verantwortlich. Die Konfiguration <i>replica.lag.time.max.ms<\/i> bestimmt, wer dort hineinkommt. Wenn sich ISR \u00e4ndert, \u00fcbermittelt der Leader neue Informationen an Zookeeper.<\/p>\n<p>Zookeeper ist stets \u00fcber alle \u00c4nderungen informiert, sodass im Falle eines Ausfalls die F\u00fchrung nahtlos an den neuen Leader \u00fcbergehen kann.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Kafka-Konsens<\/i><\/p>\n<h1>Replikationsprotokoll<\/h1>\n<p>\nDas Verst\u00e4ndnis der Einzelheiten der Replikation hilft dabei, potenzielle Szenarien eines Datenverlusts besser zu verstehen.<\/p>\n<h3>Abfragen zum Abrufen, Log End Offset (LEO) und Highwater Mark (HW)<\/h3>\n<p>\nWir haben gesehen, dass Follower dem Leader periodisch Anfragen f\u00fcr die Abfrage (fetch) senden. Das Standardintervall betr\u00e4gt 500 ms. Dies unterscheidet sich von RabbitMQ, da bei RabbitMQ die Replikation nicht vom Spiegel der Warteschlange, sondern vom Master initiiert wird. Der Master pusht die \u00c4nderungen zu den Spiegeln.<\/p>\n<p>Der Leader und alle Follower speichern den Endoffset des Logs (Log End Offset, LEO) und das Highwater-Marke (HW). Der LEO speichert den Versatz der letzten Nachricht in der lokalen Replik, w\u00e4hrend HW den Versatz des letzten Commits enth\u00e4lt. Denken Sie daran, dass f\u00fcr den Status \u201eCommit\u201c die Nachricht in allen Replikaten des ISR gespeichert sein muss. Das bedeutet, dass LEO normalerweise etwas vor HW liegt.<\/p>\n<p>Wenn der Leader eine Nachricht erh\u00e4lt, speichert er diese lokal. Der Follower sendet eine Anfrage zur Abfrage, wobei er seinen LEO \u00fcbermittelt. Daraufhin sendet der Leader ein Paket von Nachrichten, beginnend mit diesem LEO, und \u00fcbertr\u00e4gt auch das aktuelle HW. Wenn der Leader die Information erh\u00e4lt, dass alle Replikate die Nachricht mit dem angegebenen Offset gespeichert haben, verschiebt er die HW-Markierung. Nur der Leader kann HW verschieben, und so erfahren alle Follower den aktuellen Wert in den Antworten auf ihre Anfragen. Das bedeutet, dass Follower sowohl im Hinblick auf die Nachrichten als auch hinsichtlich des Wissens um HW hinter dem Leader zur\u00fcckbleiben k\u00f6nnen. Verbraucher erhalten Nachrichten nur bis zum aktuellen HW.<\/p>\n<p>Bitte beachten Sie, dass \u201epersisted\u201c (persistiert) bedeutet, dass es im Speicher, nicht auf der Festplatte gespeichert ist. Um die Leistung zu optimieren, f\u00fchrt Kafka die Synchronisierung auf die Festplatte in bestimmten Intervallen durch. RabbitMQ hat ebenfalls ein solches Intervall, wird jedoch den Publisher erst benachrichtigen, nachdem der Master und alle Spiegel die Nachricht auf der Festplatte abgespeichert haben. Die Entwickler von Kafka haben aus Leistungsgr\u00fcnden beschlossen, die Best\u00e4tigung (ack) zu senden, sobald die Nachricht im Speicher abgelegt wurde. Kafka setzt darauf, dass Redundanz das Risiko des kurzfristigen Speicherns best\u00e4tigter Nachrichten nur im Speicher ausgleicht.<\/p>\n<h1>Leader-Ausfall<\/h1>\n<p>\nWenn der Leader ausf\u00e4llt, benachrichtigt Zookeeper den Controller, der dann eine neue Replik des Leaders ausw\u00e4hlt. Der neue Leader legt eine neue HW-Markierung gem\u00e4\u00df seinem LEO fest. Die Follower erhalten dann Informationen \u00fcber den neuen Leader. Je nach Version von Kafka w\u00e4hlt der Follower eines von zwei Szenarien:<\/p>\n<ol>\n<li>Er k\u00fcrzt das lokale Log auf das bekannte HW und sendet dem neuen Leader eine Anfrage nach Nachrichten nach diesem Offset.\n<\/li>\n<li>Sendet eine Anfrage an den Leader, um den HW zum Zeitpunkt seiner Wahl zum Leader zu erfahren, und schneidet dann das Log bis zu diesem Offset ab. Danach beginnt es, regelm\u00e4\u00dfige Abfragen zur Auswahl durchzuf\u00fchren, beginnend mit diesem Offset.<\/li>\n<\/ol>\n<p>\nEin Follower muss m\u00f6glicherweise das 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 sie als \"synchronisiert\" gelten, haben m\u00f6glicherweise nicht alle Nachrichten vom ehemaligen Leader erhalten. Es ist gut m\u00f6glich, dass der gew\u00e4hlte Follower nicht die aktuellste Kopie hat. Kafka garantiert, dass zwischen den Replikaten keine Diskrepanz besteht. Um Diskrepanzen zu vermeiden, muss jeder Follower sein Log bis zum HW des neuen Leaders zum Zeitpunkt seiner Wahl k\u00fcrzen. Dies ist ein weiterer Grund, warum die Konfiguration <i>acks=all<\/i> so wichtig f\u00fcr die Konsistenz ist.\n<\/li>\n<li>Nachrichten werden regelm\u00e4\u00dfig auf die Festplatte geschrieben. Wenn alle Knoten des Clusters gleichzeitig ausfallen, bleiben Replikate mit unterschiedlichem Offset auf den Festplatten zur\u00fcck. Es ist gut m\u00f6glich, dass, wenn die Broker wieder ins Netzwerk zur\u00fcckkehren, der neue Leader, der gew\u00e4hlt wird, hinter seinen Followern zur\u00fcckliegt, weil er sich fr\u00fcher auf die Festplatte gespeichert hat als andere.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Wiederverbindung mit dem Cluster<\/h3>\n<p>\nBei der Wiederverbindung mit dem Cluster verhalten sich die Replikate genauso wie bei einem Leader-Ausfall: Sie \u00fcberpr\u00fcfen die Leader-Replikate und schneiden ihr Log bis zu dessen HW (zum Zeitpunkt der Wahl) ab. Im Vergleich dazu betrachtet RabbitMQ wiederverbundene Knoten als v\u00f6llig neu. In beiden F\u00e4llen verwirft der Broker jeden bestehenden Zustand. Wenn eine automatische Synchronisation verwendet wird, muss der Master den gesamten aktuellen Inhalt in das neue Mirror auf eine \"und die ganze Welt soll warten\"-Weise replizieren. W\u00e4hrend dieses Vorgangs akzeptiert der Master keine Lese- oder Schreiboperationen. Dieser Ansatz schafft Probleme bei gro\u00dfen Warteschlangen.<\/p>\n<p>Kafka ist ein verteiltes Log, das insgesamt mehr Nachrichten speichert als eine RabbitMQ-Warteschlange, in der Daten nach ihrem Lesen aus der Warteschlange gel\u00f6scht werden. Aktive Warteschlangen m\u00fcssen relativ klein bleiben. Aber Kafka ist ein Log mit einer eigenen Aufbewahrungspolitik, die Fristen von Tagen oder Wochen festlegen kann. Der Ansatz mit Warteschlangen-Sperren und absoluter Synchronisation ist f\u00fcr ein verteiltes Log v\u00f6llig inakzeptabel. Stattdessen k\u00fcrzen Kafka-Folger ihr Log einfach bis zum HW-F\u00fchrer (zum Zeitpunkt seiner Wahl), wenn ihre Kopie dem F\u00fchrer voraus ist. Im wahrscheinlicheren Fall, wenn ein Folger hinterherhinkt, beginnt er einfach, Abfragen zu machen, beginnend mit seinem aktuellen LEO.<\/p>\n<p>Neue oder wiederverbundene Folger beginnen au\u00dferhalb des ISR und nehmen nicht an Commit-Operationen teil. Sie arbeiten einfach neben der Gruppe und empfangen Nachrichten so schnell, wie sie k\u00f6nnen, bis sie den F\u00fchrer einholen und im ISR landen. Hier gibt es keine Sperrung und es m\u00fcssen keine Daten verworfen werden.<\/p>\n<h1>Netzwerkunterbrechungen<\/h1>\n<p>\nKafka hat mehr Komponenten als RabbitMQ, daher gibt es hier ein komplexeres Verhalten, wenn die Konnektivit\u00e4t im Cluster gest\u00f6rt ist. Aber Kafka wurde von Anfang an f\u00fcr Cluster entworfen, sodass die L\u00f6sungen 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. Ein Folger sieht den F\u00fchrer nicht, sieht aber immer noch Zookeeper.\n<\/li>\n<li>Szenario 2. Der F\u00fchrer sieht keinen Folger, sieht aber immer noch Zookeeper.\n<\/li>\n<li>Szenario 3. Ein Folger sieht den F\u00fchrer, sieht aber Zookeeper nicht.\n<\/li>\n<li>Szenario 4. Der F\u00fchrer sieht die Folger, sieht aber Zookeeper nicht.\n<\/li>\n<li>Szenario 5. Ein Folger ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper getrennt.\n<\/li>\n<li>Szenario 6. Der F\u00fchrer ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper getrennt.\n<\/li>\n<li>Szenario 7. Der Kafka-Controller-Knoten 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 ist ein spezifisches Verhalten vorgesehen.<\/p>\n<h3>Szenario 1. Ein Folger sieht den F\u00fchrer nicht, sieht aber immer noch Zookeeper<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ gegen 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 den Brokern 1 und 2, aber nicht von Zookeeper. Broker 3 kann keine Abfragen mehr senden. Nach Ablauf der Zeit. <i>replica.lag.time.max.ms<\/i> Er entfernt sich aus dem ISR und nimmt nicht an den Commit-Nachrichten teil. Sobald die Konnektivit\u00e4t wiederhergestellt ist, wird er die Abfragen wieder aufnehmen und sich dem ISR anschlie\u00dfen, sobald er den Leader eingeholt hat. Zookeeper wird weiterhin Pings erhalten und annehmen, dass der Broker lebt und gesund ist.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 innerhalb des Intervalls replica.lag.time.max.ms keine Abfrage empfangen wurde.<\/i><\/p>\n<p>Es gibt keine logische Trennung (Split-Brain) oder Anhalten des Knotens, wie bei RabbitMQ. 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 gegen 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>Eine Unterbrechung der Netzwerkverbindung trennt den Leader von den Followern, aber der Broker sieht weiterhin Zookeeper. Wie im ersten Szenario wird das ISR komprimiert, aber diesmal nur bis zum Leader, da alle Follower aufh\u00f6ren, Abfragen zu senden. Wieder gibt es keine logische Trennung. Stattdessen gibt es einen Verlust der Redundanz f\u00fcr neue Nachrichten, bis die Konnektivit\u00e4t wiederhergestellt ist. Zookeeper empf\u00e4ngt weiterhin Pings und h\u00e4lt den Broker f\u00fcr lebendig und gesund.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Das ISR hat sich nur bis zum Leader komprimiert.<\/i><\/p>\n<h3>Szenario 3. Der Follower sieht den Leader, sieht aber Zookeeper nicht.<\/h3>\n<p>\nDer Follower trennt sich von Zookeeper, nicht aber vom Broker mit dem Leader. Infolgedessen sendet der Follower weiterhin Abfragen und bleibt Mitglied des ISR. Zookeeper erh\u00e4lt keine Pings mehr und registriert den Ausfall des Brokers, aber da es nur ein Follower ist, gibt es nach der Wiederherstellung keine Konsequenzen.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Abfragen an den Leader.<\/i><\/p>\n<h3>Szenario 4. Der Leader sieht die Follower, sieht aber Zookeeper nicht.<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ gegen 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 von Zookeeper getrennt, nicht aber von den Brokern mit den Followern. <\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 von Zookeeper isoliert.<\/i><\/p>\n<p>Nach einiger Zeit wird Zookeeper den Ausfall des Brokers registrieren und den Controller benachrichtigen. Dieser wird einen neuen Leader aus den Followern ausw\u00e4hlen. Der urspr\u00fcngliche Leader wird jedoch weiterhin denken, dass er der Leader ist und weiterhin Aufzeichnungen annehmen. <i>acks=1<\/i>. Die Follower senden ihm keine Abfragen mehr, daher wird er sie als tot betrachten und versuchen, das ISR auf sich selbst zu komprimieren. Da er jedoch keine Verbindung zu Zookeeper hat, kann er dies nicht tun und wird in diesem Moment aufh\u00f6ren, Aufzeichnungen anzunehmen. <\/p>\n<p>Nachrichten <i>acks=all<\/i> Sie erhalten keine Best\u00e4tigung, weil der ISR zun\u00e4chst alle Replikate umfasst und die Nachrichten sie nicht erreichen. Wenn der urspr\u00fcngliche Leader versucht, sie aus dem ISR zu entfernen, kann er dies nicht tun und h\u00f6rt auf, irgendwelche Nachrichten zu empfangen.<\/p>\n<p>Die Clients bemerken bald den Wechsel des Leaders und beginnen, Aufzeichnungen an den neuen Server zu senden. Sobald das Netzwerk wiederhergestellt ist, sieht der urspr\u00fcngliche Leader, dass er nicht mehr Leader ist, und schneidet sein Log auf den HW-Wert, den der neue Leader zum Zeitpunkt des Ausfalls hatte, um eine Log-Abweichung zu vermeiden. Dann beginnt er, Anfragen an den neuen Leader zu senden. Alle Aufzeichnungen des urspr\u00fcnglichen Leaders, die nicht an den neuen Leader repliziert wurden, gehen verloren. Das hei\u00dft, es gehen Nachrichten verloren, die in den wenigen Sekunden, in denen zwei Leader aktiv waren, nicht vom urspr\u00fcnglichen Leader best\u00e4tigt wurden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Leader auf Broker 1 wird nach der Wiederherstellung des Netzwerks zu einem Follower<\/i><\/p>\n<h3>Szenario 5. Der Follower ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper isoliert<\/h3>\n<p>\nDer Follower ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper isoliert. Er wird einfach aus dem ISR entfernt, bis das Netzwerk wiederhergestellt ist, und holt dann die anderen ein.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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. Der isolierte Follower wird aus dem ISR entfernt<\/i><\/p>\n<h3>Szenario 6. Der Leader ist vollst\u00e4ndig von anderen Kafka-Knoten und von Zookeeper isoliert<\/h3>\n<p>\n<img decoding=\"async\" alt=\"RabbitMQ gegen 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 eine kurze Zeit wird er weiterhin Aufzeichnungen empfangen von <i>acks=1<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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>Nachdem er keine Anfragen erhalten hat, <i>replica.lag.time.max.ms<\/i>, wird er versuchen, den ISR auf sich selbst zu komprimieren, kann dies aber nicht tun, da keine Verbindung zu Zookeeper besteht, also h\u00f6rt er auf, Aufzeichnungen anzunehmen. <\/p>\n<p>In der Zwischenzeit wird Zookeeper den isolierten Broker als tot markieren, und der Controller w\u00e4hlt einen neuen Leader aus.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 empfangen, h\u00f6rt dann aber auf, irgendwelche Nachrichten anzunehmen. 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 gegen 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 der urspr\u00fcngliche Leader seit dem Verlust der Verbindungsf\u00e4higkeit gemacht hat, gehen verloren. Sobald das Netzwerk wiederhergestellt ist, wird der urspr\u00fcngliche Leader \u00fcber Zookeeper feststellen, dass er nicht mehr Leader ist. Er wird dann sein Protokoll bis zum HW des neuen Leaders zum Zeitpunkt der Wahl k\u00fcrzen und beginnt, Anfragen als Follower zu senden.<\/p>\n<p><img decoding=\"async\" alt=\"RabbitMQ gegen 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 Follower nach der Wiederherstellung der Netzwerkverbindung<\/i><\/p>\n<p>In dieser Situation kann f\u00fcr einen kurzen Zeitraum eine logische Trennung beobachtet werden, aber nur wenn <i>acks=1<\/i> und <i>min.insync.replicas<\/i> auch 1. Die logische Trennung endet automatisch entweder nach der Wiederherstellung des Netzwerks, wenn der urspr\u00fcngliche Leader versteht, dass er nicht mehr 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 werden einige Nachrichten verloren gehen, aber nur mit <i>acks=1<\/i>.<\/p>\n<p>Es gibt eine andere M\u00f6glichkeit dieses Szenarios, bei der die Follower kurz vor der Netzwerktrennung zur\u00fcckgefallen sind und der Leader ISR auf nur sich selbst komprimiert hat. Dann isoliert er sich aufgrund des Verlusts der Verbindung. Ein neuer Leader wird gew\u00e4hlt, aber der urspr\u00fcngliche Leader akzeptiert weiterhin Eintr\u00e4ge, selbst <i>acks=all<\/i>, weil au\u00dfer ihm niemand im ISR ist. Diese Eintr\u00e4ge gehen nach der Wiederherstellung des Netzwerks verloren. Der einzige Weg, dieses Szenario zu vermeiden, ist <i>min.insync.replicas = 2<\/i>.<\/p>\n<h3>Szenario 7. Kafka-Controller sieht keinen anderen Kafka-Knoten<\/h3>\n<p>\nIm Allgemeinen kann der Controller nach dem Verlust der Verbindung zu einem Kafka-Knoten diesem keine Informationen \u00fcber den Wechsel des Leaders \u00fcbermitteln. Im schlimmsten Fall f\u00fchrt dies zu einer kurzfristigen logischen Trennung, wie in Szenario 6. Am h\u00e4ufigsten wird der Broker einfach kein Kandidat f\u00fcr die F\u00fchrungsposition im Falle eines Ausfalls des letzten.<\/p>\n<h3>Szenario 8. Kafka-Controller sieht Zookeeper nicht<\/h3>\n<p>\nDer abgetrennte Zookeeper-Controller erh\u00e4lt kein Pinging und w\u00e4hlt einen neuen Kafka-Knoten als Controller. Der urspr\u00fcngliche Controller kann weiterhin als solcher auftreten, erh\u00e4lt jedoch keine Benachrichtigungen von Zookeeper, sodass er keine Aufgaben auszuf\u00fchren hat. Sobald das Netzwerk wiederhergestellt ist, wird er verstehen, dass er kein Controller mehr ist, sondern ein gew\u00f6hnlicher Kafka-Knoten geworden ist.<\/p>\n<h3>Schlussfolgerungen aus den Szenarien<\/h3>\n<p>\nEs ist zu beobachten, dass der Verlust der Konnektivit\u00e4t von Followern nicht zu einem Verlust von Nachrichten f\u00fchrt, sondern lediglich vor\u00fcbergehend die Redundanz verringert, bis das Netzwerk wiederhergestellt ist. Dies kann nat\u00fcrlich zu Datenverlust f\u00fchren, wenn ein oder mehrere Knoten verloren gehen.<\/p>\n<p>Wenn durch den Verlust der Konnektivit\u00e4t der Leader vom Zookeeper getrennt wird, kann dies zu einem Verlust von Nachrichten f\u00fchren mit <i>acks=1<\/i>. Der Verlust der Verbindung zum Zookeeper f\u00fchrt zu einer vor\u00fcbergehenden logischen Trennung zwischen zwei Leaders. Dieses Problem wird durch den Parameter <i>acks=all<\/i>.<\/p>\n<p>Parameter <i>min.insync.replicas<\/i> in zwei oder mehr Replikate erm\u00f6glicht zus\u00e4tzliche Garantien, 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 Wege auflisten, wie man Daten in Kafka verlieren kann:<\/p>\n<ul>\n<li>Jeglicher Ausfall des Leaders, wenn Nachrichten mit Hilfe von <i>acks=1<\/i>\n<\/li>\n<li>Best\u00e4tigt wurden. Jeglicher unrein (unclean) F\u00fchrungswechsel, d.h. zu einem Follower au\u00dferhalb von ISR, selbst mit <i>acks=all<\/i>\n<\/li>\n<li>Die Isolation des Leaders vom Zookeeper, wenn Nachrichten mit Hilfe von <i>acks=1<\/i>\n<\/li>\n<li>vollst\u00e4ndiger Isolation des Leaders, der die ISR-Gruppe bereits auf sich selbst komprimiert hat. Es werden alle Nachrichten verloren gehen, 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 Segments. Da Nachrichten aus dem Speicher best\u00e4tigt werden, k\u00f6nnten einige noch nicht auf die Festplatte geschrieben sein. Nach dem Neustart der Server k\u00f6nnte es an einigen Nachrichten fehlen.<\/li>\n<\/ul>\n<p>\nUnreine F\u00fchrungswechsel k\u00f6nnen vermieden werden, indem sie entweder verboten oder eine Redundanz von mindestens zwei gew\u00e4hrleistet wird. Die robusteste Konfiguration ist eine Kombination von <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. RabbitMQ hat jedoch eine Achillesferse. Bei der Wiederverbindung nach einem Ausfall verwerfen die Knoten ihre Daten, und die Synchronisation wird blockiert. Dieser doppelte Schlag gef\u00e4hrdet die Langlebigkeit gro\u00dfer Warteschlangen in RabbitMQ. Sie m\u00fcssen sich entweder mit einer Verringerung der Redundanz oder mit langen Blockaden abfinden. Eine Verringerung der Redundanz erh\u00f6ht das Risiko eines massiven Datenverlusts. Wenn die Warteschlangen jedoch klein sind, kann man mit kurzen Zeitr\u00e4umen der Nichtverf\u00fcgbarkeit (einige Sekunden) durch mehrfache Verbindungsversuche die Redundanz aufrechterhalten.<\/p>\n<p>In Kafka gibt es dieses Problem nicht. Sie verwirft Daten nur an dem Punkt der Divergenz zwischen dem Leader und dem Follower. Alle gemeinsamen Daten werden gespeichert. Au\u00dferdem blockiert die Replikation das System nicht. Der Leader verarbeitet weiterhin Aufzeichnungen, w\u00e4hrend ein neuer Follower ihn einholt, sodass das Beitreten oder Wiederbeitreten zum Cluster f\u00fcr DevOps zu einer trivialen Aufgabe wird. Nat\u00fcrlich bleiben Probleme wie die Bandbreite des Netzwerks bei der Replikation bestehen. Wenn mehrere Follower gleichzeitig hinzugef\u00fcgt werden, kann es zu einer Erreichungsgrenze kommen.<\/p>\n<p>RabbitMQ \u00fcbertrifft Kafka in der Zuverl\u00e4ssigkeit beim gleichzeitigen Ausfall mehrerer Server im Cluster. Wie bereits erw\u00e4hnt, sendet RabbitMQ dem Publisher eine Best\u00e4tigung nur, nachdem die Nachricht auf der Festplatte beim Master und allen Spiegeln gespeichert wurde. Dies f\u00fchrt jedoch aus zwei Gr\u00fcnden zu einer zus\u00e4tzlichen Verz\u00f6gerung:<\/p>\n<ul>\n<li>fsync alle paar Hundert Millisekunden\n<\/li>\n<li>Den Ausfall eines Spiegels kann man erst nach Ablauf der Lebensdauer der Pakete bemerken, die die Verf\u00fcgbarkeit jedes Knotens pr\u00fcfen (net tick). Wenn ein Spiegel langsamer wird oder ausf\u00e4llt, erh\u00f6ht sich die Verz\u00f6gerung.<\/li>\n<\/ul>\n<p>\nKafka setzt darauf, dass, wenn eine Nachricht auf mehreren Knoten gespeichert wird, die Best\u00e4tigungen erfolgen k\u00f6nnen, sobald sie im Speicher landen. Dadurch entsteht das Risiko, dass Nachrichten jeglicher Art verloren gehen (sogar <i>acks=all<\/i>, <i>min.insync.Replikate=2<\/i>) im Falle eines gleichzeitigen Ausfalls.<\/p>\n<p>Insgesamt zeigt Kafka eine h\u00f6here Leistung und wurde urspr\u00fcnglich f\u00fcr Cluster konzipiert. Die Anzahl der Follower kann auf bis zu 11 erh\u00f6ht werden, wenn dies aus Zuverl\u00e4ssigkeitsgr\u00fcnden erforderlich ist. Ein Replikationsfaktor von 5 und eine minimale Anzahl synchronisierter Replikate <i>min.insync.replicas=3<\/i> machen den Verlust von Nachrichten zu einem sehr seltenen Ereignis. Wenn Ihre Infrastruktur diese Replikationsrate und den Redundanzgrad gew\u00e4hrleisten kann, k\u00f6nnen Sie diese Option w\u00e4hlen.<\/p>\n<p>Die Clusterbildung von RabbitMQ ist gut f\u00fcr kleine Warteschlangen. Aber selbst kleine Warteschlangen k\u00f6nnen bei hohem Traffic schnell wachsen. Sobald die Warteschlangen gro\u00df werden, m\u00fcssen schwierige Entscheidungen zwischen Verf\u00fcgbarkeit und Zuverl\u00e4ssigkeit getroffen werden. Die Clusterbildung von RabbitMQ ist am besten f\u00fcr nicht allt\u00e4gliche Situationen geeignet, in denen die Vorteile der Flexibilit\u00e4t von RabbitMQ alle Nachteile seiner Clusterbildung \u00fcberwiegen.<\/p>\n<p>Eines der Gegenmittel gegen die Schwachstelle von RabbitMQ in Bezug auf gro\u00dfe Warteschlangen besteht darin, sie in viele kleinere aufzuteilen. Wenn eine vollst\u00e4ndige Reihenfolge der gesamten Warteschlange nicht erforderlich ist, sondern nur f\u00fcr die entsprechenden Nachrichten (z. B. Nachrichten eines bestimmten Kunden), oder wenn \u00fcberhaupt keine Reihenfolge erforderlich ist, ist diese Option akzeptabel: Schauen 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\">Rebalanser<\/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 Vielzahl von Bugs in den Cluster- und Replikationsmechanismen sowohl von RabbitMQ als auch von Kafka. Im Laufe der Zeit sind die Systeme reifer und stabiler geworden, aber keine Nachricht wird jemals zu 100 % vor Verlust gesch\u00fctzt sein! Dar\u00fcber hinaus gibt es in Rechenzentren gro\u00dffl\u00e4chige Ausf\u00e4lle!<\/p>\n<p>Wenn ich etwas \u00fcbersehen habe, einen Fehler gemacht habe oder Sie mit einer der Behauptungen nicht einverstanden sind, z\u00f6gern Sie nicht, einen Kommentar zu hinterlassen oder mich zu kontaktieren.<\/p>\n<p>Ich werde oft gefragt: \u201eWas soll man w\u00e4hlen, Kafka oder RabbitMQ?\u201c, \u201eWelche Plattform ist besser?\u201c. Die Wahrheit ist, dass es wirklich von Ihrer Situation, Ihren aktuellen Erfahrungen usw. abh\u00e4ngt. Ich scheue mich, meine Meinung zu \u00e4u\u00dfern, da es eine erhebliche Vereinfachung w\u00e4re, eine einzige Plattform f\u00fcr alle Anwendungsf\u00e4lle und potenziellen Einschr\u00e4nkungen zu empfehlen. Ich habe diese Artikelreihe geschrieben, damit Sie sich eine eigene Meinung bilden k\u00f6nnen.<\/p>\n<p>Ich m\u00f6chte sagen, dass beide Systeme f\u00fchrend auf diesem Gebiet sind. M\u00f6glicherweise bin ich ein wenig voreingenommen, da ich aus meinen Projekterfahrungen st\u00e4rker dazu neige, solche Dinge wie die garantierte Reihenfolge von Nachrichten und Zuverl\u00e4ssigkeit zu sch\u00e4tzen. <\/p>\n<p>Ich sehe andere Technologien, denen diese Zuverl\u00e4ssigkeit und garantierte Reihenfolge fehlen, und schaue dann auf RabbitMQ und Kafka \u2013 und verstehe 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.2 - 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.2\" \/>\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 gegen Kafka: Failover und hohe Verf\u00fcgbarkeit | ProHoster","description":"Im","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}]}}