Как настроить кластер Elasticsearch в Ubuntu 14.04

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

Если вы хотите использовать Ansible для развертывания кластера Elasticsearch, то воспользуйтесь этим  руководством.

Подготовка

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

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

Вступление

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

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

Если вы используете частную сеть, например DigitalOcean, вы должны использовать VPN для защиты Elasticsearch от несанкционированного доступа.

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

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

Мы будем называть VPN IP-адреса для всех серверов, как vpn_ip.

Мы также будем считать, что все они имеют интерфейс VPN, который называетсяtun0“.

Устанавливаем Java 8

Elasticsearch требует Java, поэтому мы установим его  сейчас. Мы установим последнюю версию Oracle Java 8, потому что это  рекомендует Elasticsearch. Выполните этот шаг на всех серверах Elasticsearch.
Сначала добавьте репозиторий Oracle Java:

$ sudo add-apt-repository -y ppa:webupd8team/java

Обновите свой список пакетов:

$ sudo apt-get update

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

$ sudo apt-get -y install oracle-java8-installer

Обязательно повторите этот шаг на всех серверах Elasticsearch. Теперь, когда Java 8 установлен, давайте установим ElasticSearch.

Установка ElasticSearch

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

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

Если процесс остановился, то возможно системы ждет пароль пользователя. Просто введите его  нажмите enter.

Создайте список источников для 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

Обновите список пакетов:

$ sudo apt-get update

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

$ sudo apt-get -y install elasticsearch

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

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

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

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

$ sudo vi /etc/elasticsearch/elasticsearch.yml

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

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

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

elasticsearch.yml — network.host

network.host: [_tun0_, _local_]

Обратите внимание на добавление “__local__”, что говорит Elasticsearch также слушать на всех петлевых устройствах. Это позволит вам использовать API Elasticsearch HTTP локально, с каждого сервера, посылая запросы к локальной машине.

Задайте имя кластеру

Далее, установите имя кластера, которое позволит узлам Elasticsearch соединится и образовать кластер. Вы должны использовать описательное имя, которое является уникальным(хотя бы в пределах сети).

Найдите строку, которая начинается с cluster.name, раскомментируйте ее и замените значение на нужное имя кластера. В этом мануле имя нашего кластера – “production“.

elasticsearch.yml — cluster.name

cluster.name: production

Задайте имя узла

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

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

elasticsearch.yml — node.name

node.name: ${HOSTNAME}

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

Установите открытые хосты

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

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

К примеру, если у вас есть три сервера node01, node02 и node03 с соответствующими VPN IP-адресами 10.0.0.1, 10.0.0.2, 10.0.0.3, то у вас должно получиться примерно так:

elasticsearch.yml — hosts by IP address

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

С другой стороны, если все серверы сконфигурированы на основе имени их VPN IP-адресов (через DNS или /etc/hosts), вы можете использовать такую строку:

elasticsearch.yml — hosts by name

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

Сохраните и выйдите

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

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

Запуск Elasticsearch

Теперь запускаем Elasticsearch

$ sudo service elasticsearch restart

Далее Elasticsearch нуждается в настройке автозапуска:

$ sudo update-rc.d elasticsearch defaults 95 10

Обязательно повторите эти шаги (Настройка 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  работает! :)

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

Включение блокировки памяти

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

Изменение конфигурации Elasticsearch:

$ sudo vi /etc/elasticsearch/elasticsearch.yml

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

elasticsearch.yml — bootstrap.mlockall

bootstrap.mlockall: true

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

Далее откройте /etc/default/elasticsearch:

$ sudo vi /etc/default/elasticsearch

Во-первых, найдите ES_HEAP_SIZE, раскомментируйте и установите его на 50% вашей доступной памяти. Например, если у вас есть около 4 Гб свободного места, вы должны установить до 2 Гб (2 г):

/etc/default/elasticsearch — ES_HEAP_SIZE

ES_HEAP_SIZE=2g

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

/etc/default/elasticsearch — MAX_LOCKED_MEMORY

MAX_LOCKED_MEMORY=unlimited

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

$ sudo service elasticsearch restart

Проверка статуса Mlockall

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

$ curl http://localhost:9200/_nodes/process?pretty

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

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
}

Общей причиной Elasticsearch того, что  mlockall не запускается является то, что ES_HEAP_SIZE установлен слишком высоко.

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

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

$ ps -u elasticsearch

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

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

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

$ cat /proc/11708/limits | grep ‘Max open files’

Output
Max open files 65535 65535 files

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

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

Откройте /etc/default/elasticsearch:

$ sudo vi /etc/default/elasticsearch

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

/etc/default/elasticsearch — MAX_OPEN_FILES

MAX_OPEN_FILES=131070

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

$ sudo service elasticsearch restart

Инструкции по настройке выделенных Master узлов

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

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

$ sudo vi /etc/elasticsearch/elasticsearch.yml

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

elasticsearch.yml — dedicated master

node.master: true
node.data: false

Первая строка – node.master, как бы говорит: правда, узел является  master-eligible и это на самом деле,  значение по умолчанию.

Вторая строка, node.data: ложь, ограничивает узел стать узлом данных.

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

$ sudo service elasticsearch restart

Инструкции по настройке выделенных узлов данных

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

$ sudo vi /etc/elasticsearch/elasticsearch.yml

И добавить всего 2 строки:

elasticsearch.yml — dedicated data

node.master: false
node.data: true

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

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

$ sudo service elasticsearch restart

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

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

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

curl -XPUT localhost:9200/_cluster/settings?pretty -d ‘{
“persistent” : {
“discovery.zen.minimum_master_nodes” : 2
}
}’

Output:
{
“acknowledged” : true,
“persistent” : {
“discovery” : {
“zen” : {
“minimum_master_nodes” : “2”
}
}
},
“transient” : { }
}

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

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

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

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

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