Kurz gesagt, ZooKeeper hilft Ihnen beim Erstellen verteilter Anwendungen.
Wie es funktioniert
Sie können ZooKeeper als replizierten Synchronisierungsdienst mit eventueller Konsistenz beschreiben. Es ist robust, da die persistierten Daten auf mehrere Knoten verteilt werden (dieser Knotensatz wird als "Ensemble" bezeichnet) und ein Client eine Verbindung zu einem dieser Knoten herstellt (dh zu einem bestimmten "Server") und migriert, wenn ein Knoten ausfällt. Solange eine strikte Mehrheit der Knoten funktioniert, lebt das Ensemble der ZooKeeper-Knoten. Insbesondere wird ein Hauptknoten dynamisch durch Konsens innerhalb des Ensembles ausgewählt; Wenn der Masterknoten ausfällt, wird die Rolle des Masters auf einen anderen Knoten migriert.
Wie Schreibvorgänge behandelt werden
Der Master ist die Autorität für Schreibvorgänge: Auf diese Weise kann garantiert werden, dass Schreibvorgänge in der angegebenen Reihenfolge beibehalten werden, dh Schreibvorgänge sind linear . Jedes Mal, wenn ein Client in das Ensemble schreibt, behalten die meisten Knoten die Informationen bei: Diese Knoten enthalten den Server für den Client und natürlich den Master. Dies bedeutet, dass jeder Schreibvorgang den Server mit dem Master auf den neuesten Stand bringt. Dies bedeutet jedoch auch, dass Sie nicht gleichzeitig schreiben können.
Die Garantie für lineares Schreiben ist der Grund dafür, dass ZooKeeper bei schreibdominanten Workloads keine gute Leistung erbringt. Insbesondere sollte es nicht für den Austausch großer Datenmengen wie Medien verwendet werden. Solange Ihre Kommunikation gemeinsame Daten umfasst, hilft Ihnen ZooKeeper. Wenn Daten gleichzeitig geschrieben werden könnten, stört ZooKeeper tatsächlich, da es eine strikte Reihenfolge der Vorgänge vorschreibt, auch wenn dies aus Sicht der Autoren nicht unbedingt erforderlich ist. Die ideale Verwendung ist die Koordination, bei der Nachrichten zwischen den Clients ausgetauscht werden.
Wie Lesevorgänge behandelt werden
Hier zeichnet sich ZooKeeper aus: Lesevorgänge werden gleichzeitig ausgeführt, da sie von dem bestimmten Server bereitgestellt werden, mit dem der Client eine Verbindung herstellt. Dies ist jedoch auch der Grund für die eventuelle Konsistenz: Die "Ansicht" eines Clients ist möglicherweise veraltet, da der Master den entsprechenden Server mit einer begrenzten, aber nicht definierten Verzögerung aktualisiert.
Im Detail
Die replizierte Datenbank von ZooKeeper besteht aus einem Baum von Knoten , bei denen es sich um Entitäten handelt , die ungefähr Dateisystemknoten darstellen (stellen Sie sich diese als Verzeichnisse vor). Jeder Knoten kann durch ein Byte-Array angereichert werden, in dem Daten gespeichert werden. Außerdem kann jeder Znode andere Znodes enthalten, die praktisch ein internes Verzeichnissystem bilden.
Sequentielle Knoten
Interessanterweise kann der Name eines Znodes fortlaufend sein , was bedeutet, dass der Name, den der Client beim Erstellen des Znodes angibt, nur ein Präfix ist: Der vollständige Name wird auch durch eine vom Ensemble ausgewählte fortlaufende Nummer angegeben. Dies ist beispielsweise für Synchronisierungszwecke nützlich: Wenn mehrere Clients eine Sperre für eine Ressource erhalten möchten, können sie gleichzeitig einen sequentiellen Knoten an einem Speicherort erstellen: Wer die niedrigste Nummer erhält, hat Anspruch auf die Sperre.
Vergängliche Knoten
Ein znode kann auch kurzlebig sein : Dies bedeutet, dass er zerstört wird, sobald der Client, der ihn erstellt hat, die Verbindung trennt. Dies ist hauptsächlich nützlich, um zu wissen, wann ein Client ausfällt. Dies kann relevant sein, wenn der Client selbst Verantwortlichkeiten hat, die von einem neuen Client übernommen werden sollten. Am Beispiel der Sperre können die anderen Clients prüfen, ob sie Anspruch auf die Sperre haben, sobald der Client die Sperre aufhebt.
Uhren
Das Beispiel für die Trennung von Clients kann problematisch sein, wenn der Status von znodes regelmäßig abgefragt werden muss. Glücklicherweise bietet ZooKeeper ein Ereignissystem an, bei dem eine Uhr auf einen Knoten gesetzt werden kann. Diese Uhren können so eingestellt werden, dass sie ein Ereignis auslösen, wenn der Knoten speziell geändert oder entfernt wird oder neue untergeordnete Knoten darunter erstellt werden. Dies ist eindeutig in Kombination mit den sequentiellen und kurzlebigen Optionen für Knoten nützlich.
Wo und wie man es benutzt
Ein kanonisches Beispiel für die Verwendung von Zookeeper ist die Berechnung des verteilten Speichers, bei der einige Daten von Clientknoten gemeinsam genutzt werden und auf sehr sorgfältige Weise zugegriffen / aktualisiert werden muss, um die Synchronisation zu berücksichtigen.
ZooKeeper bietet die Bibliothek zum Erstellen Ihrer Synchronisationsprimitive, während durch die Möglichkeit, einen verteilten Server auszuführen, das Single-Point-of-Failure-Problem vermieden wird, das bei Verwendung eines zentralen (Broker-ähnlichen) Nachrichtenrepositorys auftritt.
ZooKeeper ist Feature-Light, was bedeutet, dass Mechanismen wie Führerwahlen, Sperren, Barrieren usw. nicht bereits vorhanden sind, sondern über den ZooKeeper-Grundelementen geschrieben werden können. Wenn die C / Java-API für Ihre Zwecke zu unhandlich ist, sollten Sie sich auf Bibliotheken verlassen, die auf ZooKeeper basieren, z. B. Käfige und insbesondere Kuratoren .
Wo kann man mehr lesen?
Abgesehen von der offiziellen Dokumentation, die ziemlich gut ist, empfehle ich, Kapitel 14 von Hadoop: The Definitive Guide zu lesen, das auf ~ 35 Seiten im Wesentlichen erklärt, was ZooKeeper tut, gefolgt von einem Beispiel eines Konfigurationsdienstes.