Пошаговое руководство по настройке базового трехузлового кластера
Создание отказоустойчивого кластера Elasticsearch является фундаментальным для достижения высокой доступности и горизонтальной масштабируемости вашей инфраструктуры поиска и аналитики. Трехузловой кластер представляет собой отличную отправную точку, обеспечивая избыточность, необходимую для выдерживания отказа одного узла без прерывания обслуживания. Это подробное руководство проведет вас через процесс установки, настройки и проверки базового трехузлового кластера Elasticsearch, идеально подходящего для сред разработки или небольших производственных развертываний.
К концу этого руководства у вас будет функциональный кластер, где данные могут безопасно распределяться и реплицироваться, используя основные распределенные возможности Elasticsearch.
Предварительные требования
Прежде чем приступить к настройке, убедитесь, что у вас есть следующее:
- Три отдельных сервера/виртуальные машины: Каждый будет размещать один узел. В этом руководстве мы предполагаем, что у вас готовы три отдельных машины или контейнера Docker.
- Java Development Kit (JDK): Elasticsearch требует установленного совместимого JDK на всех узлах (например, JDK 17, в зависимости от вашей версии Elasticsearch).
- Сетевое взаимодействие: Убедитесь, что все три узла могут общаться друг с другом по необходимым портам (порт HTTP по умолчанию: 9200, порт транспорта по умолчанию: 9300).
- Идентичная установка Elasticsearch: Загрузите и распакуйте одинаковую версию Elasticsearch на все три узла.
Шаг 1: Настройка elasticsearch.yml каждого узла
Файл конфигурации elasticsearch.yml, расположенный в каталоге config/ вашей установки Elasticsearch, имеет решающее значение для определения поведения каждого узла в кластере. Вы должны настроить параметры, специфичные для каждого узла.
Мы неявно определим три роли: один узел, подходящий для роли мастера, и три узла, подходящие для роли данных. Для трехузлового кластера обычной практикой является предоставление всем узлам ролей мастера, данных и индексирования.
Общие настройки для всех узлов
Убедитесь, что эти настройки идентичны во всех трех файлах конфигурации:
# Имя кластера: должно быть одинаковым на всех узлах
cluster.name: my-three-node-cluster
# Настройки обнаружения (критически важны для первоначального присоединения)
# Используйте список начальных узлов для загрузки обнаружения
discovery.seed_hosts: ["node1_ip:9300", "node2_ip:9300", "node3_ip:9300"]
# Требуется для кворума (N/2 + 1). Для 3 узлов нам нужно 2 голоса.
cluster.initial_master_nodes: ["node1_name", "node2_name", "node3_name"]
# Сетевые настройки (убедитесь, что привязка к правильному IP-адресу)
network.host: 0.0.0.0 # Или конкретный частный IP-адрес хоста
# Порт HTTP (внешний доступ)
http.port: 9200
# Порт транспорта (внутренняя связь кластера)
transport.port: 9300
Уникальные настройки для каждого узла
Каждому узлу требуется уникальное имя node.name и, возможно, уникальный path.data, если он запускается на той же машине или использует общее хранилище.
Конфигурация узла 1 (node1_ip)
# Уникальный идентификатор для Узла 1
node.name: node-1
# Если пути отличаются
# path.data: /var/lib/elasticsearch/data_node1
Конфигурация узла 2 (node2_ip)
# Уникальный идентификатор для Узла 2
node.name: node-2
Конфигурация узла 3 (node3_ip)
# Уникальный идентификатор для Узла 3
node.name: node-3
Важное примечание о
cluster.initial_master_nodes: Эта настройка используется только при самом первом запуске кластера. Как только кластер сформируется, Elasticsearch будет управлять выбором мастера internally. Если вам когда-либо потребуется перезапустить полностью неработающий кластер, вы должны убедиться, что эти имена соответствуют первоначальной конфигурации.
Шаг 2: Настройка ролей (необязательно, но рекомендуется)
Хотя конфигурация по умолчанию позволяет узлам выполнять все роли (мастер, данные, индексирование, координирование), в более крупных развертываниях роли разделены. Для надежной трехузловой установки мы гарантируем, что все узлы могут быть выбраны в качестве мастера.
Добавьте следующую конфигурацию ролей во все три файла elasticsearch.yml:
# Включить все стандартные роли на всех узлах для этой начальной настройки
node.roles: [ master, data, ingest, remote_cluster_client ]
Обработка кворума для отказоустойчивости
С тремя узлами кластер может выдержать потерю одного узла, сохраняя кворум (2 из 3 узлов остаются). Это управляется списком cluster.initial_master_nodes, предоставленным на Шаге 1.
Шаг 3: Запуск узлов кластера
Запустите Elasticsearch последовательно на каждом узле. Как правило, безопаснее сначала запускать узлы, перечисленные первыми в cluster.initial_master_nodes, хотя современные версии Elasticsearch хорошо обрабатывают неупорядоченный запуск.
На Узле 1, Узле 2 и Узле 3:
Перейдите в каталог установки Elasticsearch и выполните:
# Для запуска в foreground (полезно для отладки)
bin/elasticsearch
# Для запуска в background (рекомендуется для production)
bin/elasticsearch -d
Отслеживайте журналы (logs/elasticsearch.log) на каждом узле на предмет сообщений об успешном запуске, особенно тех, которые указывают на успешное присоединение к кластеру.
Шаг 4: Проверка состояния кластера
После запуска всех узлов используйте API _cat/health, доступный через HTTP-порт любого узла (по умолчанию 9200), чтобы подтвердить состояние кластера.
Получите доступ к этому с машины, которая может достичь узлов (например, через curl):
Проверка состояния:
curl -X GET "http://node1_ip:9200/_cat/health?v"
Ожидаемый фрагмент вывода:
| epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassigned | unpersisted |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1701331200 | 12:00:00 | my-three-node-cluster | green | 3 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
Если status green, а node.total равен 3, ваш кластер работает правильно.
Проверка членства узлов
Чтобы убедиться, что все узлы видят друг друга, проверьте список узлов:
curl -X GET "http://node1_ip:9200/_cat/nodes?v"
Вы должны увидеть три отдельных записи, соответствующие node-1, node-2 и node-3, каждая из которых показывает их IP-адреса и роли (m для подходящего мастера, d для данных).
Шаг 5: Создание тестового индекса с репликацией
Чтобы проверить способность кластера распределять данные и обрабатывать репликацию, мы должны создать индекс, указав как минимум одну реплику.
В трехузловом кластере установка number_of_replicas на 1 гарантирует, что каждый первичный сегмент имеет одну копию (реплику), распределенную по другому узлу, обеспечивая немедленную отказоустойчивость.
Команда создания индекса:
```bash
curl -X PUT "http://node1_ip:9200/test_data_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3