Установка и настройка Elasticsearch в Ubuntu 16.04

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

Elasticsearch поддерживает операции REST, что позволяет применять методы HTTP (GET, POST, PUT, DELETE и т.д.) в сочетании с HTTP URI (/collection/entry). Интуитивный подход REST дружественный и к пользователю, и к разработчику.

Elasticsearch является свободным и открытым программным обеспечением известной компании Elastic. Потому Elasticsearch отлично подходит для использования в самых различных условиях (от личного тестирования до внедрения на уровне корпорации).

Данная статья поможет установить, настроить и запустить Elasticsearch на сервере Ubuntu 16.04.

Требования

Для выполнения руководства понадобится:

  1. Предварительно настроенный сервер Ubuntu 16.04.
  2. Не-root пользователь с доступом к sudo.
  3. Oracle JDK 8 (инструкции по установке можно найти в соответствующем разделе этого руководства).

1: Загрузка и установка Elasticsearch

Elasticsearch можно загрузить с сайта проекта в формате zip, tar.gz, deb и rpm. В системе Ubuntu лучше использовать родной пакет deb, который установит всё необходимое для корректной работы Elasticsearch.

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

sudo apt-get update

Загрузите пакет Elasticsearch 2.3.1 при помощи команды:

wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb

Установите этот пакет:

sudo dpkg -i elasticsearch-2.3.1.deb

После этого пакет Elasticsearch будет установлен в каталог /usr/share/elasticsearch, конфигурационные файлы будут помещены в /etc/elasticsearch, а скрипты – в etc/init.d/elasticsearch.

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

sudo systemctl enable elasticsearch.service

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

2: Настройка Elasticsearch

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

Конфигурационные файлы Elasticsearch находятся в каталоге /etc/elasticsearch:

  1. Файл elasticsearch.yml содержит серверные настройки Elasticsearch; здесь хранятся все параметры, за исключением настроек логирования.
  2. Файл logging.yml предназначен специально для логирования. Сначала не нужно его редактировать, лучше оставить стандартные настройки логирования. По умолчанию логи хранятся в /var/log/elasticsearch.

Для начала в файле elasticsearch.yml нужно отредактировать переменные node.name и cluster.name. Переменная node.name задаёт имя сервера (ноды), а cluster.name – имя кластера, к которому относится сервер.

По умолчанию node.name содержит имя хоста, а cluster.name – имя стандартного кластера.

Значение cluster.name используется функцией автоматического обнаружения и подключения нодов Elasticsearch в кластер. Таким образом, значение по умолчанию допускает в кластер нежелательные ноды, найденные в этой сети.

Откройте elasticsearch.yml в текстовом редакторе:

sudo nano /etc/elasticsearch/elasticsearch.yml

