https://zookeeper.apache.org/doc/current/zookeeperOver.html
Par défaut, Zookeeper réplique toutes vos données sur chaque nœud et permet aux clients de surveiller les données pour les modifications. Les modifications sont envoyées très rapidement (dans un délai limité) aux clients. Vous pouvez également créer des "nœuds éphémères", qui sont supprimés dans un délai spécifié si un client se déconnecte. ZooKeeper est hautement optimisé pour les lectures , tandis que les écritures sont très lentes (puisqu'elles sont généralement envoyées à chaque client dès que l'écriture a lieu). Enfin, la taille maximale d'un "fichier" (znode) dans Zookeeper est de 1 Mo, mais il s'agit généralement de chaînes uniques.
Pris ensemble, cela signifie que zookeeper n'est pas destiné à stocker beaucoup de données, et certainement pas un cache. Au lieu de cela, c'est pour gérer les battements de cœur/savoir quels serveurs sont en ligne, stocker/mettre à jour la configuration et éventuellement transmettre des messages (bien que si vous avez un grand nombre de messages ou des demandes de débit élevées, quelque chose comme RabbitMQ sera bien meilleur pour cette tâche).
Fondamentalement, ZooKeeper (et Curator, qui est construit dessus) aide à gérer les mécanismes de clustering :battements de cœur, distribution des mises à jour/configuration, verrous distribués, etc.
Ce n'est pas vraiment comparable à Redis, mais pour les questions spécifiques...
-
Il ne prend en charge aucun calcul et pour la plupart des ensembles de données, il ne pourra pas stocker les données avec des performances.
-
Il est répliqué sur tous les nœuds du cluster (il n'y a rien comme le clustering Redis où les données peuvent être distribuées). Tous les messages sont traités de manière atomique dans leur intégralité et sont séquencés, il n'y a donc pas de transactions réelles. Il peut être UTILISÉ pour implémenter des verrous à l'échelle du cluster pour vos services (c'est très bon dans ce domaine en fait), et il existe de nombreuses primitives de verrouillage sur les znodes eux-mêmes pour contrôler les nœuds qui y accèdent.
-
Bien sûr, mais ZooKeeper occupe un créneau. C'est un outil pour faire en sorte qu'une application distribuée fonctionne bien avec plusieurs instances, pas pour stocker/partager de grandes quantités de données. Par rapport à l'utilisation d'un IMDG à cette fin, Zookeeper sera plus rapide, gère les battements de cœur et la synchronisation de manière prévisible (avec de nombreuses API pour faciliter cette partie), et a un paradigme "push" au lieu de "pull" pour que les nœuds soient notifié très rapidement des changements.
La citation de la question liée...
Un exemple canonique d'utilisation de Zookeeper est le calcul de mémoire distribuée
... est, IMO, un peu trompeur. Vous l'utiliseriez pour orchestrer le calcul, pas pour fournir les données. Par exemple, supposons que vous deviez traiter les lignes 1 à 100 d'un tableau. Vous pourriez mettre 10 nœuds ZK en place, avec des noms comme "1-10", "11-20", "21-30", etc. Les applications clientes seraient automatiquement informées de ce changement par ZK, et le premier saisirait " 1-10" et définissez un nœud éphémère clients/192.168.77.66/processing/rows_1_10
La prochaine application verrait cela et passerait au groupe suivant à traiter. Les données réelles à calculer seraient stockées ailleurs (c'est-à-dire Redis, base de données SQL, etc.). Si le nœud échoue à mi-chemin du calcul, un autre nœud peut le voir (après 30 à 60 secondes) et reprendre la tâche.
Je dirais que l'exemple canonique de ZooKeeper est l'élection du chef, cependant. Disons que vous avez 3 nœuds - l'un est maître et les 2 autres sont esclaves. Si le maître tombe en panne, un nœud esclave doit devenir le nouveau leader. Ce genre de chose est parfait pour ZK.