Erklären von Apache ZooKeeper


376

Ich versuche ZooKeeper zu verstehen, wie es funktioniert und was es tut. Gibt es eine Anwendung, die mit ZooKeeper vergleichbar ist?

Wenn Sie wissen, wie würden Sie ZooKeeper dann einem Laien beschreiben?

Ich habe Apache Wiki, Zookeeper SourceForge ausprobiert ... aber ich kann mich immer noch nicht darauf beziehen.

Ich habe gerade http://zookeeper.sourceforge.net/index.sf.shtml gelesen. Gibt es also nicht mehr Dienste wie diesen? Ist es so einfach wie das Replizieren eines Serverdienstes?


6
Ähnlich, aber nicht die genaue Antwort, die Sie suchen: stackoverflow.com/questions/1479442/real-world-use-of-zookeeper
zengr


Sie können diesen Artikel lesen ZooKeeper: Wartefreie Koordination für Systeme im Internet-Maßstab Geschrieben von zwei Yahoo! Ingenieure
Yaphet

Hier ist ein Tech-Vortrag, der eine Einführung in Apache ZooKeeper von Camille Fournier ist, der CTO von RentTheRunway. Ich hoffe es ist hilfreich.
Genadinik

@Luca Geretti ... Laut mir stellt Zookeper eine Reihe von APIs zur Verfügung, mit denen wir die verteilte Anwendung koordinieren können. korrigiere mich, wenn ich falsch liege.
user3797438

Antworten:


434

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.


2
Ich bin nicht sicher, ob ich das von Ihnen vorgeschlagene Kommunikationsschema verstehe, aber Sie können ZooKeeper verwenden, um Informationen eines Herstellers zu "veröffentlichen" und von mehreren Verbrauchern lesen zu lassen. Wenn andererseits nur eine Instanz jeder Art von Server vorhanden ist, hat die Verwendung von ZK nur geringe Vorteile.
Luca Geretti

57
IMO kann dies einem Laien nicht erklären, was ZooKeeper ist. Wann würde ich ZooKeeper brauchen? Was würde ich dazu schreiben? Welches Problem löst es? Ist es ein Schlüsselwertspeicher? Eine Suchmaschine? Eine verteilte Sperre? Warum sollte ich ZooKeeper anstelle von Redis oder einer Datei oder JIRA oder Haftnotizen auswählen? Sie wissen eindeutig viel über ZooKeeper - aber können Sie es weniger technisch erklären?
Dan Passaro

1
Da Zookeeper lineare Schreibvorgänge hat, hindert mich das nicht daran, asynchrone APIs zu verwenden, um Knoten zu erstellen und die Antwort in einem Rückruf zu übernehmen? Intern sind möglicherweise keine gleichzeitigen Schreibvorgänge zulässig, oder fehlt mir etwas?
jdk2588

1
"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." => Könnten Sie mich bitte auf ein Dokument verweisen? oder etwas wo das erklärt wird? Ich frage mich , ob es möglich ist , dass eine Zustandsänderung erfolgreich den Server gemacht wurde außer mit dem der Client verbunden ist (in diesem Fall kann der Kunde erlebt das seltsame Verhalten von nicht in der Lage seine eigene Schreib für einen Moment zu lesen)
Senseiwu

2
Ganz und gar entgegengesetzt zu der gestellten Frage. Wenn es eine Uhr wäre, würde er nach einem "Zeitmessgerät" suchen, nicht nach einer Beschreibung der Hauptfeder, des Radzugs, der Hemmung und ihrer Wechselwirkung auf der Grundlage der Schwingungsperiode, des Trägheitsmoments und des Aufpralls künstlicher Saphirkristalle.
Rick O'Shea

10

Zookeeper ist einer der besten Open Source-Server und -Dienste, mit denen verteilte Prozesse zuverlässig koordiniert werden können. Zookeeper ist ein CP-System (siehe CAP-Theorem), das Konsistenz- und Partitionstoleranz bietet. Die Replikation des Zookeeper-Status über alle Knoten hinweg macht ihn zu einem letztendlich konsistenten verteilten Dienst.

Darüber hinaus wird jeder neu gewählte Führer seine Anhänger mit fehlenden Vorschlägen oder mit einer Momentaufnahme des Staates aktualisieren, wenn den Anhängern viele Vorschläge fehlen.

Zookeeper bietet auch eine API, die sehr einfach zu bedienen ist. Dieser Blog-Beitrag, Zookeeper Java API-Beispiele , enthält einige Beispiele, wenn Sie nach Beispielen suchen.

