Shards und Repliken in Elasticsearch

303

Ich versuche zu verstehen, was Shard und Replik in Elasticsearch sind, aber ich habe es nicht verstanden. Wenn ich Elasticsearch herunterlade und das Skript ausführe, habe ich nach meinem Kenntnisstand einen Cluster mit einem einzelnen Knoten gestartet. Jetzt hat dieser Knoten (mein PC) 5 Shards (?) Und einige Replikate (?).

Was sind sie, habe ich 5 Duplikate des Index? Wenn ja warum? Ich könnte eine Erklärung brauchen.

Lucky Luke
quelle
1
Schauen Sie hier: stackoverflow.com/questions/12409438/…
javanna
Dennoch bleibt die Frage unbeantwortet.
LuckyLuke
Ich dachte, die Antwort, die Sie erhalten haben, und die oben verlinkte Antwort sollten die Dinge klarstellen. Was ist dann nicht klar?
Javanna
Ich verstehe nicht, was eine Scherbe und Nachbildungen sind. Ich verstehe nicht, warum es auf einem Knoten viele Shards und Replikate gibt.
LuckyLuke
1
Jeder Index kann in Shards aufgeteilt werden, um Daten verteilen zu können. Der Shard ist der atomare Teil eines Index, der über den Cluster verteilt werden kann, wenn Sie weitere Knoten hinzufügen.
Javanna

Antworten:

966

Ich werde versuchen, dies anhand eines echten Beispiels zu erklären, da die Antwort und die Antworten, die Sie erhalten haben, Ihnen nicht zu helfen scheinen.

Wenn Sie elasticsearch herunterladen und starten, erstellen Sie einen elasticsearch-Knoten, der versucht, einem vorhandenen Cluster beizutreten, falls verfügbar, oder einen neuen erstellt. Angenommen, Sie haben Ihren eigenen neuen Cluster mit einem einzelnen Knoten erstellt, den Sie gerade gestartet haben. Wir haben keine Daten, daher müssen wir einen Index erstellen.

Wenn Sie einen Index erstellen (ein Index wird automatisch erstellt, wenn Sie auch das erste Dokument indizieren), können Sie festlegen, aus wie vielen Shards es bestehen soll. Wenn Sie keine Nummer angeben, wird die Standardanzahl der Shards angegeben: 5 Primärshards. Was bedeutet das?

Dies bedeutet, dass elasticsearch 5 primäre Shards erstellt, die Ihre Daten enthalten:

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

Jedes Mal, wenn Sie ein Dokument indizieren, entscheidet elasticsearch, welcher primäre Shard dieses Dokument enthalten soll, und indiziert es dort. Primäre Shards sind keine Kopie der Daten, sondern die Daten! Wenn Sie mehrere Shards haben, können Sie die Parallelverarbeitung auf einem einzelnen Computer nutzen. Wenn wir jedoch eine andere Elasticsearch-Instanz auf demselben Cluster starten, werden die Shards gleichmäßig über den Cluster verteilt.

Knoten 1 enthält dann beispielsweise nur drei Shards:

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

Da die verbleibenden zwei Shards auf den neu gestarteten Knoten verschoben wurden:

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

Warum passiert das? Da elasticsearch eine verteilte Suchmaschine ist und Sie auf diese Weise mehrere Knoten / Maschinen verwenden können, um große Datenmengen zu verwalten.

Jeder Elasticsearch-Index besteht aus mindestens einem primären Shard, da dort die Daten gespeichert werden. Jeder Shard ist jedoch mit Kosten verbunden. Wenn Sie also einen einzelnen Knoten und kein vorhersehbares Wachstum haben, bleiben Sie einfach bei einem einzelnen primären Shard.

Eine andere Art von Scherbe ist eine Nachbildung. Der Standardwert ist 1, was bedeutet, dass jeder primäre Shard in einen anderen Shard kopiert wird, der dieselben Daten enthält. Replikate werden verwendet, um die Suchleistung zu erhöhen und ein Failover durchzuführen. Ein Replikat-Shard wird niemals auf demselben Knoten zugewiesen, auf dem sich die zugehörige Primärdatenbank befindet (es wäre so ziemlich so, als würde eine Sicherung auf derselben Festplatte wie die Originaldaten erstellt).

