Эта статья представляет собой введение в физическую архитектуру Elasticsearch: как документы распределяются по виртуальным или физическим машинам и как машины работают вместе, образуя так называемый кластер.
Узлы и кластеры
Для начала мы поговорим об узлах и кластерах, которые занимают центральное место в архитектуре Elasticsearch. Узел - это сервер (физический или виртуальный), который хранит данные и является частью так называемого кластера. Кластер - это совокупность узлов, то есть серверов, и каждый узел содержит часть данных кластера, то есть данные, которые вы добавляете в кластер. Таким образом, совокупность узлов содержит весь набор данных для кластера.
Каждый узел участвует в индексировании и поиске в кластере, что означает, что узел будет участвовать в заданном поисковом запросе путем поиска данных, которые он хранит. Например, у вас могут быть одни данные на узле A и другие данные на узле B, и обе части данных соответствуют заданному запросу. Сейчас важно понять, что узел содержит часть ваших данных, и узел поддерживает поиск этих данных и индексирование новых данных или манипулирование существующими данными.
Помимо этого, стоит также знать, что каждый узел в кластере может обрабатывать HTTP-запросы для клиентов, которые хотят отправить запрос в кластер. Для этого используется HTTP REST API, который предоставляет кластер. После этого определенный узел получает этот запрос и отвечает за координацию остальной работы. Кроме того, данный узел внутри кластера знает о каждом узле в кластере и может направлять запросы на данный узел с помощью транспортного уровня, в то время как уровень HTTP используется исключительно для связи с внешними клиентами. По умолчанию все узлы принимают HTTP-запросы от клиентов.
Каждый узел также может быть назначен так называемым ведущим (мастер узлом) узлом по умолчанию. Ведущий узел (мастер) - это узел, который отвечает за координацию изменений в кластере, таких как добавление или удаление узлов, создание или удаление индексов и т. д. Этот ведущий узел обновляет состояние кластера и является единственным узлом, который может это делать. Для большинства людей это не обязательно помнить, но полезно знать, что именно это происходит под капотом. Мастер-узлы имеют больше возможностей, чем это, но это, как правило, не то, что вам нужно знать как разработчику.
И кластеры, и узлы идентифицируются уникальными именами. Для кластеров имя по умолчанию - elasticsearch всеми строчными буквами, а имя по умолчанию для узлов - это универсальный уникальный идентификатор, также называемый UUID. При желании или необходимости вы можете изменить это поведение по умолчанию. Имена узлов важны, поскольку именно так можно определить, какие физические или виртуальные машины соответствуют тем или иным узлам Elasticsearch.
По умолчанию узлы присоединяются к кластеру с именем elasticsearch, но вы можете настроить узлы на присоединение к определенному кластеру, указав его имя. Однако поведение по умолчанию означает, что если вы запустите несколько узлов в своей сети, они автоматически присоединятся к кластеру с именем elasticsearch. И, если кластера с таким именем еще не существует, он будет сформирован. Поэтому хорошей идеей будет изменить имя по умолчанию в производственной среде, просто чтобы убедиться, что никакие узлы случайно не присоединятся к производственному кластеру, например, при выполнении технического обслуживания кластера или при разработке в той же сети. Надеюсь, ваша машина для разработки не работает в той же сети, что и производственная установка, но на всякий случай это хорошая практика.
В кластере может работать столько узлов, сколько вы хотите, и вполне допустимо иметь кластер только с одним узлом. Архитектура Elasticsearch чрезвычайно масштабируема, в частности, благодаря шардингу, поэтому масштабируемость не будет для вас проблемой, если вы не имеете дело с огромными объемами данных. Существуют кластеры с объемом данных в несколько терабайт, так что есть вероятность, что это не станет для вас проблемой.
Это были самые основы архитектуры Elasticsearch с точки зрения сети и физических/виртуальных машин, но, конечно, это еще не все. Подробнее об этом позже. Теперь давайте перейдем к разговору о том, как хранятся данные в кластере.
Индексы и документы
Теперь, когда вы знаете, что такое кластеры и узлы, давайте подробнее рассмотрим, как организуются и хранятся данные. Каждый элемент данных, который вы храните в кластере, называется документом - это базовая единица информации, которую можно индексировать. Документы представляют собой объекты JSON и соответствуют строкам в реляционной базе данных. Так, если вы хотите хранить данные о человеке, вы можете добавить объект со свойствами имени и страны. Но где же тогда хранятся эти JSON-объекты? Вы уже знаете, что данные хранятся на всех узлах кластера, но как организованы документы? Документы хранятся в так называемых индексах. Индекс - это коллекция документов, которые имеют несколько схожие характеристики, т.е. логически связаны между собой. В качестве примера можно привести индекс для данных о продукции, индекс для данных о клиентах и индекс для заказов.
Документы имеют идентификаторы, присвоенные им либо автоматически Elasticsearch, либо вами при добавлении их в индекс. Документ однозначно идентифицируется индексом и его ID. Вы можете добавить в индекс столько документов, сколько хотите.
Как и в случае с кластерами и узлами, индексы также идентифицируются именами, которые должны быть написаны строчными буквами. Эти имена используются при поиске документов, в этом случае вы указываете индекс для поиска соответствующих документов. То же самое относится к добавлению, удалению и обновлению документов.
Итак, вкратце: документы добавляются в индексы, а индексы представляют собой коллекцию документов, причем сами документы являются объектами JSON.