В elastcsearch каждый экземпляр/сервер с установленным elascsearch называется нодой (node).

Кластер

Объединение нескольких нод в одну группу, с одинаковым именем называется кластером (cluster). Для создания кластера используется атрибут cluster.name, в котором задаётся имя кластера. Когда ноды присоединяются к кластеру или отключаются от него, кластер автоматически реорганизуется для равномерного распределения данных по доступным узлам.

Минимальное количество нод в кластере равняется 3.

Связь внутри кластера

В elastcsearch присутствуют 2 основных механизма коммуникации на сетевом уровне:

  1. HTTP, который предоставляет REST API Elasticsearch
  2. Transport используется для связи между узлами в кластере

HTTP

По умолчанию присваивается значение localhost, с помощью атрибута http.host. Порт по умолчанию является первым доступным между 9200-9299 и настраивается с помощью http.port (можно просто указать один).

Transport

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

Транспорт по умолчанию привязывается к localhost и настраивается с помощью transport.host. Порт по умолчанию является первым доступным между 9300-9399 и настраивается с помощью transport.tcp.port.

Специальные значения для network.host

Если вы привязываете и transport ** и **http к одному ip адресу можно воспользоваться одним атрибутом network.host.

Следующие специальные значения могут использоваться для network.host, например если вы не хотите жёстко привязываться к ip адресу.

Значение Описание
_local_ Любые адреса обратной связи в системе (например, 127.0.0.1)
_site_ Любой локальный адрес сайта в системе (например, 192.168.1.1)
_global_ Любые глобальные адреса в системе (статика)
_[networkInterface]_ Адрес сетевого интерфейса (например, eth0)

Поиск нод внутри кластера

Модуль обнаружения (Discovery Module) отвечает за обнаружение нод в кластере. Процесс модуля обнаружения помогает нодам находить друг друга. Сами узлы он получает из переменной discovery.seed_hosts.

Когда вы прописали значение для discovery.seed_hosts модуль берёт оттуда каждый хост и проверяет его на доступность, посылая ping запросы. Происходит это на каждой ноде в кластере. Если нода не найдёт ни одной ноды с одинаковым именем кластера (cluster.name) она создаст свой кластер.

Примеры discovery.seed_hosts:

discovery.seed_hosts: ["host1", "host2", "host3"]
discovery.seed_hosts: file.txt
sudo cat file.txt
host1
host2
host3

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

Чтобы узнать, как себя чувствует кластер можно проверить состояние кластера (cluster state). С помощью API состояния кластера вы можете получить доступ к метаданным, представляющим состояние всего кластера. А именно набор узлов в кластере, индексы, сопоставления, настройки, выделение сегментов и т. Д.

Вы можете использовать конечную точку _cluster для просмотра состояния кластера:

GET _cluster/state

Для укороченного вывода можно использовать:

GET _cluster/health
{
  "cluster_name" : "elk-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 43,
  "active_shards" : 93,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

Мастер нода (Master Node)

В каждом кластере существует мастер нода, через которую выполняются основные операции, например, создание индекса. Состояние кластера хранится на каждом узле, и его может изменить только мастер нода, которая распространяет его на остальные ноды.

Мастер нода выбирается в кластере путем голосования всеми нодами. Для того чтобы какая-либо нода сала мастером за неё должно проголосовать большинство.

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

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

Конфигурация голосования

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

Чтобы получить текущую конфигурацию голосования:

GET _cluster/state?filter_path=metadata.cluster_coordination.last_committed_config
{
  "metadata" : {
    "cluster_coordination" : {
      "last_committed_config" : [
	     #host1
        "eiX9un9MSZ-4KsmZyEhE9Q",
         #host2
        "CkcXQe1jRQS9_gCJ3WGkVg",
         #host3
        "MOJcfnA4T82Pmlb2Q6wPyA"
      ]
    }
  }
}

Для того чтобы задать кто именно имеет права голоса можно воспользоваться переменной cluster.initial_master_nodes.

cluster.initial_master_nodes: ["host1", "host2", "host3"]

В итоге

  • Elasticsearch использует два механизма сетевой связи: HTTP для клиентов REST; и transport для меж узловой связи
  • Детали кластера сохраняются в состоянии кластера
  • В каждом кластере есть один узел, назначенный мастер нодой
  • У вас есть возможность указать какие ноды имеют право голосовать