Odłamki i repliki w Elasticsearch

303

Próbuję zrozumieć, co to jest fragment i replika w Elasticsearch, ale nie udało mi się tego zrozumieć. Jeśli pobiorę Elasticsearch i uruchomię skrypt, to z tego, co wiem, uruchomiłem klaster z jednym węzłem. Teraz ten węzeł (mój komputer) ma 5 odłamków (?) I kilka replik (?).

Co to jest, czy mam 5 duplikatów indeksu? Jeśli tak to dlaczego? Mogę potrzebować wyjaśnienia.

Lucky Luke
źródło
1
Spójrz tutaj: stackoverflow.com/questions/12409438/…
javanna
Ale pytanie pozostaje bez odpowiedzi.
LuckyLuke
Pomyślałem, że odpowiedź, którą otrzymałeś, i powyższa powiązana odpowiedź powinny wyjaśnić różne rzeczy. Co zatem nie jest jasne?
javanna
Nie rozumiem, co to jest odłamek i repliki. Nie rozumiem, dlaczego w jednym węźle jest wiele odłamków i replik.
LuckyLuke
1
Każdy indeks można podzielić na odłamki, aby móc rozpowszechniać dane. Odłamek jest atomową częścią indeksu, którą można rozdzielić w klastrze, jeśli dodasz więcej węzłów.
javanna

Odpowiedzi:

965

Spróbuję wyjaśnić na prawdziwym przykładzie, ponieważ udzielona odpowiedź i odpowiedzi nie wydają się ci pomóc.

Po pobraniu i uruchomieniu go elasticsearch tworzysz węzeł elasticsearch, który próbuje dołączyć do istniejącego klastra, jeśli jest dostępny, lub tworzy nowy. Załóżmy, że utworzyłeś nowy klaster z jednym węzłem, tym, który właśnie uruchomiłeś. Nie mamy danych, dlatego musimy utworzyć indeks.

Podczas tworzenia indeksu (indeks jest tworzony automatycznie również podczas indeksowania pierwszego dokumentu) można określić, z ilu fragmentów będzie się składał. Jeśli nie określisz liczby, będzie ona miała domyślną liczbę odłamków: 5 podstawowych. Co to znaczy?

Oznacza to, że elasticsearch utworzy 5 podstawowych odłamków, które będą zawierać Twoje dane:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Za każdym razem, gdy indeksujesz dokument, elasticsearch decyduje, który odłamek podstawowy ma przechowywać ten dokument, i tam go zindeksuje. Podstawowe odłamki nie są kopią danych, są danymi! Posiadanie wielu odłamków pomaga wykorzystać przetwarzanie równoległe na jednym komputerze, ale chodzi o to, że jeśli uruchomimy inną instancję wyszukiwania elastycznego w tym samym klastrze, odłamki zostaną rozłożone w równomierny sposób w klastrze.

Węzeł 1 będzie wówczas przechowywał na przykład tylko trzy odłamki:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Ponieważ pozostałe dwa odłamki zostały przeniesione do nowo uruchomionego węzła:

 ____    ____
| 4  |  | 5  |
|____|  |____|

Dlaczego to się dzieje? Ponieważ elasticsearch to rozproszona wyszukiwarka, w ten sposób możesz korzystać z wielu węzłów / maszyn do zarządzania dużymi ilościami danych.

Każdy indeks elasticsearch składa się z co najmniej jednego podstawowego fragmentu, ponieważ tam są przechowywane dane. Każdy odłamek ma jednak swoją cenę, dlatego jeśli masz jeden węzeł i nie da się go przewidzieć, po prostu trzymaj się jednego odłamka podstawowego.

Innym rodzajem odłamka jest replika. Wartość domyślna to 1, co oznacza, że ​​każdy podstawowy niezależny fragment zostanie skopiowany do innego niezależnego fragmentu, który będzie zawierał te same dane. Repliki służą do zwiększania wydajności wyszukiwania i przełączania awaryjnego. Odłamek repliki nigdy nie zostanie przydzielony w tym samym węźle, w którym znajduje się powiązany element główny (byłoby to prawie jak umieszczenie kopii zapasowej na tym samym dysku co oryginalne dane).

Wracając do naszego przykładu, z 1 repliką będziemy mieli cały indeks w każdym węźle, ponieważ 2 fragmenty repliki zostaną przydzielone w pierwszym węźle i będą zawierać dokładnie takie same dane, jak podstawowe fragmenty w drugim węźle:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

