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

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


Введение

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

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

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

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

Предпосылки

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

  • Дроплет Ubuntu 14.04
  • Пользователь sudo без полномочий root. Подробности см. в разделе Первоначальная настройка сервера с Ubuntu 14.04.

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

Предположения

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

Если вы используете общую частную сеть, такую как частная сеть DigitalOcean, эта функция безопасности уже будет включена для серверов в той же команде или учетной записи в том же регионе. Это особенно важно при использовании Elasticsearch, так как в его HTTP-интерфейсе нет встроенной защиты.

Шаг 1 — Установка Java

Во-первых, вам понадобится среда выполнения Java (JRE) в вашей капле, потому что Elasticsearch написан на языке программирования Java. Для Elasticsearch требуется Java 7 или выше. Elasticsearch рекомендует Oracle JDK версии 1.8.0_73, но собственный пакет Ubuntu OpenJDK для JRE также работает.

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

Установка OpenJDK

Собственный пакет Ubuntu OpenJDK для JRE является бесплатным, хорошо поддерживается и автоматически управляется с помощью диспетчера установки Ubuntu APT.

Перед установкой OpenJDK с помощью APT обновите список доступных пакетов для установки в Ubuntu Droplet, выполнив команду:

  1. sudo apt-get update

После этого вы можете установить OpenJDK командой:

  1. sudo apt-get install openjdk-7-jre

Чтобы убедиться, что ваша JRE установлена и может использоваться, выполните команду:

  1. 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)

Установка Java 8

Когда вы продвинетесь в использовании Elasticsearch и начнете искать лучшую производительность и совместимость с Java, вы можете выбрать проприетарную Java от Oracle (Oracle JDK 8).

Добавьте Oracle Java PPA в apt:

  1. sudo add-apt-repository -y ppa:webupd8team/java

Обновите базу данных пакетов apt:

  1. sudo apt-get update

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

  1. sudo apt-get -y install oracle-java8-installer

Наконец, убедитесь, что он установлен:

  1. java -version

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

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

На момент написания этой статьи последняя версия Elasticsearch — 1.7.2. Загрузите его в каталог по вашему выбору с помощью команды:

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

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

  1. sudo dpkg -i elasticsearch-1.7.2.deb

Совет. Если вам нужна последняя выпущенная версия Elasticsearch, перейдите на сайт elastic.co, чтобы найти ссылку, а затем используйте wget, чтобы загрузить ее в свою каплю. Обязательно загрузите пакет deb.

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

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

  1. sudo update-rc.d elasticsearch defaults

Шаг 3 — Настройка эластичности

Теперь, когда 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:

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

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

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

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

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

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

...
node.master: false
...

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

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

...
node.data: false
...

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

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

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

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

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

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

  1. sudo service elasticsearch start

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

Шаг 4 — Закрепление резинки

Elasticsearch не имеет встроенной защиты и может контролироваться любым, у кого есть доступ к HTTP API. Этот раздел не является исчерпывающим руководством по обеспечению безопасности Elasticsearch. Примите все необходимые меры для предотвращения несанкционированного доступа к нему и серверу/виртуальной машине, на которой он работает. Рассмотрите возможность использования iptables для дополнительной защиты вашей системы.

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

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

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

...
network.bind_host: localhost
...

Предупреждение. Поскольку Elasticsearch не имеет встроенной системы безопасности, очень важно, чтобы вы не устанавливали для этого какой-либо IP-адрес, доступный для любых серверов, которые вы не контролируете или которым не доверяете. Не привязывайте Elasticsearch к общедоступному или совместно используемому IP-адресу частной сети!

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

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

...
[label /etc/elasticsearch/elasticsearch.yml]
script.disable_dynamic: true
...

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

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

  1. 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 работает правильно. Если нет, убедитесь, что вы правильно выполнили инструкции по установке и дали некоторое время для полного запуска Elasticsearch.

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

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

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

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

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

Output
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"created":true}

С помощью curl мы отправили HTTP-запрос POST на сервер Elasticseach. 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, "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 World!" } }

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

Заключение

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