ElasticSearch - Как шардинг влияет на производительность индексации? - PullRequest
0 голосов
/ 08 ноября 2018

Я делаю некоторые тесты для одноузлового кластера ElasticSearch.

Я столкнулся с ситуацией, когда большее количество осколков уменьшит производительность индексации - по крайней мере, в одном узле - (как по задержке, так и по пропускной способности)

Вот некоторые из моих номеров:

  • Индексирование с индексированием на 1 осколок + 6K документов в минуту
  • Индекс с 5 индексированными осколками + 3K документов в минуту
  • Индекс с 20 индексированными осколками + 1K документов в минуту

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

Примечание: у меня нет проблем с ресурсами! Ресурсы свободны (процессор и память)

1 Ответ

0 голосов
/ 09 ноября 2018

Просто чтобы вы были на одной странице:

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

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

Теперь, просто чтобы прояснить это, каждый фрагмент представляет собой отдельный индекс lucene, составленный из файлов сегментов, расположенных на вашем диске.При записи будут созданы новые сегменты.Если будет достигнуто определенное количество файлов сегментов, сегменты будут объединены.Поэтому просто добавление большего количества сегментов без их распределения на другие узлы просто увеличит количество операций ввода-вывода и потребление памяти для вашего отдельного узла.Во время поиска запрос будет выполняться против каждого шарда.Затем результаты всех осколков нужно объединить в один результат - больше осколков, больше работы процессора ...

Возвращаясь к вашему вопросу:

ДляВаш индексный регистр с тяжелой записью, с одним узлом, оптимальное количество индексов и сегментов - 1!Но для случая поиска (без доступа по идентификатору) оптимальным количеством шардов на узел является количество доступных процессоров.Таким образом, поиск может выполняться в нескольких потоках, что повышает производительность поиска.

Но каковы преимущества шардинга?

  1. Доступность: реплицируя осколки на другие узлы, вы все равно сможете обслуживать, если некоторые из ваших узлов больше не будут доступны!

  2. ПроизводительностьРаспределение основных сегментов по разным узлам также распределит рабочую нагрузку.

Так что, если в вашем сценарии интенсивная запись, оставьте количество сегментов в индексе низким.Если вам нужна лучшая производительность поиска, увеличьте количество осколков, но помните о «физике».Если вам нужна надежность, примите во внимание количество узлов / реплик.

Дополнительные показания:

https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html

https://www.elastic.co/de/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

https://thoughts.t37.net/designing-the-perfect-elasticsearch-cluster-the-almost-definitive-guide-e614eabc1a87

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