Поиск по сайту:

Как настроить производственный кластер Elasticsearch в Ubuntu 14.04


Введение

Elasticsearch — популярный поисковый сервер с открытым исходным кодом, который используется для распределенного поиска и анализа данных в режиме реального времени. При использовании Elasticsearch для чего-либо, кроме разработки, его следует развертывать на нескольких серверах в виде кластера для обеспечения наилучшей производительности, стабильности и масштабируемости.

В этом руководстве показано, как установить и настроить производственный кластер Elasticsearch в Ubuntu 14.04 в среде облачного сервера.

Хотя ручная настройка кластера Elasticsearch полезна для обучения, настоятельно рекомендуется использовать инструмент управления конфигурацией при любой настройке кластера. Если вы хотите использовать Ansible для развертывания кластера Elasticsearch, следуйте этому руководству: Как использовать Ansible для настройки производственного кластера Elasticsearch.

Предпосылки

Для выполнения этого руководства у вас должно быть как минимум три сервера Ubuntu 14.04, поскольку в кластере Elasticsearch должно быть как минимум 3 узла, подходящих для работы с мастером. Если вы хотите иметь выделенные главные узлы и узлы данных, вам потребуется как минимум 3 сервера для ваших главных узлов плюс дополнительные серверы для ваших узлов данных.

Если вы предпочитаете вместо этого использовать CentOS, ознакомьтесь с этим руководством: Как настроить производственный кластер Elasticsearch в CentOS 7.

Предположения

В этом руководстве предполагается, что ваши серверы используют VPN, подобную описанной здесь: Как использовать Ansible и Tinc VPN для защиты инфраструктуры вашего сервера. Это обеспечит функциональность частной сети независимо от физической сети, которую используют ваши серверы.

Если вы используете общую частную сеть, вы должны использовать VPN для защиты Elasticsearch от несанкционированного доступа. Каждый сервер должен находиться в одной и той же частной сети, поскольку в HTTP-интерфейс Elasticsearch не встроена защита. Частная сеть не должна использоваться совместно с компьютерами, которым вы не доверяете.

Мы будем называть IP-адреса VPN ваших серверов vpn_ip. Мы также предполагаем, что все они имеют интерфейс VPN с именем «tun0», как описано в руководстве, указанном выше.

Установить Java 8

Для Elasticsearch требуется Java, поэтому мы установим ее сейчас. Мы установим последнюю версию Oracle Java 8, потому что это то, что рекомендует Elasticsearch. Однако он должен нормально работать с OpenJDK, если вы решите пойти по этому пути.

Выполните этот шаг на всех своих серверах Elasticsearch.

Добавьте Oracle Java PPA в apt:

  1. sudo add-apt-repository -y ppa:webupd8team/java

Обновите базу данных пакетов apt:

  1. sudo apt-get update

Установите последнюю стабильную версию Oracle Java 8 с помощью этой команды (и примите всплывающее лицензионное соглашение):

  1. sudo apt-get -y install oracle-java8-installer

Обязательно повторите этот шаг на всех ваших серверах Elasticsearch.

Теперь, когда Java 8 установлена, давайте установим ElasticSearch.

Установить эластичный поиск

Elasticsearch можно установить с помощью менеджера пакетов, добавив список источников пакетов Elastic. Выполните этот шаг на всех своих серверах Elasticsearch.

Выполните следующую команду, чтобы импортировать открытый GPG-ключ Elasticsearch в apt:

  1. wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Если ваше приглашение просто висит там, вероятно, оно ожидает ввода пароля вашего пользователя (для авторизации команды sudo). В этом случае введите свой пароль.

Создайте список источников Elasticsearch:

  1. echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

Обновите базу данных пакетов apt:

  1. sudo apt-get update

Установите Elasticsearch с помощью этой команды:

  1. sudo apt-get -y install elasticsearch

Обязательно повторите эти шаги на всех ваших серверах Elasticsearch.

Elasticsearch теперь установлен, но его необходимо настроить, прежде чем вы сможете его использовать.