To samo dla drugiego węzła, który będzie zawierał kopię podstawowych odłamków w pierwszym węźle:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Przy takiej konfiguracji, jeśli nastąpi awaria węzła, nadal masz cały indeks. Odłamki repliki automatycznie staną się podstawowymi, a klaster będzie działał poprawnie pomimo awarii węzła, w następujący sposób:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Skoro tak "number_of_replicas":1, replik nie można już przypisywać, ponieważ nigdy nie są one przydzielane w tym samym węźle, w którym znajduje się ich podstawa. Dlatego będziesz mieć 5 nieprzypisanych odłamków, repliki i status klastra YELLOWzamiast GREEN. Brak utraty danych, ale może być lepiej, ponieważ niektórych odłamków nie można przypisać.

Po utworzeniu kopii zapasowej węzła, który opuścił, ponownie dołączy do klastra i repliki zostaną przypisane ponownie. Istniejący fragment niezależny w drugim węźle można załadować, ale należy go zsynchronizować z innymi fragmentami, ponieważ operacje zapisu najprawdopodobniej miały miejsce, gdy węzeł był wyłączony. Pod koniec tej operacji stanie się status klastra GREEN.

Mam nadzieję, że to wyjaśni ci wszystko.

javanna
źródło
57
Niesamowite wyjaśnienie, dziękuję za poświęcenie czasu na złożenie go w całość! :)
LuckyLuke
6
To zdecydowanie najlepsze wyjaśnienie koncepcji fragmentu / repliki. Wielkie dzięki :)
Frank Förster
1
@javanna Świetne wyjaśnienie, czy można porozmawiać o wielu klastrach i ich działaniu?
raffian
3
Czy mogę zasugerować dalsze wyjaśnienie, co by się stało, gdy zepsuty węzeł ponownie wróci?
c0dem4gnetic
1
Uczysz? Bo całkowicie powinieneś. Rządzisz. Ale jak zapytał @Animesh Pandey, jestem również ciekawy, co dzieje się z dwiema replikami lub 1 repliką z 3 węzłami.
frostymarvelous
24

Indeks dzieli się na odłamki w celu ich dystrybucji i skalowania.

Repliki są kopiami odłamków i zapewniają niezawodność w przypadku utraty węzła. Często występuje zamieszanie w tym numerze, ponieważ liczba replik == 1 oznacza, że ​​klaster musi mieć główną i replikowaną kopię odłamka, aby być w stanie zielonym.

Aby móc utworzyć repliki, musisz mieć co najmniej 2 węzły w klastrze.

Tutaj definicje mogą być łatwiejsze do zrozumienia: http://www.elasticsearch.org/guide/reference/glossary/

Z pozdrowieniami, Paul

ppearcy
źródło
Tak mówi każdy dokument - indeks jest podzielony na części, ale co faktycznie zawiera indeks?
Alex Pryiomka
@AlexPryiomka, Indeks zawiera dane
Gaurav
Więc to w zasadzie to samo co replikacja partycji w świecie Kafka?
beatrice
19

Jeśli naprawdę nie lubisz widzieć żółtego. możesz ustawić liczbę replik na zero:

curl -XPUT 'localhost:9200/_settings' -d '
{
    "index" : {
        "number_of_replicas" : 0
    }
}
'

Pamiętaj, że powinieneś to zrobić tylko na lokalnym polu programistycznym.

jyu
źródło
10

Czerep:

  1. Będąc rozproszonym serwerem wyszukiwania, ElasticSearchwykorzystuje koncepcję zwaną Sharddo dystrybucji dokumentów indeksowych we wszystkich węzłach.
  2. indexPotencjalnie mogą przechowywać duże ilości danych, które mogą przekraczać granic sprzętowychsingle node
  3. Na przykład pojedynczy indeks miliarda dokumentów zajmujących 1 TB miejsca na dysku może nie zmieścić się na dysku jednego węzła lub może być zbyt wolny, aby obsługiwać żądania wyszukiwania z pojedynczego węzła.
  4. Aby rozwiązać ten problem, Elasticsearchzapewnia możliwość podzielenia indeksu na wiele części zwanych shards.
  5. Podczas tworzenia indeksu możesz po prostu zdefiniować żądaną liczbę shards .
  6. Documentssą przechowywane w shards, a odłamki są przydzielane nodesw twoimcluster
  7. W miarę jak clusterrośnie lub kurczy się, Elasticsearchautomatycznie migruje odłamki między nimi nodes, aby clusterpozostały zrównoważone.
  8. Odłamek może być albo primary shardalbo replica shard.
  9. Każdy dokument w indeksie należy do a single primary shard, więc liczba posiadanych odłamków podstawowych określa maksymalną ilość danych, które może pomieścić indeks
  10. A replica shardjest tylko kopią podstawowego odłamka.

