Поиск по сайту:

Как установить и настроить Elasticsearch в Ubuntu 16.04


Введение

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

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

Elasticsearch — это бесплатное программное обеспечение с открытым исходным кодом, за которым стоит солидная компания: Elastic. Эта комбинация делает его пригодным для использования в любых целях, от личного тестирования до корпоративной интеграции.

Эта статья познакомит вас с Elasticsearch и покажет, как его установить, настроить, защитить и начать использовать.

Предпосылки

Прежде чем следовать этому руководству, вам понадобятся:

  • Капля Ubuntu 16.04, настроенная в соответствии с начальной настройкой сервера с Ubuntu 16.04, включая создание пользователя без полномочий root.
  • Установленный Oracle JDK 8, что можно сделать, следуя разделу «Установка Oracle JDK» этой статьи по установке Java.

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

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

Elasticsearch можно загрузить непосредственно с сайта elastic.co в пакетах zip, tar.gz, deb или rpm. Для Ubuntu лучше всего использовать пакет deb (Debian), который установит все необходимое для запуска Elasticsearch.

Во-первых, обновите файл index.

  1. sudo apt-get update

Загрузите последнюю версию Elasticsearch, которая на момент написания была 2.3.1.

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

Затем установите его обычным способом Ubuntu с помощью dpkg.

  1. sudo dpkg -i elasticsearch-2.3.1.deb

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

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

  1. sudo systemctl enable elasticsearch.service

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

Шаг 2 — Настройка Elasticsearch

Теперь, когда Elasticsearch и его Java-зависимости установлены, пришло время настроить Elasticsearch. Файлы конфигурации Elasticsearch находятся в каталоге /etc/elasticsearch. Есть два файла:

  • elasticsearch.yml настраивает параметры сервера Elasticsearch. Здесь хранятся все опции, кроме тех, что для логирования, поэтому нас больше всего интересует этот файл.
  • logging.yml предоставляет конфигурацию для ведения журнала. В начале вам не нужно редактировать этот файл. Вы можете оставить все параметры ведения журнала по умолчанию. Вы можете найти полученные журналы в /var/log/elasticsearch по умолчанию.

Первыми переменными, которые нужно настроить на любом сервере Elasticsearch, являются node.name и cluster.name в elasticsearch.yml. Как следует из их названий, node.name указывает имя сервера (узла) и кластера, с которым последний связан.

Если вы не настроите эти переменные, node.name будет автоматически назначено в соответствии с именем хоста Droplet. cluster.name будет автоматически установлено имя кластера по умолчанию.

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

Чтобы начать редактирование основного файла конфигурации elasticsearch.yml с помощью nano или вашего любимого текстового редактора.

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

Удалите символ # в начале строк для cluster.name и node.name, чтобы раскомментировать их, а затем обновите их значения. Ваши первые изменения конфигурации в файле /etc/elasticsearch/elasticsearch.yml должны выглядеть так:

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

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

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

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

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

. . .
node.master: false
. . .

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

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

. . .
node.data: false
. . .

В более крупных развертываниях Elasticsearch со многими узлами есть два других важных параметра: index.number_of_shards и index.number_of_replicas. Первый определяет, на сколько частей или осколков будет разбит индекс. Второй определяет количество реплик, которые будут распределены по кластеру. Наличие большего количества сегментов повышает производительность индексирования, а наличие большего количества реплик ускоряет поиск.

По умолчанию количество сегментов равно 5, а количество реплик равно 1. Если вы все еще изучаете и тестируете 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 в первый раз.

  1. 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, вы можете, по крайней мере, ограничить доступ к сети с помощью стандартного брандмауэра Ubuntu, UFW (несложный брандмауэр). По умолчанию UFW установлен, но не включен. Если вы решили использовать его, выполните следующие действия:

Сначала создайте правило, разрешающее любые необходимые службы. Вам понадобится как минимум разрешенный SSH, чтобы вы могли войти на сервер. Чтобы разрешить доступ к SSH из любой точки мира, добавьте порт 22 в белый список.

  1. sudo ufw allow 22

Затем разрешите доступ к порту Elasticsearch HTTP API по умолчанию (TCP 9200) для доверенного удаленного хоста, например TRUSTED_IP, например:

  1. sudo ufw allow from TRUSTED_IP to any port 9200

Только после этого включите UFW командой:

  1. sudo ufw enable

Наконец, проверьте состояние UFW с помощью следующей команды:

  1. sudo ufw status

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

Output of java -version
Status: active To Action From -- ------ ---- 9200 ALLOW TRUSTED_IP 22 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6)

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

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

Найдите строку, содержащую network.bind_host, раскомментируйте ее, удалив символ # в начале строки, и измените значение на 0.0.0.0 выглядит так:

. . .
network.host: 0.0.0.0
. . .

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

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

  1. sudo systemctl restart elasticsearch

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

Шаг 4 — Тестирование Elasticsearch

К настоящему времени Elasticsearch должен работать на порту 9200. Вы можете протестировать его с помощью curl, инструмента передачи URL-адресов на стороне клиента из командной строки и простого запроса GET.

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

Вы должны увидеть следующий ответ:

Output of curl
{ "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.

Для более тщательной проверки Elasticsearch выполните следующую команду:

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

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

Шаг 5 — Использование Elasticsearch

Чтобы начать использовать Elasticsearch, давайте сначала добавим некоторые данные. Как уже упоминалось, Elasticsearch использует RESTful API, который отвечает на обычные команды CRUD: создать, прочитать, обновить и удалить. Для работы с ним мы снова будем использовать curl.

Вы можете добавить свою первую запись с помощью команды:

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

Вы должны увидеть следующий ответ:

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

С помощью curl мы отправили HTTP-запрос POST на сервер Elasticsearch. URI запроса был /tutorial/helloworld/1 с несколькими параметрами:

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

Вы можете получить эту первую запись с помощью HTTP-запроса GET.

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

Результат должен выглядеть так:

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

Чтобы изменить существующую запись, вы можете использовать HTTP-запрос PUT.

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

Elasticsearch должен подтвердить успешную модификацию следующим образом:

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

В приведенном выше примере мы изменили message первой записи на \Hello People!. При этом номер версии был автоматически увеличен до 2.

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

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

Теперь ответ будет в гораздо лучшем формате:

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

До сих пор мы добавляли и запрашивали данные в Elasticsearch. Чтобы узнать о других операциях, ознакомьтесь с документацией по API.

Заключение

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