В elastcsearch
каждый экземпляр/сервер с установленным elascsearch
называется нодой (node).
Кластер
Объединение нескольких нод в одну группу, с одинаковым именем называется кластером (cluster). Для создания кластера используется атрибут cluster.name
, в котором задаётся имя кластера. Когда ноды присоединяются к кластеру или отключаются от него, кластер автоматически реорганизуется для равномерного распределения данных по доступным узлам.
Минимальное количество нод в кластере равняется 3.
Связь внутри кластера
В elastcsearch
присутствуют 2 основных механизма коммуникации на сетевом уровне:
- HTTP, который предоставляет
REST API Elasticsearch
- 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
для меж узловой связи- Детали кластера сохраняются в состоянии кластера
- В каждом кластере есть один узел, назначенный мастер нодой
- У вас есть возможность указать какие ноды имеют право голосовать
Комментарии