Replika:

  1. Replica shardjest kopią primary Shard, aby zapobiec utracie danych w przypadku awarii sprzętu.
  2. Elasticsearchpozwala wykonać jedną lub więcej kopii odłamków indeksu w tak zwanych odłamkach repliki lub replicasw skrócie.
  3. indexMogą być również powielane zera (czyli nie repliki) lub więcej razy.
  4. number of shardsOraz repliki mogą być zdefiniowane za indeksu w czasie indeks jest tworzony.
  5. Po utworzeniu indeksu możesz dynamicznie zmieniać liczbę replik w dowolnym momencie, ale nie cannot change the number of shards później.
  6. Domyślnie do każdego indeksu Elasticsearchprzypisuje się 5 podstawowych odłamków, 1 replicaco oznacza, że ​​jeśli masz co najmniej dwa węzły w klastrze, twój indeks będzie miał 5 odłamków podstawowych i kolejne 5 odłamków repliki (1 kompletna replika), co daje łącznie 10 odłamków na indeks.
Vino
źródło
6

Indeks dzieli się na odłamki w celu ich dystrybucji i skalowania.

Repliki są kopiami odłamków.

Węzeł jest działającą instancją wyszukiwania elastycznego, która należy do klastra.

Klaster składa się z jednego lub więcej węzłów o tej samej nazwie. Każdy klaster ma pojedynczy węzeł główny, który jest wybierany automatycznie przez klaster i który można wymienić, jeśli obecny węzeł główny ulegnie awarii.

Pruthvi Kumar
źródło
Mam trzy AWS ec2instancje, na każdym są zainstalowane elastyczne wyszukiwania. Czyli mamy tutaj trzy węzły? Jeśli wszystkie te węzły mają ten sam cluster.name: testzestaw właściwości, czy utworzy nazwę klastra, testktóra miałaby trzy węzły?
TheCoder,
5

Wyjaśnię to przy użyciu prawdziwych scenariuszy słownych. Wyobraź sobie, że prowadzisz witrynę e-commerce. Gdy stajesz się coraz bardziej popularny, coraz więcej sprzedawców i produktów dodaje się do Twojej witryny. Zrozumiesz, że wzrosła liczba produktów, które mogą być potrzebne do indeksowania, i jest on zbyt duży, aby zmieścić się na jednym dysku twardym jednego węzła. Nawet jeśli zmieści się na dysku twardym, przeszukiwanie liniowe wszystkich dokumentów w jednym urządzeniu jest bardzo wolne. jeden indeks w jednym węźle nie będzie korzystał z konfiguracji klastra rozproszonego, na której działa elasticsearch.

Elasticsearch dzieli dokumenty w indeksie na wiele węzłów w klastrze. Każdy podział dokumentu nazywa się odłamkiem. Każdy węzeł niosący fragment dokumentu będzie miał tylko podzbiór dokumentu. załóżmy, że masz 100 produktów i 5 odłamków, każdy odłamek będzie miał 20 produktów. To dzielenie danych umożliwia wyszukiwanie z małym opóźnieniem w wyszukiwaniu elastycznym. wyszukiwanie odbywa się równolegle na wielu węzłach. Wyniki są agregowane i zwracane. Odłamki nie zapewniają jednak odporności na uszkodzenia. Oznacza to, że jeśli dowolny węzeł zawierający odłamek jest wyłączony, zdrowie klastra staje się żółte. Oznacza to, że niektóre dane nie są dostępne.

Aby zwiększyć odporność na awarie, można zobaczyć repliki. Przez deault wyszukiwanie elastyczne tworzy pojedynczą replikę każdego odłamka. Te repliki są zawsze tworzone w innym węźle, w którym podstawowy fragment nie znajduje się. Aby system był odporny na awarie, konieczne może być zwiększenie liczby węzłów w klastrze i zależy to również od liczby odłamków indeksu. Ogólny wzór do obliczania liczby wymaganych węzłów na podstawie replik i odłamków to „liczba węzłów = liczba odłamków * (liczba replik + 1)”. Standardową praktyką jest posiadanie co najmniej jednej repliki w celu zapewnienia odporności na uszkodzenia.

Konfigurowanie liczby odłamków jest operacją statyczną, co oznacza, że ​​musisz ją określić podczas tworzenia indeksu. Wszelkie zmiany po tym woulf wymagają pełnego ponownego indeksowania danych i potrwają długo. Jednak konfiguracja liczby replik jest operacją dynamiczną i można ją wykonać w dowolnym momencie po utworzeniu indeksu.

możesz ustawić liczbę odłamków i replik dla swojego indeksu za pomocą poniższego polecenia.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'
Keerthikanth Chowdary
źródło
3

Nie odpowiedź, ale kolejne odniesienie do podstawowych pojęć do ElasticSearch, i myślę, że są one dość jasne jako uzupełnienie odpowiedzi @ javanna.

