Когда вы запускаете дополнительные узлы Elasticsearch?

Я нахожусь в середине попытки заменить настройку Solr на Elasticsearch. Это новая установка, которая еще не видела производства, поэтому у меня есть много возможностей для того, чтобы возиться с вещами и заставить их работать хорошо.

У меня очень, очень большой объем данных. Я индексирую некоторые данные в реальном времени и удерживаю их на 7 дней (используя поле _ttl). Я не храню данные в индексе (и отключил поле _source). Я ожидаю, что мой индекс стабилизируется вокруг строк 20 миллиардов. Я буду помещать эти данные в 2-3 названных индекса. Производительность поиска до нескольких миллиардов строк вполне приемлема, но производительность индексирования является проблемой.

Я немного смущен тем, что ES использует осколки внутри. Я создал два ES-узла, каждый из которых имеет отдельный каталог данных, каждый из которых содержит 8 индексов и 1 реплику. Когда я смотрю на состояние кластера, я вижу только один осколок и одну реплику для каждого node. Не поддерживает ли каждый node несколько индексов внутри? (Проверка местоположения на диске показывает, что определенно присутствует только один индекс Lucene). - Решено, так как моя настройка индекса не была правильно выбрана из конфигурации. Создание индекса с использованием API и определение количества осколков и реплик теперь произвело именно то, что я ожидал увидеть.

Кроме того, я попытался запустить несколько копий одного и того же ES node (из той же конфигурации), и он распознает, что уже выполняется копирование и создается его собственная рабочая область. У этих новых экземпляров узлов также есть только один индекс на диске. - Теперь, когда каждый node использует несколько индексов, один node со многими индексами более чем достаточен для дросселирования всей системы, поэтому это не проблема.

Когда вы запускаете дополнительные узлы Elasticsearch для максимальной производительности индексации? Должен ли я иметь много узлов, каждый из которых работает с 1 индексом 1 реплики, или меньше узлов с тоннами индексов? Есть ли что-то, что мне не хватает в моей конфигурации, чтобы отдельные узлы делали больше работы?

Также: есть ли какой-либо показатель для того, чтобы знать, когда перегружен только HTTP-сервер node? Прямо сейчас у меня есть один node, посвященный только HTTP, но, помимо использования ЦП, я не могу сказать, работает ли он ОК или нет. Когда пришло время запускать дополнительные узлы HTTP и разделить программное обеспечение индексирования на различные узлы?

Ответ 1

Немного сначала прояснить терминологию:

  • Node: запускается экземпляр Elasticsearch (java-процесс). Обычно каждый node работает на собственной машине.
  • Кластер: один или несколько узлов с тем же именем кластера.
  • Индекс: более или менее как база данных.
  • Тип: более или менее похожий на таблицу базы данных.
  • Осколок: эффективно индекс lucene. Каждый индекс состоит из одного или нескольких осколков. Осколок может быть основным осколком (или просто осколком) или репликой.

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

То, что вы видите в статусе кластера, странно, я бы предложил проверить настройки индекса с помощью получить настройки API. Похоже, вы настроили только один осколок, но в любом случае вы должны увидеть больше осколков, если у вас есть несколько индексов. Если вам нужна дополнительная помощь, вы можете опубликовать вывод, полученный из поиска elastics.

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

Каждый дополнительный осколок приходит со стоимостью, поскольку каждый осколок является фактически экземпляром Lucene. Максимальное количество осколков, которое вы можете иметь на машину, зависит от имеющегося оборудования и ваших данных. Хорошо знать, что наличие 100 индексов с каждым осколком или одним индексом со 100 осколками действительно одинаково, поскольку в обоих случаях у вас будет 100 экземпляров lucene.

Конечно, во время запроса, если вы хотите запросить один индекс elasticsearch, состоящий из 100 фрагментов, elasticsearch должен будет запросить их все, чтобы получить правильные результаты (если вы не использовали определенную маршрутизацию для своих документов, чтобы затем запрашивать только конкретную осколок). Это будет иметь производительность.

Вы можете легко проверить состояние своего кластера и узлов с помощью API-интерфейсов узлов кластера, посредством которого вы можете проверить много полезной информации, все, что вам нужно, чтобы узнать, работают ли ваши узлы плавно или нет. Еще проще, есть пара плагинов для проверки этой информации через хороший пользовательский интерфейс (который в любом случае использует API-интерфейс elasticsearch): paramedic и bigdesk.