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 документов.
Роль реплики в основном включает в себя:
- Аварийное восстановление: если основной сегмент потерян, будет добавлен сегмент реплики, который станет новым основным сегментом, и будет создана новая реплика на основе нового основного сегмента, а данные кластера будут в целости и сохранности;
- Повышение производительности запросов: данные реплики и основных сегментов одинаковы, поэтому для запроса вы можете проверить как основной, так и вторичный сегменты, а производительность нескольких реплик в пределах подходящего диапазона будет лучше (но потребление ресурсов необходимо учитывать, что это также увеличит [процессор/диск/куча]). Кроме того, запрос индекса может выполняться только на основном сегменте, а реплики не могут выполнять запрос индекса.
Уведомление: для индекса количество первичных сегментов (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.
-
Красный: по крайней мере один первичный сегмент не готов (прямая причина заключается в том, что не удается найти соответствующий вторичный сегмент, который станет новым основным сегментом), и в результате запроса будут потеряны данные (неполные).
Суммировать
- Версия ES 6.x с самого начала не рекомендовала устанавливать более одного типа в индексе. Правильная структура: множество кластерных индексов, индекс предоставляется только одного типа;
- Узел работает в независимой среде или виртуальной машине, узел может содержать несколько сегментов, а индекс состоит из нескольких сегментов;
- Первичный осколок индекса распределяется максимально равномерно по каждому узлу;
- Первичный сегмент и соответствующий вторичный сегмент не могут храниться на одном узле.