Руководство по настройке кластера Elasticsearch с высокой доступностью
Elasticsearch — это мощная, распределенная поисковая и аналитическая система, разработанная для масштабируемости и отказоустойчивости. В производственных средах обеспечение непрерывной работы и отказоустойчивости имеет первостепенное значение. Это руководство проведет вас через основные шаги по настройке нескольких узлов Elasticsearch для создания надежного кластера с высокой доступностью (HA). Следуя этим инструкциям, вы научитесь настраивать свой кластер для противостояния сбоям узлов и поддержания доступности данных, гарантируя, что ваши приложения останутся отзывчивыми, а ваши данные — безопасными.
Настройка кластера Elasticsearch с высокой доступностью включает тщательное планирование ролей узлов, сетевой конфигурации и стратегий репликации данных. Цель состоит в том, чтобы избыточно распределить рабочую нагрузку и данные между несколькими машинами, устраняя единые точки отказа. Эта статья охватит основные концепции, практические шаги по настройке и лучшие практики, которые помогут вам построить устойчивую инфраструктуру Elasticsearch, подходящую для требовательных производственных сценариев.
Понимание высокой доступности в Elasticsearch
Высокая доступность в Elasticsearch достигается с помощью нескольких ключевых механизмов:
- Распределенная архитектура: Elasticsearch по своей сути распределяет данные и операции между несколькими узлами.
- Роли узлов: Различные узлы могут выполнять различные функции, позволяя осуществлять специализированное распределение ресурсов и изоляцию сбоев.
- Репликация шардов: Каждый индекс разделен на шарды, и каждый первичный шард может иметь один или несколько реплик-шардов, хранящихся на разных узлах.
- Выбор мастера: Надежный процесс выборов гарантирует, что узел-мастер всегда доступен для управления состоянием кластера.
- Zen Discovery (Zen2): Этот модуль управляет обнаружением узлов и выборами мастера, гарантируя, что узлы могут находить друг друга и надежно формировать кластер.
Основные роли узлов
В конфигурации HA понимание ролей узлов имеет решающее значение. Основные роли для HA:
- Узлы, имеющие право быть мастером (Master-eligible nodes): Эти узлы отвечают за управление состоянием кластера, включая создание/удаление индексов, отслеживание узлов и распределение шардов. Они не хранят данные и напрямую не обрабатывают запросы на поиск/индексацию, если у них также нет роли
data. Для HA у вас должно быть нечетное количество (обычно 3) выделенных узлов, имеющих право быть мастером, для формирования кворума. - Узлы данных (Data nodes): Эти узлы хранят ваши индексированные данные в шардaх и выполняют операции, связанные с данными, такие как поиск, агрегация и индексация. Они являются рабочими лошадками вашего кластера.
- Узлы только для координации (Coordinating-only nodes): (Необязательно) Эти узлы могут использоваться для маршрутизации запросов, обработки фаз сведения поиска и управления пакетной индексацией. Они не хранят данные или состояние кластера, но могут разгрузить рабочую нагрузку с узлов данных и мастеров.
Шарды и реплики
Elasticsearch хранит ваши данные в шардaх. Каждый индекс состоит из одного или нескольких первичных шардов. Для достижения высокой доступности вы должны настроить один или несколько реплик-шардов для каждого первичного шарда. Реплики-шарды являются копиями первичных шардов. Если узел, на котором размещен первичный шард, выходит из строя, реплика-шард на другом узле может быть повышен до нового первичного, гарантируя отсутствие потери данных и непрерывность работы.
Предварительные требования для настройки кластера HA
Прежде чем приступить к настройке, убедитесь, что ваша среда соответствует этим основным требованиям:
- Java Development Kit (JDK): Elasticsearch требует совместимый JDK (обычно OpenJDK). Убедитесь, что он установлен на всех узлах.
- Системные ресурсы: Выделите достаточный объем ОЗУ (например, 8–32 ГБ), ядер ЦП и дискового пространства с быстрым вводом-выводом (рекомендуются SSD) для каждого узла, особенно для узлов данных.
- Сетевая конфигурация: Все узлы должны иметь возможность общаться друг с другом через определенные порты (по умолчанию 9300 для межузлового взаимодействия, 9200 для HTTP API). Убедитесь, что межсетевые экраны настроены соответствующим образом.
- Операционная система: Для производственных развертываний обычно предпочтительна стабильная дистрибуция Linux (например, Ubuntu, CentOS, RHEL).
Пошаговое руководство по настройке кластера HA
В этом разделе описан процесс установки и настройки многоузлового кластера Elasticsearch.
Шаг 1: Установка Elasticsearch на всех узлах
Установите Elasticsearch на каждом сервере, который будет являться частью вашего кластера. Вы можете использовать менеджеры пакетов (APT для Debian/Ubuntu, YUM для RHEL/CentOS) или скачать архив напрямую.
Пример (Debian/Ubuntu через APT):
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
После установки включите и запустите службу (хотя мы сначала настроим ее).
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
Шаг 2: Настройка elasticsearch.yml на каждом узле
Файл elasticsearch.yml, обычно расположенный по адресу /etc/elasticsearch/, — это место, где вы определяете настройки вашего кластера. Отредактируйте этот файл на каждом узле с соответствующими настройками.
Общая конфигурация для всех узлов
-
cluster.name: Должно быть идентичным для всех узлов, которые вы хотите объединить в один кластер.
yaml cluster.name: my-ha-cluster -
node.name: Уникальное имя для каждого узла, полезное для идентификации.
yaml node.name: node-1 -
network.host: Привязывает Elasticsearch к конкретному сетевому интерфейсу. Используйте0.0.0.0для привязки ко всем доступным интерфейсам или конкретный IP-адрес.
yaml network.host: 0.0.0.0 # или конкретный IP-адрес для безопасных настроек/настроек с несколькими сетевыми картами # network.host: 192.168.1.101 -
http.port: Порт для связи с HTTP-клиентом (по умолчанию 9200).
yaml http.port: 9200 -
transport.port: Порт для межузлового взаимодействия (по умолчанию 9300). Должен быть согласован.
yaml transport.port: 9300
Настройки обнаружения (критически важны для HA)
Эти настройки указывают узлам, как находить друг друга и формировать кластер.
-
discovery.seed_hosts: Список адресов узлов, имеющих право быть мастером, в вашем кластере. Это способ, которым узлы обнаруживают начальные узлы, имеющие право быть мастером. Укажите IP-адреса или имена хостов всех ваших узлов, имеющих право быть мастером.
yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] -
cluster.initial_master_nodes: Используется только при инициализации абсолютно нового кластера в первый раз. Этот список должен содержатьnode.nameузлов, имеющих право быть мастером, которые будут участвовать в первом выборе мастера. После формирования кластера эта настройка игнорируется.
yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- Важный совет: Удалите или закомментируйте
cluster.initial_master_nodesпосле успешного формирования кластера, чтобы предотвратить непреднамеренное поведение, если узел перезапустится и попытается сформировать новый кластер.
- Важный совет: Удалите или закомментируйте
Конфигурация ролей узлов
Укажите роль(и) для каждого узла. Типичная конфигурация HA включает 3 выделенных узла-мастера и несколько узлов данных.
- Узлы, имеющие право быть мастером (например, node-1, node-2, node-3):
yaml node.roles: [master] - Узлы данных (например, node-4, node-5, node-6):
yaml node.roles: [data] - Узлы со смешанными ролями (не рекомендуется для крупномасштабных производственных HA):
yaml node.roles: [master, data]- Лучшая практика: Для истинной высокой доступности и стабильности в производстве выделяйте отдельные узлы для ролей мастера и данных. Это изолирует критически важные процессы мастера от ресурсоемких операций с данными.
Шаг 3: Настройка размера кучи JVM
Отредактируйте /etc/elasticsearch/jvm.options, чтобы установить размер кучи JVM. Хорошим эмпирическим правилом является выделение 50% доступной оперативной памяти, но никогда не более 30–32 ГБ. Например, если сервер имеет 16 ГБ ОЗУ, выделите 8 ГБ:
-Xms8g
-Xmx8g
Шаг 4: Системные настройки
Для производства увеличьте vm.max_map_count и ulimit для открытых файлов на всех узлах. Добавьте эти строки в /etc/sysctl.conf и примените (sudo sysctl -p).
vm.max_map_count=262144
И в /etc/security/limits.conf (или /etc/security/limits.d/99-elasticsearch.conf):
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
Шаг 5: Запуск служб Elasticsearch
Запустите службу Elasticsearch на всех настроенных узлах. Часто рекомендуется сначала запускать узлы, имеющие право быть мастером, но с современным обнаружением порядок менее важен, если discovery.seed_hosts настроен правильно.
sudo systemctl start elasticsearch
Проверьте статус службы и журналы на наличие ошибок:
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
Шаг 6: Проверка состояния кластера
После запуска всех узлов проверьте состояние кластера с помощью API Elasticsearch. Вы можете запрашивать любой узел в кластере.
curl -X GET "localhost:9200/_cat/health?v&pretty"
Ожидаемый вывод:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00 my-ha-cluster green 6 3 0 0 0 0 0 0 0 - 100.0%
status: Должен бытьgreen(все первичные и реплики шардов распределены) илиyellow(все первичные шарды распределены, но некоторые реплики шардов еще нет).redуказывает на серьезную проблему.node.total: Должен соответствовать общему количеству запущенных узлов.node.data: Должен соответствовать количеству узлов данных.
Проверьте узлы, чтобы убедиться, что все они присоединились к кластеру:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
Ожидаемый вывод (пример для 3 мастеров, 3 узлов данных):
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 21 87 0 0.00 0.01 0.05 m * node-1
192.168.1.102 20 88 0 0.00 0.01 0.05 m - node-2
192.168.1.103 22 86 0 0.00 0.01 0.05 m - node-3
192.168.1.104 35 90 1 0.10 0.12 0.11 d - node-4
192.168.1.105 32 89 1 0.11 0.13 0.10 d - node-5
192.168.1.106 30 91 1 0.12 0.10 0.09 d - node-6
Это показывает node-1 как избранного мастера (* в столбце master) и другие узлы как часть кластера.
Шаг 7: Настройка шардирования и репликации индексов
Для вновь созданных индексов Elasticsearch по умолчанию использует один первичный шард и одну реплику (index.number_of_shards: 1, index.number_of_replicas: 1). Для HA вы обычно хотите иметь как минимум одну реплику, что означает, что ваши данные существуют как минимум на двух разных узлах. Это гарантирует, что если один узел выйдет из строя, реплика будет доступна в другом месте.
При создании индекса укажите эти настройки:
```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3