Zurück zu unserem Beispiel: Mit 1 Replikat haben wir den gesamten Index für jeden Knoten, da 2 Replikat-Shards auf dem ersten Knoten zugewiesen werden und genau dieselben Daten enthalten wie die primären Shards auf dem zweiten Knoten:

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

Gleiches gilt für den zweiten Knoten, der eine Kopie der primären Shards auf dem ersten Knoten enthält:

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

Wenn bei einem solchen Setup ein Knoten ausfällt, haben Sie immer noch den gesamten Index. Die Replikatshards werden automatisch zu Primärsplittern und der Cluster funktioniert trotz des Knotenausfalls wie folgt ordnungsgemäß:

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

Seitdem "number_of_replicas":1können die Replikate nicht mehr zugewiesen werden, da sie niemals auf demselben Knoten zugewiesen werden, auf dem sich ihre primäre befindet. Aus diesem Grund haben Sie 5 nicht zugewiesene Shards, die Replikate und der Clusterstatus wird YELLOWanstelle von GREEN. Kein Datenverlust, aber es könnte besser sein, da einige Shards nicht zugewiesen werden können.

Sobald der verbleibende Knoten gesichert ist, wird er erneut dem Cluster beigetreten und die Replikate werden erneut zugewiesen. Der vorhandene Shard auf dem zweiten Knoten kann geladen werden, sie müssen jedoch mit den anderen Shards synchronisiert werden, da Schreibvorgänge höchstwahrscheinlich während des Ausfalls des Knotens ausgeführt wurden. Am Ende dieses Vorgangs wird der Clusterstatus GREEN.

Hoffe das klärt die Dinge für dich.

Javanna
quelle
57
Tolle Erklärung, danke, dass du dir die Zeit genommen hast, es zusammenzustellen! :)
LuckyLuke
6
Dies ist bei weitem die beste Erklärung für das Shard / Replica-Konzept. Vielen Dank :)
Frank Förster
1
@javanna Tolle Erklärung, kann man ein bisschen über Multi-Cluster sprechen und wie sie funktionieren?
Raffian
3
Darf ich vorschlagen, weiter zu erklären, was passieren würde, wenn der ausgefallene Knoten wieder hochfährt?
c0dem4gnetic
1
Unterrichten Sie? Weil du es unbedingt solltest. Du rockst. Aber wie @Animesh Pandey fragte, bin ich auch neugierig zu wissen, was mit zwei Replikaten oder 1 Replikat mit 3 Knoten passiert.
frostymarvelous
24

Ein Index wird in Shards aufgeteilt, um sie zu verteilen und zu skalieren.

Replikate sind Kopien der Shards und bieten Zuverlässigkeit, wenn ein Knoten verloren geht. Diese Zahl ist häufig verwirrend, da die Anzahl der Replikate == 1 bedeutet, dass der Cluster über die Haupt- und eine replizierte Kopie des Shards verfügen muss, um im grünen Zustand zu sein.

Damit Replikate erstellt werden können, müssen mindestens 2 Knoten in Ihrem Cluster vorhanden sein.

Möglicherweise sind die Definitionen hier leichter zu verstehen: http://www.elasticsearch.org/guide/reference/glossary/

Beste Grüße, Paul

ppearcy
quelle
Dies ist, was jedes Dokument sagt - der Index ist in Shards unterteilt, aber was enthält der Index tatsächlich?
Alex Pryiomka
@AlexPryiomka, Index enthält Daten
Gaurav
Es ist also im Grunde dasselbe wie die Partitionsreplikation in der Kafka-Welt?
Beatrice
19

Wenn Sie es wirklich nicht gelb sehen möchten. Sie können die Anzahl der Replikate auf Null setzen:

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

