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":1
kö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 YELLOW
anstelle 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.