Удалите символ решетки (#) перед переменными node.name и cluster.name, чтобы раскомментировать их, а затем измените их значения. Эти значения должны выглядеть примерно так:

. . .
cluster.name: mycluster1
node.name: "My First Node"
. . .

Также важным параметром является роль сервера, master или slave. Серверы master отвечают работу кластера. При развертывании объёмных кластеров рекомендуется настроить несколько серверов master. Как правило, серверы master не хранят данных и не создают индексы; их нельзя перегружать, иначе работа кластера может оказаться под угрозой.

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

За роль сервера отвечает параметр node.master. По умолчанию каждая нода имеет роль master. Если у вас только одна нода Elasticsearch, оставьте эту опцию закомментированной со стандартным значением true (хотя бы одна нода должна иметь роль master). Чтобы настроить ноду slave, удалите символ # в начале строки node.master и измените значение на false:

. . .
node.master: false
. . .

Следующая важная опция – node.data, которая определяет, будет ли данная нода хранить данные. В большинстве случаев рекомендуется оставить стандартное значение true, но бывают и ситуации, когда не следует хранить данные на ноде. Во-первых, если сервер используется как master; во-вторых, если нода используется только для извлечения данных и группирования результатов (в этом случае нода будет работать как балансировщик).

Если у вас только один узел Elasticsearch, оставьте опцию закомментированной со стандартным значением true. В противном случае можно отключить хранение данных локально, раскомментировать следующую строку и изменить значение на false:

. . .
node.data: false
. . .

В кластерах Elasticsearch с большим количеством нод рекомендуется настроить две другие важные опции – index.number_of_shards и index.number_of_replicas. Первая отвечает за количество шардов (shards) в индексе. Вторая опция определяет количество реплик, распространяемых по кластеру. Большое количество шардов повышает производительность индексирования, большое количество реплик делает поиск быстрее.

Количество шардов по умолчанию – 5, количество реплик – 1.Предположим, что у вас одна нода Elasticsearch; в таком случае лучше настроить один шард и 0 реплик. Таким образом, их значения будут выглядеть так (не забудьте удалить # в начале строки):

. . .
index.number_of_shards: 1
index.number_of_replicas: 0
. . .

Последняя настройка – path.data, которая указывает путь к хранилищу данных. Стандартный путь – /var/lib/elasticsearch. В среде производства рекомендуется использовать выделенный раздел диска и точку монтирования для хранения данных Elasticsearch. В лучшем случае выделенный раздел диска должен быть отдельным носителем, что обеспечивает лучшую производительность и изоляцию данных. Укажите другой путь path.data, раскомментировав опцию и изменив её значение:

. . .
path.data: /media/different_media
. . .

Внеся все изменения в настройки, сохраните и закройте файл. Теперь можно впервые запустить Elasticsearch:

sudo systemctl start elasticsearch

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

3: Защита Elasticsearch

Elasticsearch не имеет встроенной системы защиты. Потому платформой может управлять любой пользователь с доступом к HTTP API. Однако, это небольшой риск для безопасности, поскольку Elasticsearch слушает только кольцевой интерфейс (т.е. 127.0.0.1), доступный только локально. Таким образом, публичный доступ к программе не возможен; Elasticsearch в безопасности, если к серверу имеют доступ только проверенные пользователи или если платформа Elasticsearch установлена на выделенный сервер.

Однако, чтобы повысить защиту, нужно включить аутентификацию. Для этого используется плагин Shield. К сожалению, этот плагин платный, однако он предоставляет 30 дней бесплатной работы. На официальной странице плагина можно найти отличные инструкции по установке и настройке. Обратите внимание: путь к менеджеру установки плагина Elasticsearch – /usr/share/elasticsearch/bin/plugin.

Если вы не хотите использовать платный плагин, но вам нужно разрешить удаленный доступ к HTTP API, вы можете ограничить доступ при помощи UFW, стандартного брандмауэра Ubuntu. По умолчанию UFW установлен, но не включен.

Чтобы настроить брандмауэр, выполните следующее:

Создайте правило, разрешающее доступ ко всем нужным сервисам; как минимум, это сервис SSH. Чтобы разрешить общий доступ к SSH, введите:

sudo ufw allow 22

Откройте доступ к стандартному порту Elasticsearch HTTP API (TCP 9200)для доверенных удалённых хостов (вместо TRUSTED_IP укажите IP-адрес).

sudo ufw allow from TRUSTED_IP to any port 9200

После этого можно включить UFW:

sudo ufw enable

Проверьте состояние UFW:

sudo ufw status

Если правила добавлены правильно, команда вернёт:

Status: active
To                         Action      From
--                         ------      ----
9200                       ALLOW       TRUSTED_IP
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)

Убедившись, что UFW защищает порт 9200, который использует Elasticsearch, можно разрешить Elasticsearch прослушивать внешние соединения. Для этого откройте elasticsearch.yml:

sudo nano /etc/elasticsearch/elasticsearch.yml

Найдите строку network.bind_host, раскомментируйте её и измените её значение на 0.0.0.0:

. . .
network.host: 0.0.0.0
. . .

Теперь Elasticsearch прослушивает все интерфейсы и IP. Чтобы платформа Elasticsearch прослушивала только определённый IP-адрес, укажите его вместо 0.0.0.0.

Чтобы обновить настройки, перезапустите Elasticsearch:

sudo systemctl restart elasticsearch

Теперь попробуйте подключиться к Elasticsearch. Если подключение не устанавливается, убедитесь, что UFW работает и что директива network.host установлена правильно.

4: Тестирование

На данный момент Elasticsearch работает на порте 9200. Убедитесь в этом при помощи curl, инструмента командной строки, преобразовывающего URL-адреса

curl -X GET 'http://localhost:9200'

Команда вернёт:

{
"name" : "My First Node",
"cluster_name" : "mycluster1",
"version" : {
"number" : "2.3.1",
"build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
"build_timestamp" : "2016-04-04T12:25:05Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}

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

Можно выполнить более тщательную проверку Elasticsearch. Для этого введите:

curl -XGET 'http://localhost:9200/_nodes?pretty'

В выводе приведенной выше команды вы можете увидеть и проверить все текущие настройки для ноды, кластера, путей приложений, модулей и т.д.

5: Использование Elasticsearch

Чтобы начать работу с Elasticsearch, попробуйте добавить какие-нибудь данные. как уже говорилось, Elasticsearch использует RESTful API, отвечающий за простые операции CRUD (Create, Read, Update, Delete).

Используйте curl, чтобы добавить первую запись:

curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'

Команда вернёт:

{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}

Инструмент curl отправил HTTP POST-запрос серверу Elasticseach. URI запроса – /tutorial/helloworld/1. Рассмотрим параметры подробнее:

  • tutorial – индекс данных Elasticsearch.
  • helloworld – это тип данных.
  • 1 – порядковый номер записи с таким индексом и типом.

Чтобы извлечь эту запись, создайте HTTP GET-запрос:

curl -X GET 'http://localhost:9200/tutorial/helloworld/1'

Результат выглядит так:

{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}

Чтобы отредактировать запись, создайте HTTP PUT-запрос:

curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
{
"message": "Hello People!"
}'

Elasticsearch сообщит об удачном изменении данных:

{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}

В приведённом выше примере сообщение (message) было изменено на Hello People!. При этом номер записи был изменен на 2.

Возможно, вы обратили внимание на аргумент pretty в предыдущем запросе. Он включает удобочитаемый формат, благодаря чему можно вносить каждое поле данных с новой строки. Также можно улучшить внешний вид извлечённых данных и получить более понятный вывод:

curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'

Результат:

{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source" : {
"message" : "Hello People!"
}
}

Чтобы ознакомиться с другими операциями Elasticsearch, читайте эту документацию.

Как видите, производительная платформа Elasticsearch довольно проста в установке и использовании.

Tags: , , ,

Добавить комментарий