Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Registrieren eines kostenlosen Accounts finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch spezifische Werte für Ihre Cloud-Umgebung.
Kafka- und Zookeeper-Cluster ohne Ausfallzeit migrieren
Einführung
Viele Services (Cloud-nativ oder On-Premises) verwenden Kafka-Cluster für ihre asynchronen Messaging-Anforderungen, da es sich um eine Messaging-Technologie handelt, die gut skaliert werden kann. Aufgrund von Geschäftsanforderungen kann es zu Situationen kommen, in denen Sie eine Gruppe von Knoten oder das gesamte Cluster ersetzen müssen. In diesem Tutorial wird die Migration von Kafka- und Zookeeper-Cluster auf eine neue Gruppe von Knoten ohne Ausfallzeit beschrieben.
Die Problemstellung
Warum kann es eine Herausforderung sein, einen Knoten in einem Cluster durch einen anderen zu ersetzen? Das Hinzufügen oder Entfernen eines Knotens aus einer Gruppe von Knoten hinter einem Load Balancer ist allgegenwärtig: Fügen Sie einen neuen Knoten hinzu, entfernen Sie den zu entfernenden vorhandenen Knoten, beenden Sie alle aktiven Verbindungen, fahren Sie ihn herunter, entfernen Sie ihn aus der Load Balancer-Konfiguration usw.
Die eigentliche Herausforderung liegt in der staatlichen Verwaltung mit einer Anwendung. In der Regel sind Anwendungen zustandslos und delegieren die Zustandspersistenz an ein Datenmanagementsystem, z. B. ein relationales Datenbankmanagementsystem (RDBMS). Im Gegensatz zu solchen Anwendungen verwalten sowohl Kafka als auch Zookeeper den Status lokal, d.h. die Statuspersistenz erfolgt über lokale Datenträger. Das heißt, wir können einen Knoten nicht einfach durch einen anderen ersetzen, ohne den lokalen Status des vorhandenen Knotens zu berücksichtigen.
Außerdem startet das einfache Hinzufügen eines Knotens im Falle von Kafka nicht automatisch ein Rebalancing der Workload, d.h. eine Neuverteilung von Topic-Partitionen über Broker hinweg. Der neue Knoten nimmt nur an der Workload-Freigabe für neue Themen teil, die ab diesem Zeitpunkt erstellt wurden.
Ein operatives Problem bei quorumbasierten Systemen (in diesem Fall Zookeeper) besteht darin, dass sie die Clustergröße im Voraus kennen müssen. Dies bedeutet, dass jeder Knoten über alle anderen Knoten im Cluster verfügen muss. Wenn Sie mehr als einen Knoten hinzufügen (die genaue Anzahl hängt von der vorhandenen Clustergröße ab), müssen Sie sicherstellen, dass einer der neu hinzugefügten Knoten nicht zum Leader wird. Andernfalls verlieren wir die Daten.
Ziele
- Migrieren Sie Kafka- und Zookeeper-Cluster ohne Ausfallzeit zu einer anderen Gruppe von Knoten.
Voraussetzungen
- Verständnis der Kafka- und Zookeeper-Architektur.
Kafka-Cluster migrieren
Das Ersetzen von Knoten im Kafka-Cluster ist relativ einfach. Fügen Sie neue Broker hinzu, und rufen Sie die Migration von Themenpartitionen auf. Sobald die Migration abgeschlossen ist, können wir den alten Broker außer Betrieb setzen. Kafka stellt admin-API für die Durchführung der Partitionsmigration bereit. Die alterPartitionReassignments
fügt einem Thema zusätzliche Partitionsreplikate hinzu, wartet darauf, dass sie Mitglied von ISR werden, und tauscht dann den Partitionsleiter aus.
Sie müssen neue Themenpartitionszuweisungen zu alten Brokern deaktivieren (wenn Anwendungslogik zur Laufzeit Themen erstellt), andernfalls würde dies zu einer endlosen Schleife der Migration werden. Um dies zu erreichen, können Sie eine Variante der Themenerstellungs-API verwenden, in der wir die Partitionszuweisung selbst angeben können. Nachfolgend finden Sie einen Beispielalgorithmus.
-
Angesichts eines zu erstellenden Themas und einer Gruppe von Broker-IDs, denen keine Partition oder Replikat zugewiesen werden sollte: Topic-Partitionen und ihre Replikate werden den verbleibenden Brokern Round-Robin-Verfahren zugewiesen. Es wird davon ausgegangen, dass Broker-IDs sequenziell in ADs und dann in FDs erstellt werden. Beispiel: Angenommen, es gibt 3 ADs (AD-1,AD-2,AD-3) und jede AD hat 2 FDs (FD-1,FD-2) und es gibt 6 Broker mit IDs (1-6), dann werden sie in der folgenden Reihenfolge platziert.
broker ID 1 -> AD-1, FD-1 broker ID 2 -> AD-2, FD-1 broker ID 3 -> AD-3, FD-1 broker ID 4 -> AD-1, FD-2 broker ID 5 -> AD-2, FD-2 broker ID 6 -> AD-3, FD-2
-
Dies hilft beim Platzieren einer Partition und ihrer Replikate in verschiedenen Fehlerdomänen. Der Algorithmus ist wie folgt: Wir sortieren die Broker-IDs und beginnen mit einer zufällig ausgewählten ID für die Platzierung nacheinander. Beispiel: Bei einem Topic mit 3 Partitionen und Replikationsfaktor 3 und der zufällig ausgewählten Broker-ID 3 wird die Platzierungsreihenfolge für Partitionen oder Replikate verwendet.
partition-0, replica-0 -> 3 partition-0, replica-1 -> 4 partition-0, replica-2 -> 5 partition-1, replica-0 -> 4 partition-1, replica-1 -> 5 partition-1, replica-2 -> 6 partition-2, replica-0 -> 5 partition-2, replica-1 -> 6 partition-2, replica-2 -> 1
Allgemeine Schritte für die Migration, die mit der Buchhaltung befolgt werden können (für den Neustart im Falle eines Migrationsprozesses in der Mitte gestoppt oder nicht erfolgreich).
-
Assert old to new broker ID Zuordnung angegeben und abgeschlossen.
-
Verwenden Sie
AdminClient
, um zu prüfen, ob neue Broker verfügbar sind. Wenn nicht alle verfügbar sind, Fehler auslösen und beenden. -
Verwenden Sie
AdminClient
, um zu prüfen, ob das Thema<kafka_topic_migration>
im Cluster vorhanden ist.- Wenn Thema
<kafka_topic_migration>
nicht vorhanden ist, erstellen Sie es, indem Sie Replikate manuell für neue Broker zuweisen. Dieses Thema wird für die Buchhaltung von Themen verwendet, die bereits neu zugewiesen sind und migriert werden.
- Wenn Thema
-
Lesen Sie das Thema
<kafka_topic_migration>
von Anfang an mit einem Consumer. Jede Nachricht ist ein Themenname, der neuen Brokern neu zugewiesen wurde. -
Verwenden Sie
AdminClient
, um alle verfügbaren Themen im Cluster aufzulisten. Entfernen Sie das Thema<kafka_topic_migration>
aus dieser Liste. -
Suchen Sie in den obigen beiden Schritten nach den Themen, die neuen Brokern zugewiesen werden sollen.
-
Für jedes Thema:
-
Erstellen Sie eine Karte
Map<TopicPartition,Optional<NewPartitionReassignment>> reassignment = new HashMap<>();
. -
Beschreiben Sie mit
AdminClient
das Thema, um die zugehörigen Partitionen zu suchen. -
Für jede Partition:
-
Bereiten Sie ein
NewPartitionReassignment
-Objekt vor, indem Sie jede alte Replikat-ID (alte Broker-ID) durch die entsprechende neue Broker-ID ersetzen. Wenn die Broker-ID-Zuordnung nicht den Schlüssel enthält, der der Replikat-ID entspricht, protokollieren Sie eine Warnung, und verwenden Sie die aktuelle ID (wahrscheinlich ist dies der Fall, dass dieses Thema bereits migriert wurde und wir die Buchhaltung verpasst haben). -
Fügen Sie diesen Eintrag für die Zuordnung hinzu.
-
-
Verwenden Sie
AdminClient
, um die Neuzuweisung durch Aufrufen der MethodealterPartitionReassignments
zu initiieren. -
Führen Sie eine Schleife aus, um zu prüfen, ob diese Neuzuweisung abgeschlossen ist, indem Sie bei laufenden Neuzuweisungen (
listPartitionReassignments
) auflisten und deren Größe auf Null prüfen. Schlafen Sie zwischen jeder Schleife N Sekunden. -
Überprüfen Sie, ob die neuen Replikate jeder Partition mit den gewünschten Replikaten übereinstimmen.
-
Senden Sie diesen Themennamen als Nachricht an das Thema
<kafka_topic_migration>
.
-
-
Wiederholen Sie die Schritte 4 bis 6, wenn keine weiteren Themen zur Neuzuweisung und zum Beenden mehr vorhanden sind.
Sobald die Migration abgeschlossen ist, können wir die alten Broker außer Betrieb nehmen und die benutzerdefinierte Logik der Themenerstellung deaktivieren.
Hinweis: Bevor Sie die alten Broker außer Betrieb nehmen, stellen Sie sicher, dass alle Clients für dieses Cluster die
bootstrap.servers
-Konfiguration mit neuen Brokern aktualisiert haben.
Zookeeper-Cluster migrieren
Da es sich um ein Quorum-basiertes System handelt (um jede Operation zu begehen, benötigen wir mindestens ein Quorum von Stimmen) und angesichts der Wiederwahl der Anführer dazu führt, dass Schreibvorgänge gestoppt werden, ist die Zookeeper-Migration der schwierigste Teil. Es gibt ein paar Ansätze zum Ersetzen von Knoten. Ein einfacher Ansatz besteht darin, mehrere Runden des rollierenden Neustarts des gesamten Clusters auszuführen und in jeder Runde einen neuen Knoten hinzuzufügen. Dieser Ansatz ist möglicherweise aufgrund mehrerer Neustartrunden des Leader-Knotens und der Verzögerung bei der Ausführung der Gesamtmigration nicht akzeptabel.
Hinweis: Es können nicht alle neuen Knoten (als Teilnehmer) auf einmal hinzugefügt werden, da das Risiko besteht, dass ein neuer Knoten führend wird, ohne alle Daten zu synchronisieren (was zu einem Datenverlust führt).
Geben Sie nie mehr als einen Join-Server in derselben anfänglichen Konfiguration wie die Teilnehmer an. Derzeit wissen die verbindenden Server nicht, dass sie einem bestehenden Ensemble beitreten, wenn mehrere Joiner als Teilnehmer aufgeführt sind, können sie ein unabhängiges Kolleg bilden, das eine Split-Brain-Situation wie Bearbeitungsvorgänge unabhängig von Ihrem Hauptensemble schafft. Es ist in Ordnung, mehrere Joiner als Beobachter in einer anfänglichen Konfiguration aufzulisten.
In der Zookeeper-Version über 3.5.0
unterstützen wir die dynamische Neukonfiguration des Zookeeper-Ensembles. Das Flag reconfigEnabled
muss auf true
gesetzt werden, damit die dynamische Neukonfiguration funktioniert. Weitere Informationen finden Sie unter Dynamische Rekonfiguration des ZooKeeper-Ensembles.
Sie können neue Knoten mit der Rolle Observer
mit der anfänglichen Konfiguration von Joinern hinzufügen, die aus Servern in der letzten festgeschriebenen Konfiguration bestehen. Beispiel: Wenn die Server 4 und 5 gleichzeitig zu (1, 2, 3) hinzugefügt werden, lautet die anfängliche Konfiguration von 4 (1, 2, 3, 4, 5), wobei 4 und 5 als Beobachter aufgelistet sind. Ebenso wird die Konfiguration von 5 (1, 2, 3, 4, 5) sein, wobei 4 und 5 als Beobachter aufgeführt sind.
Hinweis: Wenn Sie die Joiner als Beobachter auflisten, werden sie nicht tatsächlich zu Beobachtern. Dadurch wird nur verhindert, dass sie versehentlich ein Quorum mit anderen Joinern bilden. Stattdessen kontaktieren sie die Server in der aktuellen Konfiguration und übernehmen die letzte festgeschriebene Konfiguration (1, 2, 3), in der die Joiner fehlen. Nach der Verbindung mit dem derzeitigen Leiter werden die Schreiner zu nicht stimmberechtigten Anhängern, bis das System neu konfiguriert und dem Ensemble hinzugefügt wird (wie gewünscht als Teilnehmer oder Beobachter).
Sobald alle Knoten hochgefahren und gestartet sind, wird die Reconfig-API aufgerufen, um neue Knoten als Teilnehmer dynamisch hinzuzufügen und alte Knoten aus dem Ensemble zu entfernen. Beispiel: Verwenden der CLI.
reconfig -remove 1,2,3 -add
server.5=hostA:2111:2112;2113,6=hostB:2111:2112:participant;2113,7=
hostC:2111:2112:participant;2113*
Nach diesem Schritt können alte Knoten außer Betrieb genommen werden.
Hinweis:
Bevor Sie die alten Knoten außer Betrieb nehmen, stellen Sie sicher, dass alle Clients für dieses Zookeeper-Cluster die Verbindungszeichenfolge mit neuen Knoten aktualisiert haben.
Zookeeper muss zuerst migriert werden (vorausgesetzt, die verwendete Kafka-Version hängt von Zookeeper ab). Durch das Hinzufügen neuer Zookeeper-Knoten in der neuen Kafka-Broker-Konfiguration werden wir für das Entfernen alter Zookeeper-Knoten im Voraus vorbereitet.
myID
des neuen Zookeeper-Knotens sollte monoton zunehmen, sonst kann der Knoten nicht gestartet werden.Starten Sie den neu hinzugefügten Zookeeper-Knoten erst neu, nachdem
reconfig
aufgerufen wurde. Andernfalls wird er nicht gestartet, da die Konfiguration für sich selbst in der dynamischen Konfigurationsdatei fehlt. Die anfängliche Konfiguration des Knotens wird überschrieben, wobei die dynamische Konfiguration die letzte festgeschriebene Konfiguration aufweist.Bei der Auswahl einer Open-Source-Komponente, die in Ihr Ökosystem integriert werden soll, müssen Sie die Verwaltbarkeit und betriebliche Aspekte berücksichtigen.
Beim Migrieren von Topic-Partitionen muss man sich der Datenmenge bewusst sein, die über das Netzwerk übertragen würde.
Verwandte Links
Danksagungen
- Autor - Shailesh Mishra
Weitere Lernressourcen
Lernen Sie andere Übungen auf docs.oracle.com/learn kennen, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube Channel zu. Außerdem können Sie education.oracle.com/learning-explorer besuchen, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Migrate Kafka and Zookeeper Cluster in Zero Downtime
F96316-01
April 2024