Odłamki

Indeks może potencjalnie przechowywać dużą ilość danych, które mogą przekroczyć ograniczenia sprzętowe pojedynczego węzła. Na przykład pojedynczy indeks miliarda dokumentów zajmujących 1 TB miejsca na dysku może nie zmieścić się na dysku jednego węzła lub może być zbyt wolny, aby obsługiwać żądania wyszukiwania z pojedynczego węzła.

Aby rozwiązać ten problem, Elasticsearch umożliwia podzielenie indeksu na wiele części zwanych odłamkami. Podczas tworzenia indeksu możesz po prostu zdefiniować liczbę odłamków, którą chcesz. Każdy fragment jest sam w sobie w pełni funkcjonalnym i niezależnym „indeksem”, który można hostować w dowolnym węźle w klastrze.

Odłamki są ważne z dwóch głównych powodów:

  • Umożliwia dzielenie / skalowanie zawartości w poziomie.
  • Pozwala na dystrybucję i równoległe operacje między fragmentami (potencjalnie na wielu węzłach), zwiększając w ten sposób wydajność / przepustowość .

Repliki

W środowisku sieci / chmury, w którym można spodziewać się awarii w dowolnym momencie, bardzo przydatne i wysoce zalecane jest posiadanie mechanizmu przełączania awaryjnego na wypadek, gdyby fragment / węzeł w jakiś sposób przejdzie w tryb offline lub zniknie z jakiegokolwiek powodu. W tym celu Elasticsearch pozwala wykonać jedną lub więcej kopii odłamków indeksu w tak zwane odłamki repliki lub w skrócie repliki.

Replikacja jest ważna z dwóch głównych powodów:

  • Zapewnia wysoką dostępność w przypadku awarii fragmentu / węzła. Z tego powodu należy zauważyć, że fragment repliki nigdy nie jest przydzielany w tym samym węźle, co fragment pierwotny / podstawowy, z którego został skopiowany.
  • Pozwala skalować wolumen wyszukiwania / przepustowość wyszukiwania, ponieważ wyszukiwania mogą być wykonywane równolegle na wszystkich replikach.
Hearen
źródło
1

W ElasticSearch na najwyższym poziomie indeksujemy dokumenty do indeksów. Każdy indeks ma liczbę odłamków, które wewnętrznie dystrybuują dane, a wewnątrz odłamków istnieją segmenty Lucene, które są głównym miejscem przechowywania danych. Więc jeśli indeks ma 5 odłamków, oznacza to, że dane zostały rozłożone między odłamkami i nie ma takich samych danych w odłamkach.

Uważaj na wideo, które wyjaśnia rdzeń ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Artykuł o wielu indeksach lub wielu odłamkach Elastyczne wyszukiwanie, wiele indeksów kontra jeden indeks i typy dla różnych zestawów danych?

Prakash Ghanshani
źródło
1

Elasticsearch jest doskonale skalowalny, a cały kredyt należy do jego architektury rozproszonej. Jest to możliwe dzięki Sharding. Teraz, zanim przejdziemy dalej, rozważmy prosty i bardzo powszechny przypadek użycia. Załóżmy, że masz indeks, który zawiera bardzo dużo dokumentów, a dla uproszczenia rozważ, że rozmiar tego indeksu wynosi 1 TB (tj. Suma rozmiarów każdego dokumentu w tym indeksie wynosi 1 TB ). Załóżmy również, że masz dwa Węzły, każdy z 512 GB miejsca dostępnego do przechowywania danych. Jak widać wyraźnie, cały nasz indeks nie może być przechowywany w żadnym z dwóch dostępnych węzłów i dlatego musimy rozdzielić nasz indeks między te węzły.

W takich przypadkach, gdy rozmiar indeksu przekracza ograniczenia sprzętowe pojedynczego węzła, na ratunek przychodzi Sharding . Sharding rozwiązuje ten problem, dzieląc indeksy na mniejsze części, które są nazywane odłamkami.

Ayush Jain
źródło
0

Mówiąc najprościej, shardjest to tylko część indeksu przechowywanego na dysku w oddzielnym folderze:

Odłamki wyszukiwania elastycznego

Ten zrzut ekranu pokazuje cały katalog Elasticsearch.

Jak widać, wszystkie dane trafiają do datakatalogu.

Sprawdzając indeks C-mAfLltQzuas72iMiIXNw, widzimy, że ma on pięć odłamków (folderów 0do 4).

Z drugiej strony JH_A8PgCRj-GK0GeQ0limwindeks ma tylko jeden fragment ( 0folder).

Odłamki wyszukiwania elastycznego

Wyświetla pricałkowitą liczbę odłamków.

Ahmad
źródło