Wyjaśniając Apache ZooKeeper

376

Próbuję zrozumieć ZooKeeper, jak to działa i co robi. Czy jest jakaś aplikacja, która jest porównywalna z ZooKeeper?

Jeśli wiesz, to jak opisałbyś ZooKeeper laikowi?

Próbowałem wiki apache, zookeeper sourceforge ... ale nadal nie mogę się z tym powiązać.

Właśnie przeczytałem http://zookeeper.sourceforge.net/index.sf.shtml , więc czy nie ma więcej takich usług? Czy to tak proste, jak replikacja usługi serwera?

topgun_ivard
źródło
6
Podobna, ale nie dokładna odpowiedź, której szukasz: stackoverflow.com/questions/1479442/real-world-use-of-zookeeper
zengr
Możesz przeczytać ten artykuł ZooKeeper: koordynacja bez czekania dla systemów na skalę internetową Napisany przez dwóch Yahoo! inżynierowie
yaphet
Oto wykład techniczny, który jest wstępem do Apache ZooKeeper autorstwa Camille Fournier, która jest dyrektorem technicznym RentTheRunway. Mam nadzieję, że to jest pomocne.
Genadinik,
@Luca Geretti ... Według mnie Zookeper zapewnia zestaw apis, dzięki czemu możemy go wykorzystać do koordynowania rozproszonej aplikacji. Popraw mnie, jeśli się mylę.
user3797438,

Odpowiedzi:

434

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.

Luca Geretti
źródło
2
Nie jestem pewien, czy rozumiem proponowany przez ciebie schemat komunikacji, ale możesz użyć ZooKeeper do „opublikowania” informacji od producenta i skłonienia kilku konsumentów do ich przeczytania. Jeśli z drugiej strony istnieje tylko jedna instancja każdego rodzaju serwera, korzystanie z ZK jest niewielkie.
Luca Geretti
57
IMO nie wyjaśnia laikowi, czym jest ZooKeeper. Kiedy będę potrzebować ZooKeeper? Co bym na to napisał? Jaki problem rozwiązuje? Czy to sklep z kluczowymi wartościami? Wyszukiwarka? Blokada rozproszona? Dlaczego miałbym wybrać ZooKeeper zamiast np. Redis, pliku, JIRA lub karteczek post-it? Wiesz dużo o ZooKeeper - ale czy możesz to wyjaśnić mniej technicznie?
Dan Passaro,
1
Ponieważ Zookeeper ma liniowe zapisy, nie powstrzymuje mnie to od używania asynchronicznych interfejsów API do tworzenia węzłów i odbierania odpowiedzi w odpowiedzi zwrotnej? Chociaż wewnętrznie może nie pozwalać na równoczesne zapisy, czy coś mi brakuje?
jdk2588
1
„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 master” => czy możesz wskazać mi dokument. czy coś, co to wyjaśnia? Zastanawiam się, czy jest możliwe, że zmiana stanu została pomyślnie wykonana z wyłączeniem serwera, z którym klient jest połączony (w takim przypadku klient może doświadczyć dziwnego zachowania polegającego na tym, że nie jest w stanie odczytać własnego zapisu przez chwilę)
senseiwu
2
Całkowicie i całkowicie przeciwnie do zadanego pytania. Gdyby to był zegar, szukałby „urządzenia zatrzymującego czas”, a nie opisu sprężyny, koła, ucieczki i ich interakcji w oparciu o okres oscylacji, moment bezwładności i wpływ sztucznych kryształów szafiru.
Rick O'Shea
10

Zookeeper to jeden z najlepszych serwerów i usług open source, który pomaga niezawodnie koordynować rozproszone procesy. Zookeeper to system CP (patrz twierdzenie CAP), który zapewnia spójność i tolerancję podziału. Replikacja stanu Zookeeper we wszystkich węzłach sprawia, że ​​jest to ostatecznie spójna usługa rozproszona.

Co więcej, każdy nowo wybrany lider zaktualizuje swoich obserwujących o brakujące propozycje lub migawkę stanu, jeśli obserwatorzy nie mają wielu propozycji.

Zookeeper zapewnia również interfejs API, który jest bardzo łatwy w użyciu. Ten post na blogu, przykłady API Java Zookeeper , zawiera kilka przykładów, jeśli szukasz przykładów.

