ES — анализ таких понятий, как индекс, сегментирование, узел, кластер и т. д.

Elasticsearch

FAQ

1. Почему в сегменте может храниться только Integer.MAX_VALUE - 128 = 2 147 483 519 документов?

показатель

Индекс в общем смысле — это инструмент, который генерируется и устанавливается на основе документов (данных) и используется для быстрого поиска указанных документов.

Определение индекса в ElasticSearch отличается.Индекс в ElasticSearch соответствует базе данных в MySQL, а это означает, что индекс в ElasticSearch больше похож на коллекцию хранения данных, то есть используется для хранения документов.

Данные в ElasticSearch разделены на единицы индекса в соответствии с бизнесом.Тип (type) подобен Таблице в MySQL, которая используется для различения разных наборов данных в одном и том же бизнесе, как показано на следующем рисунке:

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

Однако после версии 6.x Type устарел, поскольку разработчики обнаружили, что аналогия дизайна ElasticSearch с реляционными данными ошибочна. В реляционной базе данных каждая таблица данных независима друг от друга, то есть одни и те же поля данных в разных таблицах не связаны друг с другом. Lucene, используемый в нижней части ElasticSearch, не имеет этой функции в реляционных данных.В одном и том же индексе ElasticSearch поля данных с разными типами сопоставления, но с одним и тем же именем являются одним и тем же полем данных в Lucene, то есть они хранятся вместе как тот же тип данных.

После того, как версия ElasticSearch 6.x отказалась от Типа, рекомендуется, чтобы данные каждого типа (бизнеса) помещались в отдельный индекс, который фактически возвращается к общему определению индекса, а индекс находит документ. Как показано ниже:

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

P.S.: если ElasticSearch все еще использует версию 5.x или ниже, рекомендуется установить только один тип для каждого индекса, чтобы один индекс хранил данные одного типа.

Фрагментация

Из-за аппаратных ограничений физической машины на одном узле может храниться ограниченное количество документов.Если индекс содержит большое количество документов, его нельзя хранить на одном узле. ES предоставляет механизм сегментирования, и один и тот же индекс может храниться в разных сегментах (контейнерах данных).

Осколки делятся на первичные осколки и подчиненные осколки (осколки реплик). Первичные шарды будут распределены максимально равномерно (ребаланс) по разным нодам (например, если у вас 2 ноды, 4 первичных шарда (не считая бэкапа), то каждая нода будет разделена на 2 шарда, а в дальнейшем если добавить 2 ноды, то на этих 4 нодах у вас будет 1 шард (этот процесс называется релокацией, который автоматически завершается после восприятия ЭП). Подчиненный осколок — это просто копия основного оскола, он используется для предоставления избыточных копий данных, подчиненный осколок и основной осколок не будут отображаться на одном узле (во избежание единой точки отказа), по умолчанию создается индекс 5 Каждый основной сегмент будет иметь дополнительный сегмент (5 основных + 5 реплик = 10 сегментов). Если у вас только одна нода, то 5 реплик не могут быть назначены (неназначены), и статус кластера станет Жёлтым.

Осколки независимы, а для поведения запроса поиска каждый осколок выполнит запрос. Каждый осколок - индекс Lucene, поэтому осколок может держать только integer.max_value - 128 = 2147 483 519 документов.

Роль реплики в основном включает в себя:

  1. Аварийное восстановление: если основной сегмент потерян, будет добавлен сегмент реплики, который станет новым основным сегментом, и будет создана новая реплика на основе нового основного сегмента, а данные кластера будут в целости и сохранности;
  2. Повышение производительности запросов: данные реплики и основных сегментов одинаковы, поэтому для запроса вы можете проверить как основной, так и вторичный сегменты, а производительность нескольких реплик в пределах подходящего диапазона будет лучше (но потребление ресурсов необходимо учитывать, что это также увеличит [процессор/диск/куча]). Кроме того, запрос индекса может выполняться только на основном сегменте, а реплики не могут выполнять запрос индекса.

Уведомление: для индекса количество первичных сегментов (number_of_shards) не может быть изменено, пока индекс не будет перестроен, но количество реплик (number_of_replicas) может быть изменено в любое время.

узел

Узел ES — это работающий экземпляр ES, который может реализовывать функции хранения и поиска данных. Каждый узел имеет уникальное имя в качестве идентификатора.Если имя не задано, по умолчанию в качестве имени используется UUID. Лучше всего определить осмысленные имена для каждого узла, чтобы различать каждый узел в кластере.

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

Тип узла

  • главный узел: узел в кластере будет выбран в качестве главного узла, который будет отвечать за управление изменениями в масштабе всего кластера, такими как создание или удаление индексов, добавление узлов в кластер или удаление узлов из него. Мастер-ноде не нужно участвовать в изменениях и поиске на уровне документа, а это значит, что только одна мастер-нода не становится узким местом из-за роста трафика. Любой узел может стать главным узлом.
  • узел данных: содержит данные и инвертированный индекс. По умолчанию каждый узел может стать узлом данных, установив для свойства node.data в файле конфигурации elasticsearch.yml значение true (по умолчанию). Если требуется выделенный главный узел (узел может быть как главным узлом, так и узлом данных), его свойство node.data должно быть установлено в false.
  • клиентский узел: если для свойства node.master и свойства node.data установлено значение false, то узел является клиентским узлом, действующим как балансировщик нагрузки, направляющий входящие запросы на каждый узел в кластере.

кластер

Задав имя кластера, узлы обнаруживают узлы с таким же именем кластера в той же сети, чтобы сформировать кластер. Каждый кластер идентифицируется по имени кластера, а имя кластера по умолчанию — elasticsearch. Если в одной сети есть только один узел, этот узел становится кластером с одним узлом.

статус кластера

  • Зеленый: все первичные и вторичные сегменты готовы (успешно выделены), даже если одна машина не работает (при условии, что одна машина и один экземпляр), данные не будут потеряны, но станут желтыми.

  • Желтый: все первичные сегменты готовы, но есть по крайней мере один первичный сегмент (при условии A), соответствующий неготовым вторичным сегментам.В это время кластер находится в состоянии предупреждения, что означает, что высокая доступность кластера и катастрофоустойчивость снижается.Если машина, на которой он находится, зависнет, а подчиненный осколок еще не готов, то данные А будут потеряны (результат запроса неполный), а кластер перейдет в состояние Red.

  • Красный: по крайней мере один первичный сегмент не готов (прямая причина заключается в том, что не удается найти соответствующий вторичный сегмент, который станет новым основным сегментом), и в результате запроса будут потеряны данные (неполные).

Суммировать

  1. Версия ES 6.x с самого начала не рекомендовала устанавливать более одного типа в индексе. Правильная структура: множество кластерных индексов, индекс предоставляется только одного типа;
  2. Узел работает в независимой среде или виртуальной машине, узел может содержать несколько сегментов, а индекс состоит из нескольких сегментов;
  3. Первичный осколок индекса распределяется максимально равномерно по каждому узлу;
  4. Первичный сегмент и соответствующий вторичный сегмент не могут храниться на одном узле.

эталонное чтение

  1. Кластер ES (кластер), узел (узел), осколки (осколки)
  2. В ElasticSearch какая связь между кластером (Cluster), узлом (Node), осколком (Shard), индексами (index), репликами (backup)? - ответ Феликса Хо