https://zookeeper.apache.org/doc/current/zookeeperOver.html
По подразбиране Zookeeper репликира всичките ви данни на всеки възел и позволява на клиентите да наблюдават данните за промени. Промените се изпращат много бързо (в рамките на ограничен период от време) на клиентите. Можете също така да създадете "ефимерни възли", които се изтриват в рамките на определено време, ако клиентът прекъсне връзката. ZooKeeper е силно оптимизиран за четения , докато записите са много бавни (тъй като обикновено се изпращат на всеки клиент веднага щом записът се осъществи). И накрая, максималният размер на "файл" (znode) в Zookeeper е 1MB, но обикновено те ще бъдат единични низове.
Взети заедно, това означава, че zookeeper не е предназначен да съхранява много данни и определено не е кеш. Вместо това е за управление на сърдечния ритъм/знание кои сървъри са онлайн, съхраняване/актуализиране на конфигурацията и евентуално предаване на съобщения (въпреки че ако имате големи #s съобщения или високи изисквания за пропускателна способност, нещо като RabbitMQ ще бъде много по-добро за тази задача).
По принцип ZooKeeper (и Curator, който е изграден върху него) помага при управлението на механиката на клъстерирането – сърдечни удари, разпространение на актуализации/конфигурации, разпределени заключване и т.н.
Всъщност не е сравнимо с Redis, но за конкретните въпроси...
-
Той не поддържа никакви изчисления и за повечето набори от данни няма да може да съхранява данните с никаква производителност.
-
Той се репликира на всички възли в клъстера (няма нищо подобно на клъстерирането на Redis, където данните могат да бъдат разпределени). Всички съобщения се обработват атомарно изцяло и са подредени, така че няма реални транзакции. Може да се ИЗПОЛЗВА за внедряване на заключване в целия клъстер за вашите услуги (всъщност е много добър в това) и има много заключващи примитиви на самите znodes, за да контролирате кои възли имат достъп до тях.
-
Разбира се, но ZooKeeper запълва ниша. Това е инструмент за правене на разпределени приложения да играят добре с множество екземпляри, а не за съхранение/споделяне на големи количества данни. В сравнение с използването на IMDG за тази цел, Zookeeper ще бъде по-бърз, ще управлява сърдечния ритъм и синхронизацията по предсказуем начин (с много API за улесняване на тази част) и има парадигма „натискане“ вместо „дърпане“, така че възлите са известява много бързо за промените.
Цитатът от свързания въпрос...
Каноничен пример за използване на Zookeeper е изчислението с разпределена памет
... е, IMO, малко подвеждащо. Ще го използвате, за да организирате изчисленията, а не да предоставяте данните. Например, да приемем, че трябва да обработите редове 1-100 от таблица. Можете да поставите 10 ZK възела с имена като "1-10", "11-20", "21-30" и т.н. Клиентските приложения ще бъдат уведомени за тази промяна автоматично от ZK, а първият ще вземе " 1-10" и задайте ефимерен възел clients/192.168.77.66/processing/rows_1_10
Следващото приложение ще види това и ще отиде за следващата група за обработка. Действителните данни за изчисляване ще се съхраняват другаде (т.е. Redis, SQL база данни и т.н.). Ако възелът се провали по време на изчислението, друг възел може да види това (след 30-60 секунди) и да поеме задачата отново.
Все пак бих казал, че каноничният пример за ZooKeeper е изборът на лидер. Да приемем, че имате 3 възела - единият е главен, а другите 2 са подчинени. Ако капитана падне, подчинен възел трябва да стане новият лидер. Този тип неща са идеални за ZK.