Więc gdzie tego używamy? Jeśli Twoja usługa rozproszona potrzebuje scentralizowanego, niezawodnego i spójnego zarządzania konfiguracją, blokad, kolejek itp., Zookeeper to niezawodny wybór.

Binu George
źródło
4
„Zookeeper to system CP (patrz Twierdzenie CAP), który zapewnia spójność i tolerancję podziału”, myślę, że Zookeeper ma mistrza i zwolenników, kiedy mistrz jest w dół, wtedy jeden z wyznawców zostanie wybrany na lidera, więc Zookeeper powinien dostarczyć AP, jednak C jest ostatecznie konsekwentnie.
YuFeng Shen
5
W kategoriach twierdzenia CAP „C” w rzeczywistości oznacza linearyzowalność. ZooKeeper w rzeczywistości zapewnia „sekwencyjną spójność” i oznacza, że ​​aktualizacje od klientów będą stosowane w kolejności, w jakiej zostały otrzymane. Jest to słabsze niż linearyzowalność, ale wciąż bardzo silne, znacznie silniejsze niż „ostateczna spójność”. Zookeeper nie jest A, a to dlatego, że jeśli nie można wybrać lidera (bez kworum), wtedy zookeeper nie spełni żądań. Właśnie dlatego nie jest wysoce dostępny.
Binu George
7

Rozumiem ZooKeeper w ogóle, ale miałem problemy z terminami „kworum” i „podzielony mózg”, więc może mogę podzielić się z tobą swoimi odkryciami (uważam się również za laika).

Załóżmy, że mamy klaster ZooKeeper z 5 serwerami. Jeden z serwerów zostanie liderem, a pozostali będą obserwatorami.

  • Te 5 serwerów tworzy kworum. Kworum oznacza po prostu „te serwery mogą głosować na tego, kto powinien być liderem”.

  • Głosowanie opiera się na większości. Większość oznacza po prostu „więcej niż połowę”, więc ponad połowa serwerów musi zgodzić się na to, aby dany serwer został liderem.

  • Jest więc coś złego, co może się zdarzyć, zwane „podzielonym mózgiem”. O ile rozumiem, podzielony mózg jest po prostu tym: klaster 5 serwerów dzieli się na dwie części, albo nazwijmy to „zespołami serwerów”, z być może jedną częścią 2, a drugą 3 serwerami. To naprawdę zła sytuacja, ponieważ obie „drużyny serwerów” muszą wykonać określone zamówienie. Jak zdecydowałbyś, który zespół powinien być preferowany? Mogli otrzymać inne informacje od klientów. Dlatego naprawdę ważne jest, aby wiedzieć, który „zespół serwerów” jest nadal istotny i który można / należy zignorować.

  • Większość jest również powodem, dla którego powinieneś używać nieparzystej liczby serwerów. Jeśli masz 4 serwery i podzielony mózg, gdzie 2 serwery są rozdzielone, wówczas oba „zespoły serwerów” mogą powiedzieć „hej, chcemy zdecydować, kto jest liderem!” ale jak zdecydować, które 2 serwery wybrać? Z 5 serwerami to proste: zespół serwerów z 3 serwerami ma większość i może wybrać nowego lidera.

  • Nawet jeśli masz tylko 3 serwery, a jeden z nich zawiedzie, pozostałe 2 nadal stanowią większość i mogą zgodzić się, że jeden z nich zostanie nowym liderem.

Zdaję sobie sprawę, gdy raz o tym pomyślisz i zrozumiesz warunki, które nie są już tak skomplikowane. Mam nadzieję, że pomoże to również każdemu zrozumieć te warunki.

Inwestować
źródło
1

Zookeeper to scentralizowany serwer typu open source do utrzymywania i konfigurowania informacji konfiguracyjnych, konwencji nazewnictwa i synchronizacji rozproszonego środowiska klastrowego. Zookeeper pomaga systemom rozproszonym zmniejszyć złożoność zarządzania, zapewniając niskie opóźnienia i wysoką dostępność. Zookeeper był początkowo podprojektem dla Hadoop, ale teraz jest najwyższym niezależnym projektem Apache Software Foundation.

Więcej informacji

neel4soft
źródło
2
Co sprawia, że ​​mówisz, że zookeeper jest scentralizowany? Zookeeper może i powinien być rozproszony.
Benjamin Hammer Nørgaard