Beachten Sie, dass Sie dies nur auf Ihrer lokalen Entwicklungsbox tun sollten.

jyu
quelle
10

Scherbe:

  1. Als verteilter Suchserver wird ElasticSearchein Konzept verwendet, Shardmit dem Indexdokumente auf alle Knoten verteilt werden.
  2. Ein indexkann möglicherweise eine große Datenmenge speichern, die die Hardwaregrenzen von a überschreiten kannsingle node
  3. Beispielsweise passt ein einzelner Index von einer Milliarde Dokumenten, die 1 TB Speicherplatz beanspruchen, möglicherweise nicht auf die Festplatte eines einzelnen Knotens oder ist zu langsam, um Suchanforderungen von einem einzelnen Knoten allein zu bedienen.
  4. Um dieses Problem zu lösen, können Sie ElasticsearchIhren Index in mehrere aufgerufene Teile unterteilen shards.
  5. Wenn Sie einen Index erstellen, können Sie einfach die shards gewünschte Anzahl definieren .
  6. Documentswerden in gespeichert shardsund Shards werden nodesin Ihrem zugeordnetcluster
  7. Wenn Ihr clusterwächst oder schrumpft, Elasticsearchwerden automatisch Scherben dazwischen migriert, nodesso dass das clusterGleichgewicht bleibt.
  8. Eine Scherbe kann entweder a primary shardoder a sein replica shard.
  9. Jedes Dokument in Ihrem Index gehört zu a single primary shard, sodass die Anzahl der primären Shards, über die Sie verfügen, die maximale Datenmenge bestimmt, die Ihr Index enthalten kann
  10. A replica shardist nur eine Kopie eines primären Splitters.

Replik:

  1. Replica shardist die Kopie von primary Shard, um Datenverlust bei Hardwarefehlern zu vermeiden.
  2. ElasticsearchMit dieser Option können Sie eine oder mehrere Kopien der Shards Ihres Index in so genannte Replikatshards oder replicaskurz Replikate erstellen .
  3. Ein indexkann auch null (dh keine Replikate) oder mehrmals repliziert werden.
  4. Die number of shardsund Replikate können zum Zeitpunkt der Indexerstellung pro Index definiert werden.
  5. Nachdem der Index erstellt wurde, können Sie die Anzahl der Replikate jederzeit dynamisch ändern, jedoch nachträglich cannot change the number of shards .
  6. Standardmäßig werden jedem Index in Elasticsearch5 primäre Shards zugewiesen. 1 replicaWenn Sie also mindestens zwei Knoten in Ihrem Cluster haben, verfügt Ihr Index über 5 primäre Shards und weitere 5 Replikatshards (1 vollständiges Replikat) für insgesamt 10 Shards pro Index.
Vino
quelle
6

Ein Index wird in Shards aufgeteilt, um sie zu verteilen und zu skalieren.

Repliken sind Kopien der Scherben.

Ein Knoten ist eine laufende Instanz der elastischen Suche, die zu einem Cluster gehört.

Ein Cluster besteht aus einem oder mehreren Knoten, die denselben Clusternamen haben. Jeder Cluster verfügt über einen einzelnen Masterknoten, der vom Cluster automatisch ausgewählt wird und der ersetzt werden kann, wenn der aktuelle Masterknoten ausfällt.

Pruthvi Kumar
quelle
Ich habe drei AWS ec2Instanzen, auf denen jeweils elasticsearch installiert ist. Bedeutet das, dass wir hier drei Knoten haben? Wenn alle diese Knoten denselben cluster.name: testEigenschaftssatz haben, wird dann ein Clustername erstellt, testder drei Knoten haben würde?
TheCoder
5

