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


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

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

7 235

7 ответов:

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

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

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

это означает, что elasticsearch создаст 5 первичных осколков, которые будут содержать ваши данные:

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

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

узел 1 будет содержать, например, только три осколка:

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

так как оставшиеся два осколка были перемещены в недавно запущенный узел:

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

почему это происходит? Поскольку elasticsearch является распределенной поисковой системой, и таким образом вы можете использовать несколько узлов/машин для управления большими объемами данных.

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

другой тип осколок-это копия. Значение по умолчанию равно 1, Что означает, что каждый первичный сегмент будет скопирован в другой сегмент, который будет содержать те же данные. Реплики используются для повышения производительности поиска и при сбое. Сегмент реплики никогда не будет выделен на том же узле, где находится связанный первичный (это было бы похоже на размещение резервной копии на том же диске, что и исходные данные).

вернемся к нашему примеру, с 1 репликой мы будем иметь весь индекс на каждом узле, так как 3 реплики осколки будут выделены на первом узле, и они будут содержать точно такие же данные, как и праймериз на втором узле:

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

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

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

при такой настройке, если узел идет вниз, у вас все еще есть весь индекс. Сегменты реплики автоматически станут первичными, и кластер будет работать правильно, несмотря на сбой узла, так как следует:

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

так как у вас есть "number_of_replicas":1 реплики не могут быть назначены, так как они не выделяются на том же узле, где их основной. Вот почему у вас будет 5 неназначенных осколков, реплики и статус кластера будет YELLOW вместо GREEN. Без потери данных, но это может быть лучше, так как некоторые осколки не могут быть назначены.

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

надеюсь, что это проясняет вещи для вас.

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

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

обратите внимание, что вы должны сделать это только на местном поле развития.

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

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

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

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

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

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

реплики-это копии осколков.

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

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

осколок:

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

реплика:

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

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

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

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

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

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

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

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

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

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