Осколки и реплики в Elasticsearch


303

Я пытаюсь понять, что такое осколок и реплика в Elasticsearch, но мне не удалось понять это. Если я загружаю Elasticsearch и запускаю скрипт, то из того, что я знаю, я запустил кластер с одним узлом. Теперь этот узел (мой компьютер) имеет 5 осколков (?) И несколько реплик (?).

Что они, у меня есть 5 дубликатов индекса? Если так, то почему? Мне может понадобиться какое-то объяснение.


1
Посмотрите здесь: stackoverflow.com/questions/12409438/…
javanna

Но все же вопрос остается без ответа.
LuckyLuke

Я думал, что ответ, который вы получили, и связанный ответ выше, должны прояснить ситуацию. Что тогда не понятно?
Яванна

Я не понимаю, что такое осколок и реплики. Я не понимаю, почему на одном узле много осколков и реплик.
LuckyLuke

1
Каждый индекс может быть разделен на части, чтобы иметь возможность распространять данные. Осколок - это атомная часть индекса, которая может быть распределена по кластеру, если вы добавите больше узлов.
Джаванна

Ответы:


966

Я попытаюсь объяснить реальным примером, так как ответы и ответы, которые вы получили, похоже, не помогут вам.

Когда вы загружаете и запускаете эластичный поиск, вы создаете узел эластичного поиска, который пытается присоединиться к существующему кластеру, если он доступен, или создает новый. Допустим, вы создали свой новый кластер с одним узлом, который вы только что запустили. У нас нет данных, поэтому нам нужно создать индекс.

Когда вы создаете индекс (индекс создается автоматически и при индексировании первого документа), вы можете определить, из скольких фрагментов он будет составлен. Если вы не укажете число, у него будет количество шардов по умолчанию: 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.

Надеюсь, это прояснит вам.


57
Потрясающее объяснение, спасибо, что нашли время, чтобы собрать это вместе! :)
LuckyLuke

6
Это, безусловно, лучшее объяснение концепции шарда / реплики. Большое спасибо :)
Фрэнк Фёрстер

1
@javanna Отличное объяснение, можете немного рассказать о мульти кластерах и как они работают?
Раффиан

3
Могу ли я предложить дальнейшее объяснение того, что произойдет, когда вышедший из строя узел снова начнет работать?
c0dem4gnetic

1
Вы учите? Потому что вы должны. Ты жжешь. Но, как спросил @Animesh Pandey, мне также любопытно узнать, что происходит с двумя репликами или 1 репликой с 3 узлами.
морозное чудо

24

Индекс разбит на осколки, чтобы распределить их и масштабировать.

Реплики являются копиями осколков и обеспечивают надежность в случае потери узла. В этом числе часто встречается путаница, потому что количество реплик == 1 означает, что кластер должен иметь основную и реплицированную копию сегмента, чтобы быть в зеленом состоянии.

Для создания реплик у вас должно быть как минимум 2 узла в кластере.

Вы можете найти определения здесь проще для понимания: http://www.elasticsearch.org/guide/reference/glossary/

С наилучшими пожеланиями, Пол


Это то, что говорится в каждом документе - индекс разбит на куски, но что на самом деле содержит этот индекс?
Алекс Приёмка

@AlexPryiomka, Индекс содержит данные
Гаурав

Значит, это то же самое, что репликация разделов в мире кафки?
Беатрис

19

Если вам действительно не нравится видеть это желтым. Вы можете установить количество реплик равным нулю:

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

Обратите внимание, что вы должны делать это только в вашей локальной коробке разработки.


10

осколок:

  1. Будучи распределенным поисковым сервером, ElasticSearchиспользует концепцию, призванную Shardраспределять индексные документы по всем узлам.
  2. indexПотенциально может хранить большое количество данных , которые могут превысить аппаратные пределыsingle node
  3. Например, один индекс из миллиарда документов, занимающих 1 ТБ дискового пространства, может не уместиться на диске одного узла или может быть слишком медленным, чтобы обслуживать поисковые запросы только от одного узла.
  4. Чтобы решить эту проблему, Elasticsearchпредоставляется возможность подразделить ваш индекс на несколько частей shards.
  5. Когда вы создаете индекс, вы можете просто определить номер того, shards что вы хотите.
  6. Documentsхранятся в shards, а осколки выделяются nodesв вашемcluster
  7. По мере того, как ваш clusterрастет или сжимается, Elasticsearchавтоматически будут перемещаться осколки между ними, nodesчтобы clusterостатки оставались сбалансированными.
  8. Осколок может быть как primary shardили replica shard.
  9. Каждый документ в вашем индексе принадлежит a single primary shard, поэтому количество имеющихся у вас основных сегментов определяет максимальный объем данных, который может содержать ваш индекс.
  10. А replica shardэто просто копия первичного осколка.

