ElasticSearch - Оптимальное количество шардов на узел
Я был бы признателен, если бы кто-то мог предложить оптимальное количество сегментов для каждого узла ES для оптимальной производительности или предоставить какой-либо рекомендуемый способ получения количества сегментов, которое следует использовать, учитывая количество ядер и объем памяти.
8 ответов
Есть три условия, которые вы рассматриваете, прежде чем осколок..
Ситуация 1) Вы хотите использовать эластичный поиск с отказоустойчивостью и высокой доступностью. Тогда вы идете на шардинг. В этом случае вам нужно выбрать количество шардов в соответствии с количеством узлов [экземпляр ES], которые вы хотите использовать в производстве.
Предположим, вы хотите дать 3 узла в производстве. Затем вам нужно выбрать 1 первичный осколок и 2 реплики для каждого индекса. Если вы выберете больше осколков, чем вам нужно.
Ситуация 2) Ваш текущий сервер будет хранить текущие данные. Но из-за динамического увеличения объема данных в будущем у вас может не хватить места на диске, или ваш сервер не сможет обрабатывать много данных, поэтому вам нужно будет настроить больше не таких сегментов, как 2 или 3 сегмента (в соответствии с вашими требованиями) для каждого индекса. Но не должно быть никакой реплики.
Ситуация 3) В этой ситуации вы комбинируете ситуацию ситуации 1 и 2. Затем вам необходимо объединить обе конфигурации. Учитывайте, что ваши данные динамически увеличиваются, а также вам нужна высокая доступность и отказоустойчивость. Затем вы настраиваете индекс с 2 осколками и 1 репликой. Тогда вы можете обмениваться данными между узлами и получить оптимальную производительность..!
Примечание. Затем запрос будет обработан в каждом фрагменте и произведет mapreduce для результатов всех фрагментов и вернет результат нам. Таким образом, процесс сокращения карты является дорогостоящим процессом. Минимум осколков дает нам оптимальную производительность
Если вы используете только один узел в производственной среде, то для каждого индекса оптимальным будет только один основной шард, а не один шард.
Надеюсь, поможет..!
Я опаздываю на вечеринку, но я просто хотел отметить пару вещей:
- Оптимальное количество сегментов на индекс всегда равно 1. Однако это не дает возможности горизонтального масштабирования.
- Оптимальное количество сегментов на узел всегда равно 1. Однако тогда вы не сможете масштабировать по горизонтали больше, чем ваше текущее количество узлов.
Суть в том, что шарды имеют внутреннюю стоимость как для индексации, так и для запросов. Каждый осколок на самом деле является отдельным индексом Lucene. Когда вы запускаете запрос, Elasticsearch должен выполнить этот запрос для каждого сегмента, а затем скомпилировать результаты отдельных фрагментов вместе, чтобы получить окончательный результат для отправки обратно. Преимущество шардинга заключается в том, что индекс может быть распределен по узлам кластера для повышения доступности. Другими словами, это компромисс.
Наконец, следует отметить, что любой более чем 1 шард на узел будет вводить соображения ввода / вывода. Поскольку каждый шард должен индексироваться и запрашиваться индивидуально, для узла с 2 или более шардами потребуется 2 или более отдельных операций ввода-вывода, которые не могут быть запущены одновременно. Если у вас есть SSD на ваших узлах, то фактическая стоимость этого может быть уменьшена, поскольку все операции ввода-вывода происходят намного быстрее. Тем не менее, это то, что нужно знать.
Тогда возникает вопрос: почему вы хотите иметь более одного шарда на узел? Ответом на это является планируемая масштабируемость. Количество шардов в индексе фиксировано. Единственный способ добавить больше сегментов позже - это воссоздать индекс и переиндексировать все данные. В зависимости от размера вашего индекса, это может быть или не иметь большого значения. На момент написания статьи индекс переполнения стека составлял 203 ГБ (см.: https://stackexchange.com/performance). Это большая проблема для воссоздания всех этих данных, так что перефразирование было бы кошмаром. Если у вас есть 3 узла и в общей сложности 6 шардов, это означает, что вы можете легко масштабировать до 6 узлов в более позднюю точку без переназначения.
Только что вернулся с настройки хранилища логов на 10 ТБ, так что давайте поговорим:
Ограничения узла
Основной источник: полное руководство по поиску эластичности
HEAP: максимум 32 ГБ:
Если размер кучи меньше 32 ГБ, JVM может использовать сжатые указатели, что экономит много памяти: 4 байта на указатель вместо 8 байтов.
HEAP: максимум 50% памяти сервера. Остальное оставлено для кэшей файловой системы (таким образом, серверы на 64 ГБ - обычное место):
Lucene хорошо использует кеши файловой системы, которыми управляет ядро. Без достаточного места в кеше файловой системы производительность будет снижаться. Кроме того, чем больше памяти выделено для кучи, тем меньше доступно для всех остальных полей, использующих значения doc.
[Индекс разбит на части] N шардов могут распределить нагрузку на N серверов:
1 осколок может использовать всю вычислительную мощность от 1 узла (это похоже на независимый индекс). Операции над индексами с сегментированием выполняются одновременно на всех фрагментах, и результат агрегируется.
Чем меньше осколков, тем лучше (в идеале это 1 осколок):
Накладные расходы шардинга значительны. См. Этот тест для чисел https://blog.trifork.com/2014/01/07/elasticsearch-how-many-shards/
Чем меньше серверов, тем лучше (в идеале это 1 сервер (с 1 шардом)]):
Нагрузка на индекс может быть разделена между узлами только с помощью шардинга (шарда достаточно, чтобы использовать все ресурсы на узле). Больше шардов позволяет использовать больше серверов, но больше серверов приносит больше накладных расходов на агрегацию данных... Бесплатного ланча нет.
конфигурация
Использование: один большой индекс
Мы помещаем все в один большой индекс и позволяем asticsearch выполнять всю тяжелую работу, связанную с разделением данных. В приложении нет логики, поэтому ее легче разрабатывать и поддерживать.
Предположим, что в будущем мы планируем, что индекс будет максимум 111 ГБ, и у нас есть 50 ГБ серверов (куча 25 ГБ) от нашего облачного провайдера.
Это означает, что у нас должно быть 5 осколков.
Примечание: большинство людей склонны переоценивать свой рост, стараются быть реалистичными. Например, этот пример на 111 ГБ уже является БОЛЬШИМ индексом. Для сравнения, индекс stackru составляет 430 ГБ (2016 г.) и входит в топ-50 сайтов по всему миру, полностью сделанных из письменных текстов миллионов людей.
Использование: Индекс по времени
Когда данных для одного индекса слишком много или они слишком утомительны для управления, следующая вещь - разделить индекс по периоду времени.
Самый экстремальный пример - это журналирование приложений (logstach и graylog), которые каждый день используют новый индекс.
Идеальная конфигурация 1-single-shard-per-index имеет смысл в сценарии. Период вращения индекса может быть отрегулирован, если необходимо, чтобы индекс был меньше кучи.
Особый случай. Представим себе популярный интернет-форум с ежемесячными индексами. 99% запросов попадают в последний индекс. Мы должны установить несколько шардов (например, 3), чтобы распределить нагрузку по нескольким узлам. (Примечание: это, вероятно, ненужная оптимизация. В реальном мире скорость попадания 99% маловероятна, и реплика сегмента может в любом случае распределять часть нагрузки только для чтения).
Использование: Going Exascale (только для записи)
ElasticSearch - это волшебство. Это самая простая база данных для настройки в кластере и одна из немногих, которая может масштабироваться до нескольких узлов (кроме Spanner).
Можно пойти exascale с сотнями узлов эластичного поиска. Должно быть много индексов и сегментов, чтобы распределить нагрузку на такое количество машин, и для этого требуется соответствующая конфигурация сегментирования (в конечном итоге корректируемая по индексу).
Последнее волшебство заключается в настройке маршрутизации эластичного поиска для конкретных узлов для определенных операций.
Также может быть хорошей идеей иметь более одного основного сегмента на узел, в зависимости от варианта использования. Я обнаружил, что массовая индексация была довольно медленной, использовалось только одно ядро ЦП - поэтому у нас была неактивная мощность ЦП и очень низкий IO, определенно аппаратное обеспечение не было узким местом. Статистика пула потоков показала, что при индексации был активен только один массовый поток. У нас много анализаторов и сложных токенизаторов (разложенный анализ немецких слов). Увеличение количества сегментов на узел привело к тому, что активизировалось больше массовых потоков (по одному на сегмент на узле), и это значительно улучшило скорость индексации.
Количество первичных шардов и реплик зависит от следующих параметров:
- Количество узлов данных: осколки реплик для данного основного осколка должны присутствовать на разных узлах данных, что означает, что если есть 3 узла данных: DN1, DN2, DN3, то если основной осколок находится в DN1, то осколок реплики должен присутствовать. в DN2 и/или DN3. Следовательно, количество реплик не должно быть меньше общего количества узлов данных.
- Емкость каждого из узлов данных: размер сегмента не может превышать размер жесткого диска узлов данных, и, следовательно, в зависимости от ожидаемого размера для данного индекса не следует определять первичные сегменты.
- Механизм восстановления в случае сбоя: если данные в данном индексе имеют механизм быстрого восстановления, то 1 реплики должно быть достаточно.
- Требование к производительности из заданного индекса: поскольку сегментирование помогает направить клиентский узел на соответствующий сегмент для повышения производительности и, следовательно, в зависимости от параметра запроса и размера данных, принадлежащих этому параметру запроса, следует учитывать при определении количества первичных сегментов.
Это идеальные и основные рекомендации, которым нужно следовать, их следует оптимизировать в зависимости от реальных вариантов использования.
Если у вас есть данные, которые можно разделить на логические части, и ваши запросы, как правило, являются целевыми, рекомендуется использовать их на основе этой логики, чтобы воспользоваться преимуществами механизма "Custom Routing".
Например, у вас есть данные по недвижимости для 50 штатов, и вы всегда будете запрашивать по 1 или более штатам, вы создадите 50 шардов и маршрут на основе названия штата.
Вместо того, чтобы слепо вещать всем осколкам, вы говорите Elasticsearch: "Эй! Поиск данных об этом шарде! Это все там, я обещаю! ". Например, вы можете направлять документы на основе их кода состояния. Или их почтовый индекс или почтовый индекс. Или то, что обычно ищется / фильтруется в вашем приложении.
Маршрутизация гарантирует, что все документы с одинаковым значением маршрутизации будут находиться в одном и том же сегменте, что исключает необходимость широковещательного поиска.
Подробности смотрите здесь: https://www.elastic.co/blog/customizing-your-document-routing
Это потенциально может заметно повысить производительность, если ваша проблема вписывается в нишу, которую обслуживает пользовательская маршрутизация.
Elastic.co рекомендует:
[…] Поддерживайте количество шардов на узел ниже 20 на настроенную кучу ГБ
Я еще не проверял это, но у AWS есть хорошая статья о лучших практиках ES. Посмотрите на Выбор типов экземпляров и часть тестирования.