https://zookeeper.apache.org/doc/current/zookeeperOver.html
Som standard replikerar Zookeeper all din data till varje nod och låter klienter titta på data för ändringar. Ändringar skickas mycket snabbt (inom en begränsad tid) till kunderna. Du kan också skapa "efemära noder", som raderas inom en angiven tid om en klient kopplar bort. ZooKeeper är mycket optimerad för läsning , medan skrivningar är mycket långsamma (eftersom de vanligtvis skickas till varje klient så snart skrivningen äger rum). Slutligen är den maximala storleken på en "fil" (znode) i Zookeeper 1 MB, men vanligtvis kommer de att vara enstaka strängar.
Sammantaget betyder detta att zookeeper inte är tänkt att lagra för mycket data, och definitivt inte en cache. Istället är det för att hantera hjärtslag/veta vilka servrar som är online, lagra/uppdatera konfiguration och eventuellt skicka meddelanden (men om du har ett stort antal meddelanden eller höga krav på genomströmning kommer något som RabbitMQ att vara mycket bättre för den här uppgiften).
I grund och botten hjälper ZooKeeper (och Curator, som är byggd på det) att hantera mekaniken för klustring -- hjärtslag, distribuera uppdateringar/konfigurationer, distribuerade lås, etc.
Det är inte riktigt jämförbart med Redis, men för de specifika frågorna...
-
Den stöder inte någon beräkning och för de flesta datamängder kommer den inte att kunna lagra data med någon prestanda.
-
Det replikeras till alla noder i klustret (det finns inget som Redis-klustring där data kan distribueras). Alla meddelanden bearbetas atomärt i sin helhet och är sekvenserade, så det finns inga riktiga transaktioner. Det kan användas för att implementera klusteromfattande lås för dina tjänster (det är faktiskt väldigt bra på det), och det finns många låsande primitiver på själva znoderna för att styra vilka noder som kommer åt dem.
-
Visst, men ZooKeeper fyller en nisch. Det är ett verktyg för att få distribuerade applikationer att spela bra med flera instanser, inte för att lagra/dela stora mängder data. Jämfört med att använda en IMDG för detta ändamål kommer Zookeeper att vara snabbare, hantera hjärtslag och synkronisering på ett förutsägbart sätt (med många API:er för att göra denna del enkel), och har ett "push"-paradigm istället för "pull" så att noder är meddelas mycket snabbt om ändringar.
Citatet från den länkade frågan...
Ett kanoniskt exempel på användning av Zookeeper är beräkning av distribuerat minne
... är, IMO, lite missvisande. Du skulle använda den för att orkestrera beräkningen, inte tillhandahålla data. Låt oss till exempel säga att du var tvungen att bearbeta raderna 1-100 i en tabell. Du kan sätta upp 10 ZK-noder, med namn som "1-10", "11-20", "21-30", etc. Klientapplikationer kommer att meddelas om denna ändring automatiskt av ZK, och den första skulle ta " 1-10" och ställ in en tillfällig nod clients/192.168.77.66/processing/rows_1_10
Nästa ansökan skulle se detta och gå till nästa grupp att behandla. De faktiska data som ska beräknas skulle lagras någon annanstans (t.ex. Redis, SQL-databas, etc). Om noden misslyckades halvvägs genom beräkningen kunde en annan nod se detta (efter 30-60 sekunder) och ta upp jobbet igen.
Jag skulle säga att det kanoniska exemplet på ZooKeeper är val av ledare. Låt oss säga att du har 3 noder -- en är master och de andra 2 är slavar. Om mastern går ner måste en slavnod bli den nya ledaren. Den här typen av saker är perfekt för ZK.