Реплика:

  1. Replica shardявляется копией primary Shard, чтобы предотвратить потерю данных в случае аппаратного сбоя.
  2. Elasticsearchпозволяет вам сделать одну или несколько копий фрагментов вашего индекса в так называемые фрагменты реплики, или replicasдля краткости.
  3. An indexтакже может реплицироваться ноль (то есть не реплики) или более раз.
  4. number of shardsИ реплики могут быть определены для каждого индекса в момент создается индекс.
  5. После создания индекса вы можете в любое время динамически изменять количество реплик, но не сразу cannot change the number of shards .
  6. По умолчанию каждому индексу в Elasticsearchвыделено 5 основных сегментов, и 1 replicaэто означает, что если в вашем кластере есть как минимум два узла, ваш индекс будет иметь 5 основных сегментов и еще 5 сегментов реплики (1 полная реплика), всего 10 сегментов в каждом. индекс.

6

Индекс разбит на осколки, чтобы распределить их и масштабировать.

Реплики являются копиями осколков.

Узел - это запущенный экземпляр упругого поиска, принадлежащий кластеру.

Кластер состоит из одного или нескольких узлов, которые имеют одинаковое имя кластера. Каждый кластер имеет один главный узел, который автоматически выбирается кластером и который можно заменить в случае сбоя текущего главного узла.


У меня есть три AWS ec2экземпляра, на каждом из которых установлен эластичный поиск. Значит у нас тут три узла? Если все эти узлы будут иметь одинаковый cluster.name: testнабор свойств, будет ли оно создавать имя кластера, testкоторое будет иметь три узла?
TheCoder

5

Я объясню это, используя сценарии реального слова. Представьте, что вы работаете на сайте электронной коммерции. По мере того, как вы становитесь более популярными, все больше продавцов и товаров добавляются на ваш сайт. Вы поймете, что число продуктов, которые могут понадобиться для индексации, увеличилось, и оно слишком велико для размещения на одном жестком диске одного узла. Даже если он помещается на жесткий диск, линейный поиск по всем документам на одном компьютере выполняется крайне медленно. один индекс на одном узле не будет использовать преимущества конфигурации распределенного кластера, на которой работает эластичный поиск.

Таким образом ,asticsearch разбивает документы в индексе по нескольким узлам в кластере. Каждый раздел документа называется осколком. Каждый узел, несущий осколок документа, будет иметь только подмножество документа. Предположим, у вас есть 100 товаров и 5 осколков, каждый осколок будет иметь 20 товаров. Это разделение данных делает поиск с малой задержкой возможным в эластичном поиске. поиск ведется параллельно на нескольких узлах. Результаты агрегируются и возвращаются. Однако осколки не обеспечивают отказоустойчивости. Это означает, что если какой-либо узел, содержащий осколок, не работает, состояние кластера становится желтым. Это означает, что некоторые данные недоступны.

Для повышения отказоустойчивости реплики входят в рисунок. По умолчанию упругий поиск создает одну реплику каждого осколка. Эти реплики всегда создаются на другом узле, где основной сегмент не находится. Поэтому для обеспечения отказоустойчивости системы может потребоваться увеличить количество узлов в кластере, и это также зависит от количества сегментов вашего индекса. Общая формула для расчета количества узлов, требуемого на основе реплик и сегментов, представляет собой «количество узлов = количество сегментов * (количество реплик + 1)». Стандартная практика заключается в том, чтобы иметь как минимум одну реплику для отказоустойчивости.

