Руководство по настройке отказоустойчивого кластера Elasticsearch

Обеспечьте непрерывную работу и отказоустойчивость с помощью этого всеобъемлющего руководства по настройке отказоустойчивого кластера Elasticsearch. Узнайте, как настраивать несколько узлов Elasticsearch, изучите такие важные концепции, как роли узлов и репликация шардов, а также реализуйте настройки обнаружения для надежной производственной среды. В этой статье приведены пошаговые инструкции, практические примеры и основные рекомендации, которые помогут гарантировать, что ваша распределенная поисковая и аналитическая система будет устойчивой, безопасной и всегда доступной. Предотвратите потерю данных и простои, освоив конфигурации HA (высокой доступности) Elasticsearch.

51 просмотров

Руководство по настройке кластера 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/, — это место, где вы определяете настройки вашего кластера. Отредактируйте этот файл на каждом узле с соответствующими настройками.

Общая конфигурация для всех узлов

  1. cluster.name: Должно быть идентичным для всех узлов, которые вы хотите объединить в один кластер.
    yaml cluster.name: my-ha-cluster

  2. node.name: Уникальное имя для каждого узла, полезное для идентификации.
    yaml node.name: node-1

  3. network.host: Привязывает Elasticsearch к конкретному сетевому интерфейсу. Используйте 0.0.0.0 для привязки ко всем доступным интерфейсам или конкретный IP-адрес.
    yaml network.host: 0.0.0.0 # или конкретный IP-адрес для безопасных настроек/настроек с несколькими сетевыми картами # network.host: 192.168.1.101

  4. http.port: Порт для связи с HTTP-клиентом (по умолчанию 9200).
    yaml http.port: 9200

  5. transport.port: Порт для межузлового взаимодействия (по умолчанию 9300). Должен быть согласован.
    yaml transport.port: 9300

Настройки обнаружения (критически важны для HA)

Эти настройки указывают узлам, как находить друг друга и формировать кластер.

  1. discovery.seed_hosts: Список адресов узлов, имеющих право быть мастером, в вашем кластере. Это способ, которым узлы обнаруживают начальные узлы, имеющие право быть мастером. Укажите IP-адреса или имена хостов всех ваших узлов, имеющих право быть мастером.
    yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

  2. 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