https://zookeeper.apache.org/doc/current/zookeeperOver.html
Standardmäßig repliziert Zookeeper alle Ihre Daten auf jeden Knoten und lässt Clients die Daten auf Änderungen überwachen. Änderungen werden sehr schnell (innerhalb eines begrenzten Zeitraums) an Clients gesendet. Sie können auch "flüchtige Knoten" erstellen, die innerhalb einer bestimmten Zeit gelöscht werden, wenn ein Client die Verbindung trennt. ZooKeeper ist hochgradig für Lesevorgänge optimiert , während Schreibvorgänge sehr langsam sind (da sie im Allgemeinen an jeden Client gesendet werden, sobald der Schreibvorgang stattfindet). Schließlich beträgt die maximale Größe einer "Datei" (znode) in Zookeeper 1 MB, aber normalerweise handelt es sich um einzelne Zeichenfolgen.
Zusammengenommen bedeutet dies, dass Zookeeper nicht dazu gedacht ist, viele Daten zu speichern, und definitiv kein Cache. Stattdessen dient es dazu, Heartbeats zu verwalten/zu wissen, welche Server online sind, die Konfiguration zu speichern/aktualisieren und möglicherweise Nachrichten weiterzuleiten (wenn Sie jedoch eine große Anzahl von Nachrichten oder hohe Durchsatzanforderungen haben, ist etwas wie RabbitMQ für diese Aufgabe viel besser). /P>
Grundsätzlich hilft ZooKeeper (und Curator, der darauf aufbaut) bei der Handhabung der Clustering-Mechanismen – Heartbeats, Verteilung von Updates/Konfiguration, verteilte Sperren usw.
Es ist nicht wirklich vergleichbar mit Redis, aber für die spezifischen Fragen ...
-
Es unterstützt keine Berechnungen und ist für die meisten Datensätze nicht in der Lage, die Daten mit irgendeiner Leistung zu speichern.
-
Es wird auf alle Knoten im Cluster repliziert (es gibt nichts Besseres als Redis-Clustering, bei dem die Daten verteilt werden können). Alle Nachrichten werden atomar vollständig verarbeitet und sind sequenziert, sodass es keine echten Transaktionen gibt. Es kann verwendet werden, um Cluster-weite Sperren für Ihre Dienste zu implementieren (es ist tatsächlich sehr gut darin), und es gibt eine Menge Sperrprimitive auf den Znodes selbst, um zu steuern, welche Knoten darauf zugreifen.
-
Sicher, aber ZooKeeper füllt eine Nische. Es ist ein Tool, mit dem verteilte Anwendungen mit mehreren Instanzen gut funktionieren, nicht zum Speichern/Teilen großer Datenmengen. Verglichen mit der Verwendung eines IMDG für diesen Zweck ist Zookeeper schneller, verwaltet Herzschläge und Synchronisation auf vorhersehbare Weise (mit vielen APIs, um diesen Teil zu vereinfachen) und hat ein „Push“-Paradigma anstelle von „Pull“, also Knoten sehr schnell über Änderungen benachrichtigt.
Das Zitat aus der verlinkten Frage...
Ein kanonisches Beispiel für die Verwendung von Zookeeper ist die Berechnung des verteilten Speichers
... ist meiner Meinung nach etwas irreführend. Sie würden es verwenden, um die Berechnung zu orchestrieren, nicht um die Daten bereitzustellen. Nehmen wir zum Beispiel an, Sie müssten die Zeilen 1-100 einer Tabelle verarbeiten. Sie könnten 10 ZK-Knoten mit Namen wie "1-10", "11-20", "21-30" usw. einrichten. Client-Anwendungen würden automatisch von ZK über diese Änderung benachrichtigt, und die erste würde "greifen". 1-10" und setzen Sie einen flüchtigen Knoten clients/192.168.77.66/processing/rows_1_10
Die nächste Anwendung würde dies sehen und zur nächsten Gruppe gehen, um sie zu verarbeiten. Die tatsächlich zu berechnenden Daten würden an anderer Stelle gespeichert (z. B. Redis, SQL-Datenbank usw.). Wenn der Knoten mitten in der Berechnung fehlgeschlagen ist, könnte ein anderer Knoten dies (nach 30–60 Sekunden) sehen und den Job erneut aufnehmen.
Ich würde jedoch sagen, dass das kanonische Beispiel von ZooKeeper die Wahl des Anführers ist. Nehmen wir an, Sie haben 3 Knoten – einer ist Master und die anderen 2 sind Slaves. Wenn der Master ausfällt, muss ein Slave-Knoten zum neuen Leader werden. So etwas ist perfekt für ZK.