Установка количества сегментов является статической операцией, то есть вы должны указать ее при создании индекса. Любое изменение после этого вульфа требует полной переиндексации данных и займет время. Но настройка количества реплик является динамической операцией и может быть выполнена в любое время после создания индекса.

Вы можете установить количество сегментов и реплик для вашего индекса с помощью приведенной ниже команды.

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

3

Не ответ, а еще одно упоминание об основных понятиях в ElasticSearch, и я думаю, что они довольно понятны как дополнение к ответу @ javanna.

Осколки

Индекс может потенциально хранить большой объем данных, который может превышать аппаратные ограничения одного узла. Например, один индекс из миллиарда документов, занимающих 1 ТБ дискового пространства, может не уместиться на диске одного узла или может быть слишком медленным, чтобы обслуживать поисковые запросы только от одного узла.

Чтобы решить эту проблему, Elasticsearch предоставляет возможность подразделить ваш индекс на несколько частей, называемых осколками. Когда вы создаете индекс, вы можете просто определить количество сегментов, которое вы хотите. Каждый шард сам по себе является полнофункциональным и независимым «индексом», который можно разместить на любом узле кластера.

Осколок важен по двум основным причинам:

  • Это позволяет вам горизонтально разделять / масштабировать объем контента.
  • Это позволяет вам распределять и распараллеливать операции между сегментами (возможно, на нескольких узлах), тем самым увеличивая производительность / пропускную способность .

Реплики

В сетевой / облачной среде, где сбои можно ожидать в любое время, очень полезно и настоятельно рекомендуется иметь механизм отработки отказа в случае, если осколок / узел каким-либо образом отключается или по какой-либо причине исчезает. С этой целью Elasticsearch позволяет вам сделать одну или несколько копий фрагментов вашего индекса в так называемые фрагменты реплики, или, если коротко, реплики.

Репликация важна по двум основным причинам:

  • Это обеспечивает высокую доступность в случае отказа шарда / узла. По этой причине важно отметить, что фрагмент реплики никогда не размещается на том же узле, что и исходный / основной фрагмент, с которого он был скопирован.
  • Это позволяет вам масштабировать объем / пропускную способность поиска, поскольку поиск может выполняться параллельно для всех реплик.

1

В ElasticSearch на верхнем уровне мы индексируем документы в индексы. Каждый индекс имеет количество сегментов, которые распределяют данные внутри, и внутри сегментов существуют сегменты Lucene, которые являются основным хранилищем данных. Таким образом, если в индексе 5 сегментов, это означает, что данные были распределены по сегментам, и в них не существует одинаковых данных.

Следите за видео, которое объясняет ядро ​​ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Статья о нескольких индексах или нескольких сегментах Эластичный поиск, несколько индексов и один индекс и типы для разных наборов данных?


1

Elasticsearch великолепно масштабируем, при этом вся заслуга его распределенной архитектуры. Это стало возможным благодаря шардингу. Теперь, прежде чем углубляться в это, давайте рассмотрим простой и очень распространенный вариант использования. Предположим, у вас есть индекс, который содержит огромное количество документов, и для простоты рассмотрим, что размер этого индекса равен 1 ТБ (т. Е. Сумма размеров каждого документа в этом индексе равна 1 ТБ). ). Кроме того, предположим, что у вас есть два узла каждый с 512 ГБ пространства, доступного для хранения данных. Как ясно видно, весь наш индекс не может быть сохранен ни в одном из двух доступных узлов, и, следовательно, нам необходимо распределить наш индекс по этим узлам.

В таких случаях, когда размер индекса превышает аппаратные ограничения одного узла, на помощь приходит Sharding . Sharding решает эту проблему, разделяя индексы на более мелкие части, и эти части называются Shards.


0

Проще говоря, shardэто не что иное, как часть индекса, который хранится на диске в отдельной папке:

Elasticsearch осколки

Этот снимок экрана показывает весь каталог Elasticsearch.

Как видите, все данные попадают в dataкаталог.

При осмотре индекса C-mAfLltQzuas72iMiIXNwмы видим , что он имеет пять черепков (папки 0к 4).

С другой стороны, у JH_A8PgCRj-GK0GeQ0limwиндекса есть только один шард ( 0папка).

Elasticsearch осколки

Количество priпросмотров общего количества осколков.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.