содержание
1. Что такое эластичный поиск2. Основные понятия в Elasticsearch3. Установка эластичного поиска4. Доступ к эластичному поиску
1. Что такое эластичный поиск
Elasticsearch — это распределенный механизм поиска и анализа в реальном времени, основанный на Lucene, который изначально объединяет три функции: полнотекстовый поиск, структурированный поиск и анализ.
Почему бы просто не использовать Lucene? Lucene — это просто архитектура системы полнотекстового поиска, которая предоставляет большое количество доступных API, но это не полноценная система полнотекстового поиска.При использовании Lucene вам все равно нужно написать собственный код, чтобы инкапсулировать его в полнотекстовый поисковик.
2. Основные понятия в Elasticsearch
- поле: Поле.
- Документ: документ, часть данных, выраженная в формате json. Документ содержит несколько полей, а ключом в json является поле.
- Тип: тип, группа документов, похожая на таблицу в mysql, но не совсем такая же. Тип содержит несколько документов.Документы одного и того же типа могут иметь разные поля, но лучше, чтобы они были согласованными.
- Индекс: индекс, аналогичный базе данных в mysql. Индекс содержит несколько типов. По умолчанию все поля в документе индексируются, поэтому эти поля доступны для поиска. В Elasticsearch есть концепция инвертированного индекса (Inverted Index), которая позволяет ускорить поиск с помощью индекса B+Tree в mysql.Мы подробно расскажем об инвертированном индексе в следующей статье.
- осколок: осколок. Данные в индексе можно разделить на несколько сегментов, а затем сохранить на нескольких серверах, чтобы увеличить объем данных, которые может хранить индекс, ускорить возможности поиска и повысить производительность системы.
- реплика : Реплика. Данные, хранящиеся в реплике и сегменте, одинаковы, и реплика действует как резервная копия. В случае сбоя сегмента данные могут быть считаны из реплики, чтобы гарантировать, что система не пострадает.
- Узел: Узел, один экземпляр Elasticsearch. Имена узлов по умолчанию назначаются случайным образом.
- Кластер: кластер, группа экземпляров Elasticsearch. Имя кластера по умолчанию — elasticsearch.
3. Установка эластичного поиска
Обязательное условие: jdk8 успешно установлен в системе
Скачать и разархивировать:
cd /usr/local
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.tar.gz
tar -zxvf elasticsearch-6.6.0.tar.gz -C .
Просмотрите распакованный каталог:
[root@153-215 local]# cd elasticsearch-6.6.0
[root@153-215 elasticsearch-6.6.0]# ls
bin config lib LICENSE.txt logs modules NOTICE.txt plugins README.textile
Запустите эластичный поиск:
[root@153-215 elasticsearch-6.6.0]# bin/elasticsearch
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000d4cc0000, 724828160, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 724828160 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid16393.log
Затем проверьте сценарий запуска Elasticsearch, чтобы узнать, есть ли требования к размеру памяти при запуске:
[root@153-215 elasticsearch-6.6.0]# vim bin/elasticsearch
#!/bin/bash
# CONTROLLING STARTUP:
#
# This script relies on a few environment variables to determine startup
# behavior, those variables are:
#
# ES_PATH_CONF -- Path to config directory
# ES_JAVA_OPTS -- External Java Opts on top of the defaults set
#
# Optionally, exact memory values can be set using the `ES_JAVA_OPTS`. Note that
# the Xms and Xmx lines in the JVM options file must be commented out. Example
# values are "512m", and "10g".
#
# ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch
source "`dirname "$0"`"/elasticsearch-env
ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options
JVM_OPTIONS=`"$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JvmOptionsParser "$ES_JVM_OPTIONS"`
ES_JAVA_OPTS="${JVM_OPTIONS//\$\{ES_TMPDIR\}/$ES_TMPDIR} $ES_JAVA_OPTS"
......
Я обнаружил, что когда Elasticsearch запускается, он читает файл jvm.options, поэтому я посмотрел на файл:
[root@153-215 elasticsearch-6.6.0]# ls config
elasticsearch.yml jvm.options log4j2.properties role_mapping.yml roles.yml users users_roles
[root@153-215 elasticsearch-6.6.0]# cat config/jvm.options
## JVM configuration
################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms1g
-Xmx1g
......
Измените максимальную и минимальную доступную память jvm следующим образом:
-Xms256m
-Xmx256m
Запустите Elasticsearch снова:
[root@153-215 elasticsearch-6.6.0]# bin/elasticsearch
[2019-02-13T16:42:53,177][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.6.0.jar:6.6.0]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.6.0.jar:6.6.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.6.0.jar:6.6.0]
... 6 more
Это сообщение об ошибке означает, что Elasticsearch не может быть запущен как пользователь root.Это требование также связано с соображениями безопасности системы, поэтому здесь я сначала изменю владельца каталога Elasticsearch и файлов в каталоге на другого пользователя, а затем Начать с другой пользователь:
[root@153-215 elasticsearch-6.6.0]# cd ..
[root@153-215 local]# chown -R lilinru:lilinru elasticsearch-6.6.0
[root@153-215 local]# su lilinru
[lilinru@153-215 local]$ cd elasticsearch-6.6.0
[lilinru@153-215 elasticsearch-6.6.0]$ bin/elasticsearch
....
[2019-02-13T17:10:23,443][INFO ][o.e.n.Node ] [_xV7bTf] starting ...
[2019-02-13T17:10:23,618][INFO ][o.e.t.TransportService ] [_xV7bTf] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}
[2019-02-13T17:10:23,636][WARN ][o.e.b.BootstrapChecks ] [_xV7bTf] max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2019-02-13T17:10:23,636][WARN ][o.e.b.BootstrapChecks ] [_xV7bTf] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
....
Обнаружил две проблемы с запуском:
Вопрос один:max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
.
Чтобы исправить это, мы можем отредактировать/etc/security/limits.conf
нижняя часть файлаsoft nofile
иhard nofile
Конфигурация 65536:
[root@153-215 elasticsearch-6.6.0]# vim /etc/security/limits.conf
...
# End of file
...
* soft nofile 65536
* hard nofile 65536
...
Вопрос второй:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
.
Чтобы исправить это, мы можем отредактировать/etc/sysctl.conf
файл, добавьте следующую конфигурацию в конец файла:
vm.max_map_count=262144
Обратите внимание, что после добавления этой конфигурации вам также необходимо выполнитьsysctl -p
перезагрузите файл конфигурации sysctl.conf.
После решения двух вышеуказанных проблем снова перезапустите Elasticsearch и обнаружите, что две вышеупомянутые проблемы исчезли, и запуск прошел успешно ~
4. Доступ к эластичному поиску
Откройте другое окно и запросите Elasticsearch:
[root@153-215 ~]# curl localhost:9200
{
"name" : "_xV7bTf",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "i3whIPX_Qx2zvaJVZKQY1g",
"version" : {
"number" : "6.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "a9861f4",
"build_date" : "2019-01-24T11:27:09.439740Z",
"build_snapshot" : false,
"lucene_version" : "7.6.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Как видите, Elasticsearch возвращает объект json, который содержит имя текущего узла, имя кластера, uuid кластера, информацию о версии и слоган.
Сначала здесь написано основное понимание Elasticsearch, а затем мы шаг за шагом узнаем больше об Elasticsearch и используем Elasticsearch.