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

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

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

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

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

Требования

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

1: Установка Java

Для начала нужно установить Java Runtime Environment (JRE), поскольку платформа Elasticsearch написана на языке Java. Для этого можно использовать родной пакет системы Ubuntu. Этот пакет JRE свободный, хорошо поддерживается, и им можно управлять при помощи пакетного менеджера apt.

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

sudo apt-get update
sudo apt-get install openjdk-7-jre

Чтобы убедиться, что установка прошла успешно, запросите версию OpenJDK:

java -version

На экране появится примерно такой вывод:

Output of java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

Примечание: Продвинутые пользователи Elasticsearch, требующие более высокой производительности Java, могут установить Oracle JDK 8. Об этом можно прочесть здесь.

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

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

На момент написания руководства последней поддерживаемой версией является Elasticsearch 1.7.2. Загрузите пакет при помощи команды:

wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.deb

Установите его при помощи команды:

sudo dpkg -i elasticsearch-1.7.2.deb

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

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

sudo update-rc.d elasticsearch defaults

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

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

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

  • Файл elasticsearch.yml содержит серверные настройки Elasticsearch; здесь хранятся все параметры, за исключением настроек логирования.
  • Файл 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, чтобы раскомментировать их, а затем измените их значения. Эти значения должны выглядеть примерно так:

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

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

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

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

...
node.master: false
...

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

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

...
node.data: false
...

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

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

...
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 service elasticsearch start

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

4: Защита Elasticsearch

Elasticsearch не имеет встроенной системы защиты. Потому платформой может управлять любой пользователь с доступом к HTTP API. Это необходимо запретить. Чтобы заблокировать открытый доступ, отредактируйте elasticsearch.yml.

sudo nano /etc/elasticsearch/elasticsearch.yml

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

...
network.bind_host: localhost
...

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

Чтобы отключить пользовательские выражения, добавьте в файл /etc/elasticsearch/elasticsearch.yml следующую строку:

...
script.disable_dynamic: true
...

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

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

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

На экране появится:

Output of curl
{
"status" : 200,
"name" : "Harry Leland",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.2",
"build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
"build_timestamp" : "2015-09-14T09:49:53Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

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

6: Использование 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,"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,
"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 World!" }
}

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

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

Tags: , , ,

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