Ich werde dies anhand eines realen Wortszenarios erklären. Stellen Sie sich vor, Sie betreiben eine E-Commerce-Website. Je beliebter Sie werden, desto mehr Verkäufer und Produkte werden Ihrer Website hinzugefügt. Sie werden feststellen, dass die Anzahl der Produkte, die Sie möglicherweise indizieren müssen, gestiegen ist und zu groß ist, um auf eine Festplatte eines Knotens zu passen. Selbst wenn es auf die Festplatte passt, ist die lineare Suche durch alle Dokumente auf einem Computer äußerst langsam. Ein Index auf einem Knoten nutzt die verteilte Clusterkonfiguration, auf der die Elasticsearch funktioniert, nicht aus.

Daher teilt elasticsearch die Dokumente im Index auf mehrere Knoten im Cluster auf. Jeder Teil des Dokuments wird als Shard bezeichnet. Jeder Knoten, der einen Shard eines Dokuments trägt, hat nur eine Teilmenge des Dokuments. Angenommen, Sie haben 100 Produkte und 5 Scherben, jede Scherbe hat 20 Produkte. Dieses Sharding von Daten ermöglicht die Suche mit geringer Latenz in der Elasticsearch. Die Suche wird parallel auf mehreren Knoten durchgeführt. Die Ergebnisse werden aggregiert und zurückgegeben. Die Shards bieten jedoch keine Fehlertoleranz. Das heißt, wenn ein Knoten, der den Shard enthält, ausgefallen ist, wird der Clusterzustand gelb. Dies bedeutet, dass einige der Daten nicht verfügbar sind.

Um die Fehlertoleranz zu erhöhen, kommen Repliken ins Bild. Durch Deaktivieren der elastischen Suche wird eine einzelne Replik jeder Scherbe erstellt. Diese Replikate werden immer auf einem anderen Knoten erstellt, auf dem sich der primäre Shard nicht befindet. Um das System fehlertolerant zu machen, müssen Sie möglicherweise die Anzahl der Knoten in Ihrem Cluster erhöhen. Dies hängt auch von der Anzahl der Shards Ihres Index ab. Die allgemeine Formel zur Berechnung der Anzahl der erforderlichen Knoten basierend auf Replikaten und Shards lautet "Anzahl der Knoten = Anzahl der Shards * (Anzahl der Replikate + 1)". Die Standardpraxis besteht darin, mindestens eine Replik für Fehlertoleranz zu haben.

Das Einrichten der Anzahl der Shards ist eine statische Operation. Dies bedeutet, dass Sie sie beim Erstellen eines Index angeben müssen. Jede Änderung nach diesem Vorgang erfordert eine vollständige Neuindizierung der Daten und wird einige Zeit in Anspruch nehmen. Das Einrichten der Anzahl der Replikate ist jedoch ein dynamischer Vorgang und kann jederzeit auch nach der Indexerstellung durchgeführt werden.

Mit dem folgenden Befehl können Sie die Anzahl der Shards und Replikate für Ihren Index festlegen.

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

Keine Antwort, sondern eine weitere Referenz für Kernkonzepte von ElasticSearch, und ich denke, sie sind als Ergänzung zu @ javannas Antwort ziemlich klar.

Scherben

Ein Index kann möglicherweise eine große Datenmenge speichern, die die Hardwarelimits eines einzelnen Knotens überschreiten kann. Beispielsweise passt ein einzelner Index von einer Milliarde Dokumenten, die 1 TB Speicherplatz beanspruchen, möglicherweise nicht auf die Festplatte eines einzelnen Knotens oder ist zu langsam, um Suchanforderungen von einem einzelnen Knoten allein zu bedienen.

Um dieses Problem zu lösen, bietet Elasticsearch die Möglichkeit, Ihren Index in mehrere Teile zu unterteilen, die als Shards bezeichnet werden. Wenn Sie einen Index erstellen, können Sie einfach die Anzahl der gewünschten Shards definieren. Jeder Shard ist für sich genommen ein voll funktionsfähiger und unabhängiger "Index", der auf jedem Knoten im Cluster gehostet werden kann.

