Настройка кластера Elasticsearch: пошаговое руководство по конфигурации
Настройте кластер Elasticsearch с безопасными ролями узлов, параметрами обнаружения, сетевыми настройками, размером кучи и проверками работоспособности.
Настройка кластера Elasticsearch: пошаговое руководство по конфигурации
Настройка кластера Elasticsearch в основном сводится к правильному выбору нескольких начальных параметров: имена узлов, обнаружение, роли, сеть и память. Если эти основы неверны, ваш кластер может формироваться ненадёжно, открываться на неправильном интерфейсе или испытывать трудности при перезапуске узлов.
Это руководство описывает основные настройки, которые следует проверить перед тем, как запускать Elasticsearch под реальными нагрузками. Примеры используют elasticsearch.yml и предполагают небольшой кластер из трёх узлов, но те же проверки применимы и при масштабировании.
Предварительные требования
Прежде чем приступить к настройке, убедитесь, что у вас есть следующее:
- Среда выполнения Java: Многие дистрибутивы Elasticsearch включают встроенный JDK. Если вы предоставляете собственную среду выполнения Java, проверьте матрицу совместимости для вашей версии Elasticsearch.
java -version - Системные ресурсы: Выделите достаточный объём ОЗУ, ЦП и дискового пространства для узлов Elasticsearch. Точные требования зависят от объёма данных и сложности запросов.
- Сетевой доступ: Убедитесь, что узлы могут взаимодействовать друг с другом через настроенные транспортные порты (по умолчанию 9300).
Установка
Хотя данное руководство фокусируется на настройке, успешная конфигурация начинается с правильной установки. Elasticsearch можно установить через менеджеры пакетов (apt, yum), загрузив архив или используя Docker. Обратитесь к официальной документации Elasticsearch для получения подробных инструкций по установке, соответствующих вашей операционной системе или способу развёртывания.
Основные файлы конфигурации
Основным файлом конфигурации Elasticsearch является elasticsearch.yml, который обычно находится в каталоге config/ вашей установки Elasticsearch. Ключевые настройки в этом файле определяют поведение кластера.
Настройка кластера: ключевые директивы конфигурации
1. Имя кластера (cluster.name)
Этот параметр уникально идентифицирует ваш кластер. Все узлы в одном кластере должны иметь одинаковое cluster.name. Если он не задан, по умолчанию используется elasticsearch.
- Важность: Необходим для того, чтобы узлы обнаруживали и присоединялись к правильному кластеру. Разные кластеры в одной сети должны иметь разные имена.
- Пример (
elasticsearch.yml):cluster.name: my-production-cluster
2. Роль узла (node.roles)
Узлам Elasticsearch можно назначать определённые роли для оптимизации распределения ресурсов и производительности. Общие роли включают master, data, ingest и ml. Для небольших кластеров один узел может иметь несколько ролей.
- Узел, имеющий право быть мастером: Отвечает за действия на уровне кластера, такие как создание/удаление индексов, отслеживание узлов и распределение шардов. В производственных средах для стабильности рекомендуется выделять отдельные мастер-узлы.
node.roles: [ master ] - Узел данных: Хранит данные и выполняет операции, связанные с данными, такие как индексация и поиск. Выделенные узлы данных имеют решающее значение для производительности.
node.roles: [ data ] - Узел приёма: Используется для предварительной обработки документов перед индексацией (например, с помощью конвейеров приёма).
node.roles: [ ingest ] - Узел машинного обучения: Запускает функции машинного обучения для обнаружения аномалий и других задач.
node.roles: [ ml ] - Координирующий узел: Обрабатывает поисковые и массовые запросы, но не хранит данные и не участвует в выборе мастера. Полезен для разгрузки узлов данных или мастер-узлов от тяжёлых запросов.
node.roles: []
Рекомендация: В производственной среде выделяйте узлы для конкретных ролей (например, отдельные мастер-узлы от узлов данных) для лучшей отказоустойчивости и производительности. Для небольших конфигураций узлы могут иметь комбинированные роли.
3. Сетевые настройки (network.host, http.port, transport.port)
Эти настройки управляют тем, как узлы Elasticsearch взаимодействуют друг с другом.
network.host: IP-адрес или имя хоста, к которому привязывается узел. Для многопоточных кластеров установите IP-адрес, доступный другим узлам. Использование0.0.0.0привязывается ко всем доступным сетевым интерфейсам.network.host: 192.168.1.100 # или network.host: _site_ # или network.host: 0.0.0.0http.port: Порт для HTTP REST API (по умолчанию: 9200).http.port: 9200transport.port: Порт для взаимодействия между узлами (по умолчанию: 9300).transport.port: 9300
Предупреждение: Следите за правилами брандмауэра, чтобы узлы могли взаимодействовать через transport.port.
4. Настройки обнаружения (discovery.seed_hosts, cluster.initial_master_nodes)
Эти настройки критически важны для того, чтобы узлы могли найти и присоединиться к кластеру.
discovery.seed_hosts: Список IP-адресов или имён хостов других узлов в кластере, к которым новые узлы могут подключаться для обнаружения кластера.discovery.seed_hosts: - "host1:9300" - "host2:9300" - "192.168.1.101:9300"cluster.initial_master_nodes: Список имён узлов, имеющих право быть мастером, используемый только для начальной загрузки нового кластера. Удалите этот параметр после того, как кластер сформируется. Оставление устаревших настроек начальной загрузки может вызвать путаницу при последующих перестройках или случайном формировании кластера.cluster.initial_master_nodes: - "node-1" - "node-2" - "node-3"
Совет: В облачных средах или динамических сетях рассмотрите возможность использования таких сервисов, как DNS или механизмы обнаружения облачных провайдеров.
Настройка многопоточного кластера
Чтобы настроить многопоточный кластер, настройте файл elasticsearch.yml для каждого узла. Убедитесь, что:
cluster.nameодинаков на всех узлах.- Каждый узел имеет уникальное
node.name(например,node-1,node-2). network.hostустановлен на IP-адрес, доступный другим узлам.discovery.seed_hostsсодержит адреса как минимум кворума узлов, имеющих право быть мастером.cluster.initial_master_nodesвключает имена начальных мастер-узлов только во время первой загрузки кластера.
Пример для node-1:
cluster.name: my-production-cluster
node.name: node-1
node.roles: [ master, data ]
network.host: 192.168.1.100
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- "192.168.1.100:9300"
- "192.168.1.101:9300"
- "192.168.1.102:9300"
cluster.initial_master_nodes:
- "node-1"
- "node-2"
- "node-3"
Пример для node-2 (аналогично, с node.name: node-2):
cluster.name: my-production-cluster
node.name: node-2
node.roles: [ master, data ]
network.host: 192.168.1.101
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- "192.168.1.100:9300"
- "192.168.1.101:9300"
- "192.168.1.102:9300"
cluster.initial_master_nodes:
- "node-1"
- "node-2"
- "node-3"
5. Размер кучи (jvm.options)
Elasticsearch использует значительный объём памяти. Размер кучи Java Virtual Machine (JVM) настраивается в файле jvm.options (обычно в каталоге config/). Рекомендуется устанавливать минимальный и максимальный размер кучи одинаковыми, чтобы избежать проблем с производительностью, вызванных изменением размера кучи.
- Рекомендация: Установите размер кучи не более половины системной ОЗУ и оставьте память для кэша файловой системы. Избегайте чрезмерно больших куч; многие развёртывания остаются ниже порога сжатых обычных указателей объектов, который обычно находится в диапазоне около 30 ГБ, но зависит от JVM.
Пример (jvm.options):
-Xms4g
-Xmx4g
Это устанавливает начальный и максимальный размер кучи равным 4 гигабайтам.
6. Распределение и репликация шардов (cluster.routing.*)
Эти настройки управляют распределением и репликацией шардов по узлам.
cluster.routing.allocation.disk.watermark.low,high,flood_stage: Пороговые значения для предотвращения выделения шардов на дисках, на которых заканчивается место.cluster.routing.allocation.enable: Управляет выделением шардов (например,all,primaries,new_primaries,none).
Пример:
cluster.routing.allocation.disk.watermark.low: "85%"
cluster.routing.allocation.disk.watermark.high: "90%"
cluster.routing.allocation.disk.watermark.flood_stage: "95%"
Проверка работоспособности кластера
После запуска узлов вы можете проверить работоспособность и состояние кластера с помощью API Cluster Health.
curl -X GET "localhost:9200/_cluster/health?pretty"
Ключевые поля вывода:
status:green(все шарды выделены),yellow(некоторые реплики не назначены),red(некоторые первичные шарды не назначены).number_of_nodes: Общее количество узлов в кластере.number_of_data_nodes: Количество узлов, назначенных как узлы данных.active_shards,relocating_shards,initializing_shards,unassigned_shards.
Совет: Стремитесь к статусу green. Статус yellow указывает на то, что ваши данные в безопасности (первичные шарды выделены), но вам может не хватать реплик для высокой доступности. Статус red означает, что данные находятся под угрозой и требуют немедленного внимания.
Следующие шаги
После успешной настройки кластера Elasticsearch вы обычно переходите к:
- Создание индексов: Определите, как ваши данные будут храниться и организовываться.
- Маппинг: Определите схему для ваших документов, указав типы данных для полей.
- Анализаторы: Настройте текстовый анализ для эффективного полнотекстового поиска.
- Безопасность: Внедрите аутентификацию и авторизацию.
Это руководство обеспечивает необходимую основу для стабильного и производительного кластера Elasticsearch. Непрерывный мониторинг и настройка в соответствии с вашей конкретной рабочей нагрузкой являются ключом к долгосрочному успеху.