Я попытаюсь объяснить реальным примером, так как ответы и ответы, которые вы получили, похоже, не помогут вам.
Когда вы загружаете и запускаете эластичный поиск, вы создаете узел эластичного поиска, который пытается присоединиться к существующему кластеру, если он доступен, или создает новый. Допустим, вы создали свой новый кластер с одним узлом, который вы только что запустили. У нас нет данных, поэтому нам нужно создать индекс.
Когда вы создаете индекс (индекс создается автоматически и при индексировании первого документа), вы можете определить, из скольких фрагментов он будет составлен. Если вы не укажете число, у него будет количество шардов по умолчанию: 5 основных цветов. Что это означает?
Это означает, чтоasticsearch создаст 5 первичных шардов, которые будут содержать ваши данные:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
Каждый раз, когда вы индексируете документ ,asticsearch решает, какой первичный осколок должен содержать этот документ, и будет индексировать его там. Первичные осколки не являются копией данных, они являются данными! Наличие нескольких сегментов помогает использовать преимущества параллельной обработки на одном компьютере, но суть в том, что если мы запустим еще один экземпляр эластичного поиска в том же кластере, то сегменты будут равномерно распределены по кластеру.
Узел 1 будет содержать, например, только три шарда:
____ ____ ____
| 1 | | 2 | | 3 |
|____| |____| |____|
Поскольку оставшиеся два шарда были перемещены во вновь запущенный узел:
____ ____
| 4 | | 5 |
|____| |____|
Почему это происходит? Посколькуasticsearch является распределенной поисковой системой, и таким образом вы можете использовать несколько узлов / машин для управления большими объемами данных.
Каждый индекс эластичного поиска состоит как минимум из одного основного сегмента, поскольку именно там хранятся данные. Однако каждый осколок обходится дорого, поэтому, если у вас один узел и нет ожидаемого роста, просто придерживайтесь одного основного осколка.
Другой тип осколка - это копия. По умолчанию установлено значение 1, что означает, что каждый основной фрагмент будет скопирован в другой фрагмент, который будет содержать те же данные. Реплики используются для повышения производительности поиска и восстановления после отказа. Осколок реплики никогда не будет размещен на том же узле, где находится связанный первичный объект (это было бы почти как размещение резервной копии на том же диске, что и исходные данные).
Возвращаясь к нашему примеру, с 1 репликой у нас будет целый индекс на каждом узле, так как 2 сегмента реплики будут размещены на первом узле, и они будут содержать точно такие же данные, что и основные сегменты на втором узле:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4R | | 5R |
|____| |____| |____| |____| |____|
То же самое для второго узла, который будет содержать копию первичных осколков на первом узле:
____ ____ ____ ____ ____
| 1R | | 2R | | 3R | | 4 | | 5 |
|____| |____| |____| |____| |____|
При такой настройке, если узел выходит из строя, у вас все еще есть весь индекс. Осколки реплики автоматически станут основными, и кластер будет работать правильно, несмотря на сбой узла, следующим образом:
____ ____ ____ ____ ____
| 1 | | 2 | | 3 | | 4 | | 5 |
|____| |____| |____| |____| |____|
Поскольку у вас есть "number_of_replicas":1
, реплики больше не могут быть назначены, так как они никогда не размещаются на том же узле, где находится их основной. Вот почему вы будете иметь 5 нераспределенных черепки, реплики и статус кластера будет YELLOW
вместо GREEN
. Без потери данных, но это может быть лучше, так как некоторые шарды не могут быть назначены.
Как только оставленный узел будет зарезервирован, он снова присоединится к кластеру, и реплики будут назначены снова. Существующий шард на втором узле может быть загружен, но его необходимо синхронизировать с другими шардами, так как операции записи, скорее всего, происходили, когда узел не работал. В конце этой операции статус кластера станет GREEN
.
Надеюсь, это прояснит вам.