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

Вступление

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

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

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

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

Предпосылки

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

  • Дроплет Ubuntu 16.04 настраивается в соответствии сInitial Server Setup with Ubuntu 16.04, включая создание пользователя sudo без полномочий root.

  • Установлен Oracle JDK 8, что можно сделать, следуя разделу «Установка Oracle JDK» вthis Java installation article

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

[[шаг-1 -—- загрузка-и-установка-elasticsearch]] == Шаг 1. Загрузка и установка Elasticsearch

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

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

sudo dpkg -i elasticsearch-2.3.1.deb

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

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

sudo systemctl enable elasticsearch.service

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

[[step-2 -—- configuring-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 будет назначен автоматически по отношению к имени хоста капли. cluster.name будет автоматически установлен как имя кластера по умолчанию.

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

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

sudo nano /etc/elasticsearch/elasticsearch.yml

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

/etc/elasticsearch/elasticsearch.yml

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

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

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

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

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

/etc/elasticsearch/elasticsearch.yml

. . .
node.master: false
. . .

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

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

/etc/elasticsearch/elasticsearch.yml

. . .
node.data: false
. . .

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

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

/etc/elasticsearch/elasticsearch.yml

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

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

/etc/elasticsearch/elasticsearch.yml

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

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

sudo systemctl start elasticsearch

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

[[step-3 -—- securing-elasticsearch]] == Шаг 3 - Обеспечение безопасности Elasticsearch

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

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

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

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

sudo ufw allow 22

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

sudo ufw allow from TRUSTED_IP to any port 9200

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

sudo ufw enable

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

sudo ufw status

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

Output of java -versionStatus: active

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

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

sudo nano /etc/elasticsearch/elasticsearch.yml

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

/etc/elasticsearch/elasticsearch.yml

. . .
network.host: 0.0.0.0
. . .

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

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

sudo systemctl restart elasticsearch

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

[[step-4 -—- testing-elasticsearch]] == Шаг 4. Тестирование Elasticsearch

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

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 выполните следующую команду:

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

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

[[step-5 -—- using-elasticsearch]] == Шаг 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!" }'

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

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

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

  • tutorial - это индекс данных в Elasticsearch.

  • helloworld - это тип.

  • 1 - это идентификатор нашей записи под указанным выше индексом и типом.

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

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.

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

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

Output{
  "_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'

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

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

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

Заключение

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

Related