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

Вступление

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

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

Хотя ручная настройка кластера Elasticsearch полезна для обучения, настоятельно рекомендуется использовать инструмент управления конфигурацией при любой настройке кластера. Если вы хотите использовать Ansible для развертывания кластера Elasticsearch, следуйте этому руководству: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-set-up-a-production-elasticsearch- кластер [Как использовать Ansible для настройки производственного кластера Elasticsearch].

Предпосылки

У вас должно быть как минимум три сервера CentOS 7, чтобы завершить это учебное пособие, поскольку кластер Elasticsearch должен иметь как минимум 3 подходящих для мастера узла. Если вы хотите иметь выделенные главные узлы и узлы данных, вам потребуется как минимум 3 сервера для ваших главных узлов, а также дополнительные серверы для ваших узлов данных.

Если вы предпочитаете использовать вместо этого Ubuntu, ознакомьтесь с этим руководством: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-cluster-on-ubuntu-14- 04 [Как настроить производственный кластер Elasticsearch в Ubuntu 14.04]

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

В этом руководстве предполагается, что ваши серверы используют VPN, подобную описанной здесь: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- серверная инфраструктура [Как использовать Ansible и Tinc VPN для защиты вашей серверной инфраструктуры]. Это обеспечит функционирование частной сети независимо от физической сети, используемой вашими серверами.

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

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

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

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

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

Перейдите в свой домашний каталог и загрузите JDK RPM Oracle Java 8 (обновление 73, самое позднее на момент написания этой статьи) с помощью следующих команд:

cd ~
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"

Затем установите RPM с помощью этой команды yum (если вы скачали другую версию, замените имя файла здесь):

sudo yum -y localinstall jdk-8u73-linux-x64.rpm

Теперь Java должна быть установлена ​​в + / usr / java / jdk1.8.0_73 / jre / bin / java + и связана с + / usr / bin / java +.

Вы можете удалить архивный файл, который вы скачали ранее:

rm ~/jdk-8u73-linux-x64.rpm

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

Установить Elasticsearch

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

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

sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

Создайте новый файл репозитория yum для Elasticsearch. Обратите внимание, что это одна команда:

echo '[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
' | sudo tee /etc/yum.repos.d/elasticsearch.repo

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

sudo yum -y install elasticsearch

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

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

Настроить кластер Elasticsearch

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

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

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» на всех наших серверах, мы можем настроить все наши серверы с помощью одной линии:

asticsearch.yml - network.host

network.host: [__, _local_]

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

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

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

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

asticsearch.yml - имя кластера.

cluster.name:

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

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

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

asticsearch.yml - имя узла

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 + `, вы можете использовать эту строку:

asticsearch.yml - хосты по IP-адресу

discovery.zen.ping.unicast.hosts: ["", "", ""]

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

asticsearch.yml - хосты по имени

discovery.zen.ping.unicast.hosts: ["", "", ""]

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

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

Сохраните и выйдите из +asticsearch.yml +.

Запустите Elasticsearch

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

sudo systemctl start elasticsearch

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

sudo systemctl enable elasticsearch

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

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

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

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

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

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

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:

sudo vi /etc/elasticsearch/elasticsearch.yml

Найдите строку, которая определяет + bootstrap.mlockall + и раскомментируйте ее:

asticsearch.yml - bootstrap.mlockall

bootstrap.mlockall: true

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

Затем откройте файл + / etc / sysconfig /asticsearch + для редактирования:

sudo vi /etc/sysconfig/elasticsearch

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

/ etc / default /asticsearch - ES_HEAP_SIZE

ES_HEAP_SIZE=

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

/ etc / default /asticsearch - MAX_LOCKED_MEMORY

MAX_LOCKED_MEMORY=unlimited

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

Последний файл для редактирования - это системный файл Elasticsearch systemd. Откройте его для редактирования:

sudo vi /usr/lib/systemd/system/elasticsearch.service

Найдите и раскомментируйте + LimitMEMLOCK = infinity +. Это должно выглядеть так, когда вы закончите:

/usr/lib/systemd/system/elasticsearch.service - LimitMEMLOCK

LimitMEMLOCK=infinity

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

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

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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

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

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

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 + является ложным для любого из ваших узлов, просмотрите настройки узла и перезапустите Elasticsearch. Общая причина сбоя Elasticsearch в том, что + ES_HEAP_SIZE + установлен слишком высоко.

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

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

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

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

ps -u elasticsearch

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

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

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

cat /proc//limits | grep 'Max open files'
OutputMax open files            65535                65535                files

Числа во втором и третьем столбцах обозначают мягкие и жесткие ограничения, соответственно, как 64 КБ (65535). Это нормально для многих настроек, но вы можете увеличить эту настройку.

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

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

Откройте файл + / usr / lib / systemd / system /asticsearch.service + для редактирования:

sudo vi /usr/lib/systemd/system/elasticsearch.service

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

/usr/lib/systemd/system/elasticsearch.service - LimitNOFILE

LimitNOFILE=

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

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

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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

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

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

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

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

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

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

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

sudo vi /etc/elasticsearch/elasticsearch.yml

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

asticsearch.yml - посвященный мастер

node.master: true
node.data: false

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

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

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

sudo systemctl restart elasticsearch

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

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

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

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

sudo vi /etc/elasticsearch/elasticsearch.yml

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

asticsearch.yml - выделенные данные

node.master: false
node.data: true

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

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

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

sudo systemctl restart elasticsearch

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

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

Настройте минимальные мастер-узлы

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Related