Вступление
Elasticsearch - это популярный поисковый сервер с открытым исходным кодом, который используется для распределенного поиска и анализа данных в реальном времени. При использовании для чего-либо, кроме разработки, Elasticsearch следует развертывать на нескольких серверах в виде кластера, чтобы обеспечить лучшую производительность, стабильность и масштабируемость.
Из этого туториала вы узнаете, как установить и настроить производственный кластер Elasticsearch в Ubuntu 14.04 в среде облачного сервера.
Хотя ручная настройка кластера Elasticsearch полезна для обучения, настоятельно рекомендуется использовать инструмент управления конфигурацией при любой настройке кластера. Если вы хотите использовать Ansible для развертывания кластера Elasticsearch, следуйте этому руководству: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-set-up-a-production-elasticsearch- кластер [Как использовать Ansible для настройки производственного кластера Elasticsearch].
Предпосылки
У вас должно быть как минимум три сервера Ubuntu 14.04 для завершения этого учебника, потому что в кластере Elasticsearch должно быть не менее 3 узлов, отвечающих требованиям мастера. Если вы хотите иметь выделенные главные узлы и узлы данных, вам потребуется как минимум 3 сервера для ваших главных узлов, а также дополнительные серверы для ваших узлов данных.
Если вы предпочитаете использовать CentOS вместо этого, ознакомьтесь с этим учебником: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-cluster-on-centos-7 [ Как настроить производственный кластер Elasticsearch на CentOS 7]
Предположения
В этом руководстве предполагается, что ваши серверы используют VPN, подобную описанной здесь: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- серверная инфраструктура [Как использовать Ansible и Tinc VPN для защиты вашей серверной инфраструктуры]. Это обеспечит функционирование частной сети независимо от физической сети, используемой вашими серверами.
Если вы используете общую частную сеть, вы должны использовать VPN для защиты Elasticsearch от несанкционированного доступа. Каждый сервер должен находиться в одной частной сети, поскольку Elasticsearch не имеет встроенной защиты в свой HTTP-интерфейс. Частная сеть не должна использоваться совместно с компьютерами, которым вы не доверяете.
Мы будем называть IP-адреса VPN ваших серверов + vpn_ip +
. Мы также будем предполагать, что все они имеют интерфейс VPN с именем «tun0», как описано в учебном руководстве, связанном выше.
Установите Java 8
Elasticsearch требует Java, поэтому мы установим его сейчас. Мы установим последнюю версию Oracle Java 8, потому что именно это рекомендует Elasticsearch. Однако он должен хорошо работать с OpenJDK, если вы решите пойти по этому пути.
Выполните этот шаг на всех ваших серверах Elasticsearch.
Добавьте Oracle Java PPA в apt:
sudo add-apt-repository -y ppa:webupd8team/java
Обновите базу данных пакетов apt:
sudo apt-get update
Установите последнюю стабильную версию Oracle Java 8 с помощью этой команды (и примите появившееся лицензионное соглашение):
sudo apt-get -y install oracle-java8-installer
Обязательно повторите этот шаг на всех ваших серверах Elasticsearch.
Теперь, когда Java 8 установлена, давайте установим ElasticSearch.
Установить Elasticsearch
Elasticsearch можно установить с помощью менеджера пакетов, добавив список источников пакетов Elastic. Выполните этот шаг на всех ваших серверах Elasticsearch.
Выполните следующую команду, чтобы импортировать открытый ключ GPG Elasticsearch в apt:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Если ваша подсказка просто висит там, она, вероятно, ожидает пароль вашего пользователя (для авторизации команды + sudo +
). Если это так, введите свой пароль.
Создайте список источников Elasticsearch:
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:
sudo apt-get update
Установите Elasticsearch с помощью этой команды:
sudo apt-get -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 service elasticsearch restart
Затем запустите эту команду, чтобы запустить Elasticsearch при загрузке:
sudo update-rc.d elasticsearch defaults 95 10
Обязательно повторите эти шаги [Настроить кластер Elasticsearch]) на всех ваших серверах 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 / default /asticsearch +
для редактирования:
sudo vi /etc/default/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, чтобы изменения вступили в силу:
sudo service elasticsearch restart
Обязательно повторите этот шаг на всех ваших серверах 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, вам просто нужно изменить один параметр.
Откройте файл + / etc / default /asticsearch +
для редактирования:
sudo vi /etc/default/elasticsearch
Найдите + MAX_OPEN_FILES +
, раскомментируйте его и установите желаемый предел. Например, если вы хотите ограничить 128К дескрипторов, измените его на + 131070 +
:
/ etc / default /asticsearch - MAX_OPEN_FILES
MAX_OPEN_FILES=
Сохранить и выйти.
Теперь перезапустите Elasticsearch, чтобы изменения вступили в силу:
sudo service elasticsearch restart
Затем следуйте предыдущему подразделу, чтобы убедиться, что лимиты были увеличены.
Обязательно повторите этот шаг на любом из ваших серверов 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 service elasticsearch restart
Не забудьте повторить этот шаг на других выделенных мастер-узлах.
Вы можете запросить кластер, чтобы увидеть, какие узлы сконфигурированы как выделенные главные узлы с помощью этой команды: + 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 service elasticsearch restart
Обязательно повторите этот шаг на других выделенных узлах данных.
Вы можете запросить кластер, чтобы увидеть, какие узлы сконфигурированы как выделенные узлы данных, с помощью этой команды: + 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 есть много других опций конфигурации, которые не были здесь рассмотрены, такие как параметры индекса, сегмента и репликации. Рекомендуется вернуться к конфигурации позже, вместе с официальной документацией, чтобы убедиться, что ваш кластер настроен в соответствии с вашими потребностями.