Wo verwenden wir das? Wenn Ihr verteilter Dienst ein zentrales, zuverlässiges und konsistentes Konfigurationsmanagement, Sperren, Warteschlangen usw. benötigt, ist Zookeeper eine zuverlässige Wahl.


4
"Zookeeper ist ein CP-System (siehe CAP-Theorem), das Konsistenz- und Partitionstoleranz bietet". Ich denke, dass Zookeeper Master und Follower hat. Wenn der Master ausfällt, wird einer der Follower zum Leader gewählt, daher sollte Zookeeper das bereitstellen AP, jedoch ist das C schließlich konsistent.
YuFeng Shen

5
In Bezug auf den CAP-Satz bedeutet "C" tatsächlich Linearisierbarkeit. ZooKeeper bietet in der Tat "sequentielle Konsistenz" und bedeutet, dass Aktualisierungen von Clients in der Reihenfolge angewendet werden, in der sie empfangen wurden. Dies ist schwächer als die Linearisierbarkeit, aber immer noch sehr stark, viel stärker als "eventuelle Konsistenz". Zookeeper ist nicht A und dies liegt daran, dass Zookeeper Anfragen fehlschlägt, wenn der Anführer nicht gewählt werden kann (kein Quorum). Aus diesem Grund ist es nicht hoch verfügbar.
Binu George

7

Ich verstehe den ZooKeeper im Allgemeinen, hatte aber Probleme mit den Begriffen "Quorum" und "Split Brain", sodass ich meine Erkenntnisse vielleicht mit Ihnen teilen kann (ich betrachte mich auch als Laie).

Angenommen, wir haben einen ZooKeeper-Cluster mit 5 Servern. Einer der Server wird zum Anführer und die anderen zu Followern.

  • Diese 5 Server sind beschlussfähig. Quorum bedeutet einfach "diese Server können darüber abstimmen, wer der Anführer sein soll".

  • Die Abstimmung basiert also auf der Mehrheit. Mehrheit bedeutet einfach "mehr als die Hälfte", daher muss mehr als die Hälfte der Anzahl der Server zustimmen, damit ein bestimmter Server zum Marktführer wird.

  • Es gibt also diese schlimme Sache, die als "gespaltenes Gehirn" bezeichnet werden kann. Ein geteiltes Gehirn ist einfach so weit, wie ich es verstehe: Der Cluster von 5 Servern teilt sich in zwei Teile, oder nennen wir es "Serverteams", mit vielleicht einem Teil von 2 und dem anderen von 3 Servern. Dies ist wirklich eine schlechte Situation, da beide "Serverteams" einen bestimmten Auftrag ausführen müssen. Wie würden Sie entscheiden, welches Team bevorzugt werden soll? Sie haben möglicherweise unterschiedliche Informationen von den Kunden erhalten. Es ist also sehr wichtig zu wissen, welches "Serverteam" noch relevant ist und welches ignoriert werden kann / sollte.

  • Die Mehrheit ist auch der Grund, warum Sie eine ungerade Anzahl von Servern verwenden sollten. Wenn Sie 4 Server und ein geteiltes Gehirn haben, in dem 2 Server getrennt sind, könnten beide "Serverteams" sagen: "Hey, wir wollen entscheiden, wer der Anführer ist!" Aber wie sollten Sie entscheiden, welche 2 Server Sie wählen sollten? Mit 5 Servern ist es einfach: Das Serverteam mit 3 Servern hat die Mehrheit und darf den neuen Leiter auswählen.

  • Selbst wenn Sie nur 3 Server haben und einer von ihnen ausfällt, bilden die anderen 2 immer noch die Mehrheit und können zustimmen, dass einer von ihnen der neue Anführer wird.

Mir ist klar, dass es nicht mehr so ​​kompliziert ist, wenn man einmal darüber nachdenkt und die Begriffe versteht. Ich hoffe, dies hilft auch jedem, diese Begriffe zu verstehen.


1

Zookeeper ist ein zentraler Open-Source-Server zum Verwalten und Verwalten von Konfigurationsinformationen, Namenskonventionen und Synchronisieren für verteilte Clusterumgebungen. Zookeeper hilft den verteilten Systemen, ihre Verwaltungskomplexität zu reduzieren, indem es eine geringe Latenz und hohe Verfügbarkeit bietet. Zookeeper war ursprünglich ein Teilprojekt für Hadoop, jetzt ist es ein unabhängiges Projekt der Apache Software Foundation auf höchster Ebene.

Mehr Informationen


2
Was lässt Sie sagen, dass der Tierpfleger zentralisiert ist? Zookeeper kann und sollte verteilt ausgeführt werden.
Benjamin Hammer Nørgaard

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.