Терминология Elasticsearch

В этой статье мы рассмотрим терминологию, с которой вы должны быть знакомы при работе с Elasticsearch.

Почти реальное время

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

Кластеры

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

Узлы

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

По умолчанию узел присоединяется к кластеру с именем "elasticsearch", если не настроено иначе. При запуске одного узла в сети по умолчанию будет создан одноузловой кластер с именем "elasticsearch".

Индексы

Еще одним ключевым понятием в Elasticsearch является индекс. Индекс - это коллекция документов, которая может быть продуктом, заказом или чем-то подобным. Эти примеры будут типами в индексе. Что такое тип, мы рассмотрим чуть позже. Самый простой способ понять, что такое индекс, - это представить его как базу данных в реляционной системе баз данных. Это может быть не всегда верно, поскольку зависит от того, как вы проектируете свой кластер, но, тем не менее, это хорошая отправная точка, и она будет верна для большинства случаев использования.

Индексы идентифицируются именами, которые вы выбираете сами, и эти имена должны быть в нижнем регистре. Эти имена используются при индексировании, поиске, обновлении и удалении документов в индексах. Вы можете определить столько индексов, сколько хотите, в кластере в зависимости от масштаба вашего проекта, но большинство людей будут иметь один или всего несколько.

Типы

Внутри индекса существуют типы документов. Тип представляет собой класс или категорию похожих документов, это может быть продукт или пользователь. Тип состоит из имени и сопоставления, причем сопоставление не обязательно должно быть определено в явном виде. Можно считать, что тип эквивалентен таблице в реляционной базе данных, например, MySQL. Индекс может иметь один или несколько типов, и каждый из них может иметь свое собственное отображение, которое мы обсудим в следующем разделе.

Поскольку Lucene, на котором построен Elasticsearch, не имеет понятия о типах документов, это хранится в поле _type. При поиске определенного типа документа Elasticsearch применяет фильтр по этому полю.

Сопоставления (Маппинг)

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

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

Документы

Документ - это основная единица информации, которая может быть проиндексирована. Он состоит из полей, которые представляют собой пары ключ/значение, где значение может быть различных типов, таких как строки, даты, объекты и т.д. Документ соответствует объекту в объектно-ориентированном языке программирования, а тип документа соответствует классу. Примером документа может быть отдельный пользователь или продукт. Документы выражаются в виде объектов JSON, и вы можете хранить в индексе столько документов, сколько захотите.

Теперь, когда мы рассмотрели несколько концепций, давайте проведем аналогию с реляционными базами данных. Если индекс соответствует базе данных, а тип - таблице, то документ можно представить как эквивалент строки в таблице базы данных. Поля документа соответствуют столбцам, а отображение - схеме таблицы.

Осколки (Шарды)

Сейчас мы обсудим термин "осколки", который также существует, например, в реляционных базах данных. Возможно, вы слышали о концепции "разделения" базы данных, но не волнуйтесь, если это не так. Индекс может быть разделен на несколько частей, и каждая часть называется шардом. Это полезно, если индекс содержит больше данных, чем может хранить аппаратное обеспечение узла. Например, индекс содержит 1 терабайт данных, но жесткий диск узла имеет объем всего 500 гигабайт. Тогда можно создать шард и хранить его на другом узле, где для него достаточно места.

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

Реплики

В то время как шарды улучшают масштабируемость объема содержимого для индексов, реплики обеспечивают высокую доступность. Реплика - это копия шарда, которая может заменить его в случае выхода из строя шарда или узла. Реплика никогда не размещается на том же узле, что и оригинальный шард, а это значит, что в случае отказа данного узла реплика будет доступна на другом узле. Реплики также позволяют масштабировать объем поиска, поскольку реплики могут обрабатывать поисковые запросы.

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий