[Amazon-web-services] Не используется ли балансировщик нагрузки с ElasticSearch?


Answers

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

Чтобы архитектовать свой кластер, вам понадобится фон по двум основным функциям Elasticsearch: 1. Написание и обновление документов и 2. Запрос документов.

Письменные / индексирующие документы в elasticsearch:

  1. Когда новый документ входит в индекс Elasticsearch для индексации, Elasticsearch определяет «первичный осколок», документ должен быть назначен на использование «алгоритма маршрутизации осколков»,
  2. Процесс Lucene, связанный с осколком, «отображает» поля в документе;
  3. Процесс Lucene добавляет документ в «перевернутый индекс Lucene» Lucene,
  4. Любые «осколки (реплики)» затем получают документ; реплика-осколок «отображает» документ и добавляет документ к «перевернутому индексу» Lucene «Lucene»

Запрос документов в Elasticsearch:

  1. По умолчанию, когда запрос отправляется в Elasticsearch, запрос попадает на узел - это становится «узлом запроса» или «узлом запроса шлюза» для этого запроса
  2. Узел передает запрос на каждый осколок в индексе (primary & replica)
  3. каждый осколок выполняет запрос по локальному перевернутому индексу Lucene.
  4. каждый осколок возвращает верхние 10-20 результатов в «узел запроса шлюза»,
  5. «узел запроса шлюза» затем выполняет сортировку слияния на комбинированных результатах, возвращаемых из других осколков,
  6. после завершения сортировки слияния «узел запроса шлюза» и возвращает результаты клиенту
    • слияние-сортировка - это ресурсы центрального процессора и памяти

Архитектор балансировки нагрузки для написания / индексирования / обновления

Elasticsearch self управляет расположением осколков на узлах. «Главный узел» хранит и обновляет «таблицу маршрутизации осколков». «Главный узел» предоставляет копию таблицы маршрутизации осколков на другие узлы кластера.

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

Вероятно, лучше всего указать балансировку нагрузки для записи в «узлы данных» (узлы данных - это узлы, которые содержат data = shards), и пусть узлы данных используют свои таблицы маршрутизации осколков, чтобы получить записи в правильные осколки.

Архивирование запросов

Elasticsearch создал специальный тип узла: «клиентский узел», который содержит «нет данных» и не может стать «главным узлом». Функция клиентского узла состоит в том, чтобы выполнить окончательный слияние ресурсов в конце запроса.

Для AWS вы, вероятно, будете использовать тип экземпляра c3 или c4 как «клиентский узел»,

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

Ура!

Рекомендации:

  1. Типы типов Elasticsearch
  2. Elasticsearch: алгоритм маршрутизации осколков
  3. Эластический поиск: реплики
  4. Elasticsearch: Состояние кластера, то есть таблица маршрутизации осколков
  5. ElasticHQ - Введение в видео Elasticearch
  6. Elasticsearch: номера осколков и масштабирование кластеров
Question

У меня есть кластер из 3 узлов ElasticSearch, работающих на AWS EC2. Эти узлы настраиваются с помощью OpsWorks / Chef. Я намерен сконструировать этот кластер очень упругий и эластичный (узлы могут входить и выходить, когда это необходимо).

Из всего, что я читал об ElasticSearch, кажется, что никто не рекомендует устанавливать балансировку нагрузки перед кластером; вместо этого представляется, что рекомендация состоит в том, чтобы сделать одну из двух вещей:

  1. Направьте своего клиента на URL / IP одного узла, пусть ES выполнит балансировку нагрузки и надеется, что узел никогда не опустится.

  2. Содержите URL-адреса / IP-адреса всех ваших узлов в своем клиентском приложении и попросите приложение обработать логику аварийного восстановления.

Мой фон в основном работает в веб-фермах, где просто разумно создавать огромный пул автономных веб-серверов, бросать перед ним ELB и позволять балансировщику выбирать, какие узлы живы или мертвы. Почему ES, похоже, не поддерживает эту же архитектуру?