Настройка кластера Elasticsearch

Теперь пришло время отредактировать конфигурацию Elasticsearch. Выполните эти шаги на всех своих серверах Elasticsearch.

Откройте файл конфигурации Elasticsearch для редактирования:

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

В последующих разделах объясняется, как должна быть изменена конфигурация.

Привязать к IP-адресу или интерфейсу VPN

Вам нужно ограничить внешний доступ к вашему экземпляру Elasticsearch, чтобы посторонние не могли получить доступ к вашим данным или закрыть ваш кластер Elasticsearch через HTTP API. Другими словами, вы должны настроить Elasticsearch таким образом, чтобы он разрешал доступ только к серверам в вашей частной сети (VPN). Для этого нам нужно настроить каждый узел для привязки к IP-адресу VPN, vpn_ip, или интерфейсу \tun0.

Найдите строку, в которой указан network.host, раскомментируйте ее и замените ее значение IP-адресом VPN соответствующего сервера (например, 10.0.0.1 для node01) или именем интерфейса. Поскольку наш VPN-интерфейс называется «tun0» на всех наших серверах, мы можем настроить все наши серверы с помощью одной и той же строки:

network.host: [_tun0_, _local_]

Обратите внимание на добавление \_local_, которое настраивает Elasticsearch на прослушивание всех устройств обратной связи. Это позволит вам использовать HTTP-API Elasticsearch локально, с каждого сервера, отправляя запросы на localhost. Если вы не включаете это, Elasticsearch будет отвечать только на запросы к IP-адресу VPN.

Предупреждение. Поскольку Elasticsearch не имеет встроенной защиты, очень важно, чтобы вы не устанавливали для этого какой-либо IP-адрес, доступный для любых серверов, которые вы не контролируете или которым не доверяете. Не привязывайте Elasticsearch к общедоступному или совместно используемому IP-адресу частной сети!

Установить имя кластера

Затем установите имя вашего кластера, которое позволит вашим узлам Elasticsearch присоединиться и сформировать кластер. Вы захотите использовать описательное имя, которое является уникальным (в пределах вашей сети).

Найдите строку, в которой указано cluster.name, раскомментируйте ее и замените ее значение на желаемое имя кластера. В этом уроке мы назовем наш кластер «производство»:

cluster.name: production

Установить имя узла

Далее мы установим имя каждого узла. Это должно быть описательное имя, уникальное в кластере.

Найдите строку, в которой указано node.name, раскомментируйте ее и замените ее значение желаемым именем узла. В этом руководстве мы установим для каждого имени узла имя хоста сервера с помощью переменной среды $ {HOSTNAME}:

node.name: ${HOSTNAME}

Если вы предпочитаете, вы можете назвать свои узлы вручную, но убедитесь, что вы указываете уникальные имена. Вы также можете оставить node.name закомментированным, если не возражаете против того, чтобы ваши узлы назывались случайным образом.

Установить хосты обнаружения

Далее вам нужно будет настроить первоначальный список узлов, с которыми будут связываться для обнаружения и формирования кластера. Это необходимо в одноадресной сети.

Найдите строку, в которой указано discovery.zen.ping.unicast.hosts, и раскомментируйте ее. Замените его значение массивом строк IP-адресов VPN или имен хостов (которые разрешаются в IP-адреса VPN) всех остальных узлов.

Например, если у вас есть три сервера node01, node02 и node03 с соответствующими IP-адресами VPN 10.0.0.1, 10.0.0.2 и 10.0.0.3, вы можете использовать эту строку:

discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

В качестве альтернативы, если все ваши серверы настроены на разрешение IP-адресов VPN на основе имен (через DNS или /etc/hosts), вы можете использовать эту строку:

discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]

Примечание. Ansible Playbook в предварительном руководстве по VPN автоматически создает записи /etc/hosts на каждом сервере, которые разрешают инвентарное имя хоста каждого VPN-сервера (указанное в файле Ansible hosts) для его IP-адрес VPN.

Сохранить и выйти