Sharding ist aus zwei Hauptgründen wichtig:

  • Sie können Ihr Inhaltsvolumen horizontal aufteilen / skalieren .
  • Sie können damit Vorgänge auf Shards verteilen und parallelisieren (möglicherweise auf mehreren Knoten), wodurch die Leistung / der Durchsatz erhöht werden .

Repliken

In einer Netzwerk- / Cloud-Umgebung, in der jederzeit mit Fehlern zu rechnen ist, ist es sehr nützlich und wird dringend empfohlen, einen Failover-Mechanismus zu verwenden, falls ein Shard / Knoten aus irgendeinem Grund offline geht oder verschwindet. Zu diesem Zweck können Sie mit Elasticsearch eine oder mehrere Kopien der Shards Ihres Index in sogenannte Replikatshards oder kurz Replikate erstellen.

Die Replikation ist aus zwei Hauptgründen wichtig:

  • Es bietet hohe Verfügbarkeit für den Fall, dass ein Shard / Knoten ausfällt. Aus diesem Grund ist zu beachten, dass ein Replikat-Shard niemals auf demselben Knoten zugewiesen wird wie der ursprüngliche / primäre Shard, von dem er kopiert wurde.
  • Sie können Ihr Suchvolumen / Ihren Durchsatz skalieren, da Suchvorgänge für alle Replikate parallel ausgeführt werden können.
Gehört
quelle
1

In ElasticSearch indizieren wir auf der obersten Ebene die Dokumente in Indizes. Jeder Index hat eine Anzahl von Shards, die die Daten intern verteilen, und innerhalb der Shards befinden sich die Lucene-Segmente, die den Kernspeicher der Daten bilden. Wenn der Index also 5 Shards enthält, bedeutet dies, dass Daten auf die Shards verteilt wurden und nicht dieselben Daten in den Shards vorhanden sind.

Achten Sie auf das Video, in dem der Kern von ES https://www.youtube.com/watch?v=PpX7J-G2PEo erläutert wird

Artikel über mehrere Indizes oder mehrere Shards Elastische Suche, mehrere Indizes gegen einen Index und Typen für verschiedene Datensätze?

Prakash Ghanshani
quelle
1

Elasticsearch ist hervorragend skalierbar, da alle Vorteile der verteilten Architektur zugute kommen . Dies wird durch Sharding ermöglicht. Bevor wir uns näher damit befassen, betrachten wir einen einfachen und sehr häufigen Anwendungsfall. Nehmen wir an, Sie haben einen Index, der eine Menge Dokumente enthält, und nehmen der Einfachheit halber an, dass die Größe dieses Index 1 TB beträgt (dh die Summe der Größen jedes einzelnen Dokuments in diesem Index beträgt 1 TB ). Angenommen, Sie haben zwei Knoten mit jeweils 512 GB Speicherplatz zum Speichern von Daten. Wie deutlich zu sehen ist, kann unser gesamter Index nicht in einem der beiden verfügbaren Knoten gespeichert werden. Daher müssen wir unseren Index auf diese Knoten verteilen.

In solchen Fällen, in denen die Größe eines Index die Hardwarelimits eines einzelnen Knotens überschreitet , hilft Sharding . Sharding löst dieses Problem, indem die Indizes in kleinere Teile unterteilt werden. Diese Teile werden als Shards bezeichnet.

Ayush Jain
quelle
0

Im einfachsten Sinne ist das shardnichts anderes als ein Teil eines Index, der auf der Festplatte in einem separaten Ordner gespeichert ist:

Elasticsearch-Scherben

Dieser Screenshot zeigt das gesamte Elasticsearch-Verzeichnis.

Wie Sie sehen können, gehen alle Daten in das dataVerzeichnis.

Wenn C-mAfLltQzuas72iMiIXNwwir den Index untersuchen , sehen wir, dass er fünf Shards (Ordner 0zu 4) enthält.

Andererseits hat der JH_A8PgCRj-GK0GeQ0limwIndex nur einen Shard ( 0Ordner).

Elasticsearch-Scherben

Die priAnsichten geben die Gesamtzahl der Shards an.

Ahmad
quelle