Krótko mówiąc, ZooKeeper pomaga budować aplikacje rozproszone.
Jak to działa
Możesz opisać ZooKeeper jako replikowaną usługę synchronizacji z ewentualną spójnością. Jest solidny, ponieważ utrwalone dane są rozdzielane między wiele węzłów (ten zestaw węzłów nazywany jest „zespołem”), a jeden klient łączy się z dowolnym z nich (tj. Konkretnym „serwerem”), migrując, jeśli jeden węzeł ulegnie awarii; tak długo, jak działa zdecydowana większość węzłów, zespół węzłów ZooKeeper żyje. W szczególności węzeł główny jest wybierany dynamicznie w drodze konsensusu w zespole; jeśli węzeł główny ulegnie awarii, jego rola migruje do innego węzła.
Jak obsługiwane są zapisy
Mistrz jest autorytetem do zapisu: w ten sposób można zagwarantować, że zapisy zostaną utrwalone w kolejności, tzn. Zapisy są liniowe . Za każdym razem, gdy klient pisze do zestawu, większość węzłów utrwala informacje: te węzły obejmują serwer dla klienta i oczywiście serwer główny. Oznacza to, że każdy zapis powoduje, że serwer jest na bieżąco z urządzeniem głównym. Oznacza to jednak również, że nie można mieć równoczesnych zapisów.
Gwarancja zapisu liniowego jest przyczyną tego, że ZooKeeper nie działa dobrze w przypadku obciążeń zdominowanych przez zapis. W szczególności nie należy go używać do wymiany dużych danych, takich jak media. Tak długo, jak komunikacja obejmuje udostępnione dane, ZooKeeper pomaga. Kiedy dane mogą być zapisywane jednocześnie, ZooKeeper faktycznie przeszkadza, ponieważ nakłada ścisłe porządkowanie operacji, nawet jeśli nie jest to absolutnie konieczne z punktu widzenia pisarzy. Idealnie nadaje się do koordynacji, w której wiadomości są wymieniane między klientami.
Jak obsługiwane są odczyty
Tutaj wyróżnia się ZooKeeper: odczyty są zbieżne, ponieważ są obsługiwane przez określony serwer, z którym łączy się klient. Jest to jednak również powód ostatecznej spójności: „widok” klienta może być nieaktualny, ponieważ master aktualizuje odpowiedni serwer z ograniczonym, ale niezdefiniowanym opóźnieniem.
Szczegółowo
Replikowana baza danych ZooKeeper zawiera drzewo znodes , które są z grubsza reprezentowane przez węzły systemu plików ( traktuj je jako katalogi). Każdy znode może zostać wzbogacony o tablicę bajtów, która przechowuje dane. Ponadto każdy znode może mieć pod sobą inne znody, praktycznie tworząc wewnętrzny system katalogów.
Sekwencyjne znody
Co ciekawe, nazwa znode może być sekwencyjna , co oznacza, że nazwa, którą klient podaje podczas tworzenia znode, jest tylko przedrostkiem: pełna nazwa jest również nadawana przez kolejny numer wybrany przez zespół. Jest to przydatne na przykład do celów synchronizacji: jeśli wielu klientów chce uzyskać blokadę zasobu, każdy z nich może jednocześnie utworzyć sekwencyjny znode w lokalizacji: ten, kto uzyska najniższą liczbę, jest uprawniony do blokady.
Efemeryczne znody
Znode może być także efemeryczne : oznacza to, że zostanie zniszczone, gdy tylko klient, który go utworzył, rozłączy się. Jest to szczególnie przydatne, aby wiedzieć, kiedy klient zawiedzie, co może być istotne, gdy sam klient ma obowiązki, które powinien wziąć na siebie nowy klient. Biorąc przykład blokady, gdy tylko klient mający blokadę się rozłączy, inni klienci mogą sprawdzić, czy są uprawnieni do blokady.
Zegarki
Przykład związany z rozłączeniem klienta może być problematyczny, jeśli musimy okresowo sprawdzać stan znodes. Na szczęście ZooKeeper oferuje system wydarzeń, w którym można ustawić zegarek na znode. Zegarki te można ustawić tak, aby wyzwalały zdarzenie, jeśli znode zostanie konkretnie zmieniony lub usunięty lub pod nim zostaną utworzone nowe elementy potomne. Jest to wyraźnie przydatne w połączeniu z sekwencyjnymi i efemerycznymi opcjami dla znodów.
Gdzie i jak go używać
Kanonicznym przykładem użycia Zookeepera jest obliczanie pamięci rozproszonej, w którym niektóre dane są współdzielone między węzłami klienta i muszą być dostępne / aktualizowane w bardzo ostrożny sposób, aby uwzględnić synchronizację.
ZooKeeper oferuje bibliotekę do budowy podstawowych operacji synchronizacji, a możliwość uruchomienia serwera rozproszonego pozwala uniknąć problemu pojedynczego punktu awarii, który występuje podczas korzystania ze scentralizowanego repozytorium komunikatów (podobnego do brokera).
ZooKeeper jest lekki, co oznacza, że mechanizmy takie jak wybór lidera, blokady, bariery itp. Nie są już obecne, ale można je zapisać powyżej prymitywów ZooKeeper. Jeśli interfejs API C / Java jest zbyt niewygodny dla twoich celów, powinieneś polegać na bibliotekach zbudowanych na ZooKeeper, takich jak klatki, a zwłaszcza kustosz .
Gdzie przeczytać więcej
Oprócz oficjalnej dokumentacji, która jest całkiem niezła, sugeruję przeczytać rozdział 14 Hadoop: The Definitive Guide, który zawiera ~ 35 stron wyjaśniających w zasadzie to, co robi ZooKeeper, a następnie przykład usługi konfiguracji.