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

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

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

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
    }
}
'

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


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

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

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

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

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


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

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

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

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


осколок:

  1. будучи распределенным сервером поиска,ElasticSearch использует понятие Shard для распределения индексных документов по всем узлам.
  2. An index потенциально может хранить большой объем данных, которые могут превысьте аппаратные пределы a 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. на 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

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


я объясню это, используя реальные сценарии word. Представьте, что вы работаете веб-сайт электронной коммерции. По мере того, как вы становитесь все более популярными, все больше продавцов и продуктов добавляются на ваш сайт. Вы поймете, что количество продуктов, которые вам может понадобиться индексировать, выросло, и оно слишком велико, чтобы поместиться на одном жестком диске одного узла. Даже если он вписывается в жесткий диск, выполнение линейного поиска по всем документам на одном компьютере очень медленно. один индекс на одном узле не будет использовать преимущества распределенного конфигурация кластера, на котором работает 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 } } '