Теперь ваши серверы настроены для формирования базового кластера Elasticsearch. Есть и другие параметры, которые вы захотите обновить, но мы перейдем к ним после того, как убедимся, что кластер работает.

Сохраните и закройте elasticsearch.yml.

Запустить Elasticsearch

Теперь запустите Elasticsearch:

  1. sudo service elasticsearch restart

Затем выполните эту команду, чтобы запустить Elasticsearch при загрузке:

  1. sudo update-rc.d elasticsearch defaults 95 10

Обязательно повторите эти шаги (Настройка кластера Elasticsearch) на всех ваших серверах Elasticsearch.

Проверить состояние кластера

Если все настроено правильно, ваш кластер Elasticsearch должен работать. Прежде чем двигаться дальше, давайте проверим, что он работает правильно. Вы можете сделать это, запросив Elasticsearch с любого из узлов Elasticsearch.

На любом из ваших серверов Elasticsearch запустите эту команду, чтобы распечатать состояние кластера:

  1. curl -XGET 'http://localhost:9200/_cluster/state?pretty'

Вы должны увидеть выходные данные, указывающие на то, что кластер с именем «производство» запущен. Он также должен указывать на то, что все настроенные вами узлы являются членами:

Cluster State:
{ "cluster_name" : "production", "version" : 36, "state_uuid" : "MIkS5sk7TQCl31beb45kfQ", "master_node" : "k6k2UObVQ0S-IFoRLmDcvA", "blocks" : { }, "nodes" : { "Jx_YC2sTQY6ayACU43_i3Q" : { "name" : "node02", "transport_address" : "10.0.0.2:9300", "attributes" : { } }, "k6k2UObVQ0S-IFoRLmDcvA" : { "name" : "node01", "transport_address" : "10.0.0.1:9300", "attributes" : { } }, "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "node03", "transport_address" : "10.0.0.3:9300", "attributes" : { } } }, ...

Если вы видите вывод, похожий на этот, ваш кластер Elasticsearch работает! Если какие-либо из ваших узлов отсутствуют, проверьте конфигурацию соответствующих узлов, прежде чем двигаться дальше.

Далее мы рассмотрим некоторые параметры конфигурации, которые следует учитывать для вашего кластера Elasticsearch.

Включить блокировку памяти

Elastic рекомендует любой ценой избегать замены процесса Elasticsearch из-за его негативного влияния на производительность и стабильность. Один из способов избежать чрезмерного свопинга — настроить Elasticsearch для блокировки необходимой памяти.

Выполните этот шаг на всех своих серверах Elasticsearch.

Отредактируйте конфигурацию Elasticsearch:

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

Найдите строку, указывающую bootstrap.mlockall, и раскомментируйте ее:

bootstrap.mlockall: true

Сохранить и выйти.

Затем откройте файл /etc/default/elasticsearch для редактирования:

  1. sudo vi /etc/default/elasticsearch

Сначала найдите ES_HEAP_SIZE, раскомментируйте его и установите примерно 50% доступной памяти. Например, если у вас есть около 4 ГБ свободного места, установите его равным 2 ГБ (2g):

ES_HEAP_SIZE=2g

Затем найдите и раскомментируйте MAX_LOCKED_MEMORY=unlimited. Когда вы закончите, это должно выглядеть так:

MAX_LOCKED_MEMORY=unlimited

Сохранить и выйти.

Теперь перезапустите Elasticsearch, чтобы применить изменения:

  1. sudo service elasticsearch restart

Обязательно повторите этот шаг на всех ваших серверах Elasticsearch.

Проверить статус Mlockall

Чтобы убедиться, что mlockall работает на всех ваших узлах Elasticsearch, выполните эту команду с любого узла:

  1. curl http://localhost:9200/_nodes/process?pretty

Каждый узел должен иметь строку с текстом mlockall : true, которая указывает, что блокировка памяти включена и работает:

Nodes process output:
... "nodes" : { "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "es03", "transport_address" : "10.0.0.3:9300", "host" : "10.0.0.3", "ip" : "10.0.0.3", "version" : "2.2.0", "build" : "8ff36d1", "http_address" : "10.0.0.3:9200", "process" : { "refresh_interval_in_millis" : 1000, "id" : 1650, "mlockall" : true } ...

Если mlockall имеет значение false для любого из ваших узлов, проверьте настройки узла и перезапустите Elasticsearch. Распространенной причиной того, что Elasticsearch не запускается, является слишком большое значение ES_HEAP_SIZE.

Настройте лимит дескрипторов открытых файлов (необязательно)

По умолчанию ваш узел Elasticsearch должен иметь «Предел дескриптора открытого файла» 64 КБ. В этом разделе показано, как проверить это и, если хотите, увеличить его.

Как проверить максимальное количество открытых файлов

Сначала найдите идентификатор процесса (PID) вашего процесса Elasticsearch. Самый простой способ сделать это — использовать команду ps для вывода списка всех процессов, принадлежащих пользователю elasticsearch:

  1. ps -u elasticsearch

Вы должны увидеть вывод, который выглядит следующим образом. Число в первом столбце — это PID вашего процесса Elasticsearch (java):

Output:
PID TTY TIME CMD 11708 ? 00:00:10 java

Затем запустите эту команду, чтобы показать ограничения на количество открытых файлов для процесса Elasticsearch (замените выделенное число своим собственным PID из предыдущего шага):

  1. cat /proc/11708/limits | grep 'Max open files'
Output
Max open files 65535 65535 files

Цифры во втором и третьем столбцах обозначают мягкое и жесткое ограничения соответственно: 64k (65535). Это нормально для многих настроек, но вы можете увеличить этот параметр.

Как увеличить максимальное количество файловых дескрипторов

Чтобы увеличить максимальное количество дескрипторов открытых файлов в Elasticsearch, вам просто нужно изменить один параметр.

Откройте файл /etc/default/elasticsearch для редактирования:

  1. sudo vi /etc/default/elasticsearch

Найдите MAX_OPEN_FILES, раскомментируйте его и установите желаемое ограничение. Например, если вы хотите ограничить количество дескрипторов в 128 тыс., измените его на 131070:

MAX_OPEN_FILES=131070

Сохранить и выйти.

Теперь перезапустите Elasticsearch, чтобы применить изменения:

  1. sudo service elasticsearch restart

Затем следуйте предыдущему подразделу, чтобы убедиться, что пределы были увеличены.

Обязательно повторите этот шаг на любом из ваших серверов Elasticsearch, для которых требуются более высокие ограничения файловых дескрипторов.

Настройка выделенных мастер-узлов и узлов данных (необязательно)

Существует два распространенных типа узлов Elasticsearch: главные и данные. Главные узлы выполняют действия в масштабе всего кластера, такие как управление индексами и определение того, какие узлы данных должны хранить определенные сегменты данных. Узлы данных содержат осколки ваших проиндексированных документов и обрабатывают операции CRUD, поиска и агрегирования. Как правило, узлы данных потребляют значительный объем ЦП, памяти и операций ввода-вывода.

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

Как настроить выделенные главные узлы

Прежде чем настраивать выделенные главные узлы, убедитесь, что в вашем кластере есть как минимум 3 узла, подходящих для использования в качестве главных. Это важно, чтобы избежать ситуации разделения мозгов, которая может привести к несоответствиям в ваших данных в случае сбоя сети.

Чтобы настроить выделенный главный узел, отредактируйте конфигурацию Elasticsearch узла:

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

Добавьте две следующие строки:

node.master: true 
node.data: false

Первая строка, node.master: true, указывает, что узел соответствует требованиям мастера и фактически является настройкой по умолчанию. Вторая строка, node.data: false, запрещает узлу становиться узлом данных.

Сохранить и выйти.

Теперь перезапустите узел Elasticsearch, чтобы изменения вступили в силу:

  1. sudo service elasticsearch restart

Обязательно повторите этот шаг на других выделенных мастер-нодах.

Вы можете запросить кластер, чтобы узнать, какие узлы настроены как выделенные главные узлы, с помощью этой команды: curl -XGET http://localhost:9200/_cluster/state?pretty. Любой узел с data: false и master: true является выделенным главным узлом.

Как настроить выделенные узлы данных

Чтобы настроить выделенный узел данных — узел данных, который не является ведущим, — отредактируйте конфигурацию Elasticsearch узла:

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

Добавьте две следующие строки:

node.master: false 
node.data: true

Первая строка, node.master: false, указывает, что узел не соответствует требованиям мастера. Вторая строка, node.data: true, является настройкой по умолчанию, которая позволяет узлу быть узлом данных.

Сохранить и выйти.

Теперь перезапустите узел Elasticsearch, чтобы изменения вступили в силу:

  1. sudo service elasticsearch restart

Обязательно повторите этот шаг на других выделенных узлах данных.

Вы можете запросить кластер, чтобы узнать, какие узлы настроены как выделенные узлы данных, с помощью этой команды: curl -XGET http://localhost:9200/_cluster/state?pretty. Любой узел, в котором указано master: false и не указано data: false, является выделенными узлами данных.

Настройка минимума мастер-узлов

При запуске кластера Elasticsearch важно установить минимальное количество подходящих узлов, которые должны работать для нормальной работы кластера, что иногда называют кворумом. Это необходимо для обеспечения согласованности данных в случае, если один или несколько узлов потеряют связь с остальной частью кластера, предотвращая так называемую ситуацию «расщепленного мозга».

Чтобы рассчитать минимальное количество главных узлов, которое должно быть в вашем кластере, вычислите n/2 + 1, где n — общее количество узлов, \подходящих для использования в качестве главного в вашем кластере. работоспособный кластер, затем округлить результат до ближайшего целого числа. Например, для кластера из 3 узлов кворум равен 2.

Примечание. Не забудьте включить в расчет кворума все узлы, отвечающие требованиям ведущих, включая все узлы данных, соответствующие требованиям ведущих (настройка по умолчанию).

Минимальную настройку мастер-узла можно задать динамически с помощью HTTP API Elasticsearch. Для этого запустите эту команду на любом узле (замените выделенное число на свой кворум):

  1. curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
  2. "persistent" : {
  3. "discovery.zen.minimum_master_nodes" : 2
  4. }
  5. }'
Output:
{ "acknowledged" : true, "persistent" : { "discovery" : { "zen" : { "minimum_master_nodes" : "2" } } }, "transient" : { } }

Примечание. Эта команда является «постоянной» настройкой, что означает, что минимальная настройка главных узлов сохранится при полном перезапуске кластера и переопределит файл конфигурации Elasticsearch. Кроме того, эту настройку можно указать как discovery.zen.minimum_master_nodes: 2 в /etc/elasticsearch.yml, если вы еще не установили его динамически.

Если вы хотите проверить этот параметр позже, вы можете запустить эту команду:

  1. curl -XGET localhost:9200/_cluster/settings?pretty

Как получить доступ к Elasticsearch

Вы можете получить доступ к HTTP API Elasticsearch, отправив запросы на IP-адрес VPN любого из узлов или, как показано в руководстве, отправив запросы на localhost с одного из узлов.

Ваш кластер Elasticsearch доступен для клиентских серверов через IP-адрес VPN любого из узлов, а это значит, что клиентские серверы также должны быть частью VPN.

Если у вас есть другое программное обеспечение, которое необходимо подключить к вашему кластеру, такое как Kibana или Logstash, вы обычно можете настроить подключение, предоставив своему приложению IP-адреса VPN одного или нескольких узлов Elasticsearch.

Заключение

Ваш кластер Elasticsearch должен работать в исправном состоянии и настроен с некоторыми базовыми оптимизациями!

У Elasticsearch есть много других параметров конфигурации, которые здесь не были рассмотрены, например, параметры индекса, сегмента и репликации. Рекомендуется вернуться к своей конфигурации позже вместе с официальной документацией, чтобы убедиться, что ваш кластер настроен в соответствии с вашими потребностями.