36 изображений объясняют принцип ElasticSearch + практические знания (рекомендуемая коллекция)

Elasticsearch
36 изображений объясняют принцип ElasticSearch + практические знания (рекомендуемая коллекция)

Всем привет я Туго

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

Схема выглядит следующим образом:

elasticsearch原理+实战.png

1 Обзор ElasticSearch

1.1 Полнотекстовая поисковая система

Друзья часто используют google или Baidu для поиска контента, введите в поле вводаключевые слова, на этот раз сайт будет содержатьключевые словаиз всех возвращенных страниц, задумывались ли вы когда-нибудь,Почему вы можете найти результаты, введя ключевое слово?

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

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

(2) Эффективность запросов низкая, и даже если в SQL сделать много оптимизаций, эффект очень мал.

(3) Как для операций вставки, так и для операций обновления индекс будет перестроен, что очень сложно поддерживать.

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

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

1.2 Что такое ElasticSearch?

image.png

Для достижения эффектов поиска на уровне миллисекунд появился ElasticSearch~

ElasticSearch(Elastic Search): это распределенный механизм поиска и анализа данных в стиле RESTful с открытым исходным кодом.Apache LuceneБиблиотека с открытым исходным кодом инкапсулирована, что не только обеспечивает полнотекстовую поисковую систему с распределенными многопользовательскими возможностями, но также может быть точно описана как:

1. Распределенное хранилище документов в реальном времени, где каждое поле может бытьпоказательипоиск;

2. Распределенныйв реальном времениАнализировать поисковые системы;

3. КомпетентныйсотниМасштабирование узла и поддержка петабайт структурированных и неструктурированных данных.

ElasticSearchОбщая структура поиска показана на следующем рисунке:

1.3 Основные понятия ElasticSearch

1.3.1 Узлы и кластеры

Elasticsearch по сути являетсяРаспределенная база данных, что позволяет нескольким серверам работать вместе, на каждом из которых работает несколько экземпляров Elasticsearch. Один экземпляр Elasticsearch называется узлом (Node), а группа узлов образует кластер (Cluster).

1.3.2 Индексы, типы, документы, поля и сопоставления

Отношения отображения следующие:

什么是 index (索引) ?

ОдинпоказательЭто набор документов с несколько схожими характеристиками. ES хранит данные в одном или нескольких индексах,показательэквивалентен одному в SQLбаза данных.

什么是 Type(类型)?

Тип — это логический раздел (категория/раздел) в индексе, но его значение полностью зависит от потребностей пользователя. Поэтому внутри индекса можно определить один или несколько типов. Как правило, типы предопределены для документов с одним и тем же полем. По аналогии с полем традиционной реляционной базы данных,типэквивалентноповерхность, в версии 7.x по умолчанию в качестве типа используется _doc.

什么是 Document(文档)?

Документы индексируются и ищутся Luceneатомная единица, который представляет собой контейнер, содержащий один или несколько доменов на основеJsonформат для представления. Документ состоит из одного или нескольких полей, каждое из которых имеет имя и одно или несколько значений.Поля с несколькими значениями часто называютмногозначный домен, в каждом документе может храниться различный набор доменов, но документы одного типа должны иметь некоторое сходство. эквивалентноmysqlв таблицеrow.

什么是 Field (字段)?

Поле эквивалентно столбцу в базе данных

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

什么是 Mapping(映射)?

Сопоставление — это процесс определения того, как документы и содержащиеся в них поля хранятся и индексируются.MappingдаESОчень важное содержание традиционных реляционных данныхtableизschema, структура данных определенного типа, определяющая индекс.

1.3.3 Шардинг и реплика

什么是 Shard (分片)?

ОдинпоказательМожет хранить большие объемы данных за пределами аппаратных ограничений одного узла. Например, индекс с 1 миллиардом документов занимает 1 ТБ дискового пространства, а ни у одного узла нет такого большого дискового пространства, или один узел обрабатывает поисковые запросы и отвечает слишком медленно.

Для решения этой проблемы,Elasticsearch 提供了将索引划分成多份的能力, это называетсяФрагментация. Когда вы создаете индекс, вы можете указать, что вы хотитеколичество осколков. Каждый осколок сам по себе является полностью функциональным и независимымпоказатель,этопоказательМожет быть размещен на любом узле кластера.

Разделение важно по двум основным причинам:

  1. Позволяет горизонтально разделить/расширить емкость контента
  2. Позволяет выполнять распределенные параллельные операции поверх сегментов (возможно, на нескольких узлах), повышая производительность/пропускную способность.
  3. То, как распространяется сегмент и как его документы объединяются обратно в поисковые запросы, полностью управляется Elasticsearch и является прозрачным для вас как пользователя.

什么是 Replica (副本)?

Реплика — это точная копия сегмента, и каждый сегмент может иметь ноль или более реплик. Роль копии:

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

2 Установка и развертывание ElasticSearch

2.1 Создание обычных пользователей

#1 创建普通用户名,密码
[root@hlink1 lyz]# useradd lyz
[root@hlink1 lyz]# passwd lyz

#2 然后 关闭xshell  重新登录 ip 地址  用 lyz 用户登录

#3 为 lyz 用户分配 sudoer 权限
[lyz@hlink1 ~]$ su
[lyz@hlink1 ~]$ vi /etc/sudoers
# 在 root  ALL=(ALL)    ALL 下面添加普通用户权限
     lyz  ALL=(ALL)    ALL

2.2 Загрузите и установите ES

# 4 下载安装包
[lyz@hlink1 ~]$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz
# 5 解压安装包
[lyz@hlink1 ~]$ tar -xzf elasticsearch-7.15.2-linux-x86_64.tar.gz

# 6 修改配置
[lyz@hlink1 ~]# cd elasticsearch-7.15.2/config
[lyz@hlink1 elasticsearch-7.15.2]# mkdir log
[lyz@hlink1 elasticsearch-7.15.2]# mkdir data
[lyz@hlink1 elasticsearch-7.15.2]# cd config
[lyz@hlink1 config]# rm -rf elasticsearch.yml
[lyz@hlink1 config]# vim elasticsearch.yml

# 粘贴如下内容

# 配置集群名称,保证每个节点的名称相同,如此就能都处于一个集群之内了
cluster.name: lyz-es
# # 每一个节点的名称,必须不一样
node.name: hlink1
path.data: /home/lyz/elasticsearch-7.15.2/log
path.logs: /home/lyz/elasticsearch-7.15.2/data
network.host: 0.0.0.0
# # http端口(使用默认即可)
http.port: 9200
# # 集群列表,你es集群的ip地址列表
discovery.seed_hosts: ["hlink1"]
# # 启动的时候使用一个master节点
cluster.initial_master_nodes: ["hlink1"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"


2.3 Изменить jvm.option

Измените файл конфигурации jvm.option, отрегулируйте размер памяти кучи jvm, каждый человек настраивает в соответствии с объемом памяти своего сервера.

# 7 修改 jvm.option 配置文件
[lyz@hlink1 config]# vim jvm.options
-Xms2g
-Xmx2g

2.4 Измените конфигурацию системы, чтобы решить проблемы с запуском

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

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

введите пользователя root

# 8 进入 root 用户
[lyz@hlink1 config]# su
Password:

# 9 在最下面添加如下内容: 注意*不要去掉了
[root@hlink1 config]# sudo vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

2.5 Ограничение на количество потоков, запускаемых обычными пользователями

Измените максимальное количество потоков, которые может создать обычный пользователь.

10 若为 Centos7,执行下面的命令
[root@hlink1 config]# sudo vim /etc/security/limits.d/20-nproc.conf

# 找到如下内容:
* soft nproc 1024#修改为
* soft nproc 4096

2.6 Обычные пользователи увеличивают виртуальную память

# 11 调大系统的虚拟内存
[root@hlink1 config]# vim /etc/sysctl.conf

vm.max_map_count=262144

# 12 执行 sysctl -p
# 行完了 sysctl -p 若输出的结果和你配置的一样,说明配置成功了.
[root@hlink1 config]# sysctl -p
vm.max_map_count = 262144

2.7 Запустить службу ES

# 13 切换用户
[root@hlink1 config]# exit
exit
[lyz@hlink1 config]$

# 直接启动 es 或者 后台启动 es
[lyz@hlink1 config]$ cd ..
[lyz@hlink1 elasticsearch-7.15.2]$ cd bin
# 直接启动
[lyz@hlink1 bin]$ ./elasticsearch 
# 后台启动 nohup ./elasticsearch 2>&1 &

# 浏览器访问 http://hlink1:9200/?pretty

3 Интерфейс ElasticSearch

3.1 RESTful

API, предоставляемый ElasticSearch, имеет форму протокола HTTP и предоставляется извне по соглашению REST в формате JSON.

Файл конфигурации HTTP находится в elasticsearch.yml. REST обычно является соглашением для разработки, и когда все разработчики следуют этому соглашению, это упрощает затраты на связь при разработке.

Соглашение REST использует заголовки HTTP-запросов POST, GET, PUT и DELETE для соответствия четырем операциям с данными CRUD (создание, чтение, обновление, удаление). Приложение можно назвать веб-службой RESTful, если оно соответствует принципам REST.

3.2 Установка программного обеспечения Postman

В этой статье Postman используется в качестве клиента Elasticsearch для подключения и использования

Postman — это мощный инструмент веб-отладки, обеспечивающий мощную отладку веб-API и HTTP-запросов. Программа мощная, интерфейс лаконичный и понятный, управление удобное и быстрое, дизайн очень удобный. Китайская версия Postman может отправлять любой тип HTTP-запроса (GET, HEAD, POST, PUT..), не только отправку формы, но и любой тип тела запроса.

Скачайте и установите прямо с официального сайта:

Почтальон скачать:www.getpostman.com/apps

Простая регистрация после установки

4 команды работы с ElasticSearch

4.1 Команды работы с информацией о кластере

4.1.1 Запрос состояния кластера

(1) Используйте клиент Postman для отправки запроса GET непосредственно на сервер ES.

http://hlink1:9200/_cat/health?v

(2) Используйте сервер для запроса

curl -XGET "hlink1:9200/_cat/health?v"

epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1638181746 10:29:06  lyz-es  yellow          1         1      2   2    0    0        1             0                  -                 66.7%

Значение основных полей возвращаемого результата:

  • кластер: имя кластера, которое является значением cluster.name, настроенным в файле конфигурации ES.
  • статус: статус кластера. Кластер имеет три состояния зеленого, желтого или красного цвета. зеленый означает, что все в порядке (кластер полностью функционален), желтый означает, что все данные доступны, но часть репликации не выделяется (кластер полностью функционален), красный означает, что некоторые данные по какой-то причине недоступны. Если он в красном состоянии, следует уделить особое внимание, и есть большая вероятность, что данные были потеряны.
  • node.total: количество узлов в кластере.
  • node.data: количество узлов данных в кластере.
  • осколки: общее количество осколков в кластере.
  • pri: количество первичных сегментов, которое на английском языке называется private.
  • relo: общее количество реплицированных осколков.
  • unassign: количество неназначенных сегментов, представляющее собой разницу между количеством сегментов, которые должны существовать, и количеством существующих сегментов (включая первичные сегменты и реплицированные сегменты).

4.1.2 Использование запроса параметров справки

(1) Запрос с помощью клиента Postman

http://hlink1:9200/_cat/health?help

Добавьте в запрос параметр справки, чтобы увидеть значение полей результатов, возвращаемых каждой операцией.

(2) Используйте сервер для запроса

curl -XGET "hlink1:9200/_cat/health?help"

# 指定返回的参数
curl -XGET "hlink1:9200/_cat/health?h=cluster,pri,relo&v"

4.1.3 Запрос информации об узле в кластере

(1) Запрос с помощью клиента Postman

http://hlink1:9200/_cat/nodes?v

(2) Используйте сервер для запроса

curl -XGET "hlink1:9200/_cat/nodes?v"

4.1.4 Запрос информации об индексе кластера

(1) Запрос с помощью клиента Postman

http://hlink1:9200/_cat/indices?v

(2) Используйте сервер для запроса

curl -XGET "hlink1:9200/_cat/indices?v"

4.2 команда индексной операции

Все следующие рабочие команды выполняются с помощью клиента Postman.Если вы хотите просмотреть подробные документы, перейдите в официальную учетную запись: [Понимание больших данных за 3 минуты и секунды], ответ: [elasticsearch] и получите более подробные документы.

4.2.1 Создать индекс

В Postman сделайте запрос PUT на сервер ES

http://hlink1:9200/study

{
 "acknowledged"【响应结果】: true, # true 操作成功
 "shards_acknowledged"【分片结果】: true, # 分片操作成功
 "index"【索引名称】: "study"
}

4.2.2 Индекс просмотра

В Postman сделать GET-запрос к ES-серверу

http://hlink1:9200/study

{
    "study": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "1",
                "provided_name": "study",
                "creation_date": "1638183519598",
                "number_of_replicas": "1", #分片数量
                "uuid": "dg7HnAAiQEeDMJ7kMtA2Qw",
                "version": {
                    "created": "7150299"
                }
            }
        }
    }
}

4.2.3 Удаление индекса

В Postman сделайте запрос DELETE на сервер ES

http://hlink1:9200/study

4.3 команда операции с документом

4.3.1 Создание документов

После создания индекса можно создать документ документа, который соответствует данным строки таблицы в базе данных. Добавленный формат данных - это содержимое JSON.

#请求体内容如下:
{
    "name": "3分钟秒懂大数据",
    "introduction": "专注于大数据技术研究"
}
# 向 ES 服务器发 POST 请求
http://hlink1:9200/study/_doc

4.3.2 Обновление документации

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

#请求体内容如下:
{
    "name": "3分钟秒懂大数据",
    "introduction": "专注于Hadoop、Kafka、Flink等多个组件的技术研究"
}
# 向 ES 服务器发 POST 请求
http://hlink1:9200/study/_doc/1

4.3.3 Запрос документов

При просмотре документа необходимо указать уникальный идентификатор документа

http://hlink1:9200/study/_doc/1

4.3.4 Удаление документов

Удаление документа не приводит к его немедленному удалению с диска, он просто помечается как удаленный (надгробие) Почтальон отправляет запрос на удаление на сервер

http://hlink1:9200/study/_doc/1

5 принципов чтения и записи ElasticSearch

5.1 Запись: операции CRUD над документами

Индексировать новые документы (Создать)

Когда пользователь отправляет提交взял один索引новый документ请求, узел вычислит, в какой шард следует добавить новый документ (shard)середина. Каждый узел имеет информацию о том, на каком узле хранится каждый осколок, поэтому协调节点Запрос будет отправлен на соответствующий узел. Обратите внимание, что этот запрос будет отправлен на主分片, дождитесь завершения основного сегментапоказатель,встреча并行отправить запрос навсе его осколки реплики, чтобы убедиться, что каждый сегмент содержит самые последние данные.

Каждый раз, когда пишется новый документ, он пишется первымОЗУ, и запишите эту операцию вtranslogфайл (журнал транзакций), если в это время выполняется операция поиска, этот новый документ еще не может быть проиндексирован.

ESлюбой другой1секунд (это время можно изменить) для выполнения операции обновления (обновления), в это время новые документы, записанные в память в течение этой 1 секунды, будут записаны в кэш файловой системы (filesystem cache), и сформировать分段(segment). В этот момент документы в этом сегменте можно искать, но尚未写入硬盘, то есть если в это время произойдет отключение электроэнергии,то эти документы могут быть утеряны.

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

каждые 30 минут или если файл транслога становится большим, то执行一次 fsync 操作. На данный момент все файлы в кеше файловой системыsegmentбудет записано на диск, а транслог будет удален (после этого будет сгенерирован новый транслог)

Из вышеописанного процесса видно, что两次 fsync 操作между, хранится вОЗУиФайловая системаДокументы в кэше небезопасны и будут потеряны в случае отключения электроэнергии.Итак, ES ввела транслог для записи всех операций между двумя fsync, чтобы, когда машина восстанавливается после сбоя или перезагружается, ES могла восстановить ее в соответствии с транслогом..

Конечно,сам транслог тоже является файлом, существует в памяти и будет потерян в случае отключения электроэнергии. следовательно,ES 会在每隔 5 秒время или после завершения запроса на записьtranslogЗаписать на диск. Можно считать, что операция над документом безопасна и может быть восстановлена ​​после записи на диск, поэтому только когда текущая запись операции записывается на диск,ESКлиенту, отправившему запрос на операцию, будет возвращен только успешный результат операции.

Кроме того, поскольку каждую секунду появляется новыйsegment, скоро будет большое количество сегментов. При запросе запроса на шарде все сегменты в шарде будут опрошены по очереди, что снизит эффективность поиска.Поэтому ES автоматически начнет работу по объединению сегментов, объединяя некоторые сегменты схожего размера в новый большой сегмент.. Процесс слияния фактически создает новый сегмент, и когда новый сегмент записывается на диск, все слитые старые сегменты очищаются.

5.2 Обновление и удаление документов

Индекс ES не может быть изменен, поэтомувозобновитьиУдалитьОперации не выполняются непосредственно с исходным индексом.

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

обновить документацию首先найти原文档, получить документ版本号. Измененный документ затем записывается в память таким же образом, как и запись нового документа. При этом старая версия документа помечается на удаление, аналогично документ можно искать, но в итоге он отфильтровывается.

Операция чтения (Read): процесс запроса

Процесс запроса можно условно разделить на查询(query)и取回(fetch)два этапа. Задача этого узла состоит в том, чтобы передать запрос запроса всем соответствующим сегментам и интегрировать их ответы в глобально отсортированный набор результатов, который возвращается клиенту.

этап запроса

Когда узел получает запрос на поиск, этот узел становится координирующим узлом.

Первый шаг广播请求к каждому узлу в индексе分片拷贝. Запросы запросов могут обрабатываться основным сегментом или сегментом реплики.Координатор будет опрашивать все копии шардов в последующих запросах на разделение нагрузки.

Каждый осколок будет строить локальный优先级队列. Если клиент запрашивает возврат результирующего набора, начиная с номера размера из порядка результатов, каждый узел должен сгенерироватьfrom+sizeразмер результирующего набора, поэтому размер приоритетной очереди такжеfrom+size. Разделение вернет координатору только упрощенный результат, содержащий идентификатор каждого документа в наборе результатов и информацию, необходимую для его сортировки.

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

стадия поиска

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

Координирующий узел определит фактический документ, который необходимо вернуть, и отправит его в шард, содержащий документ.getзапрос, шардинг получает документ и возвращает его координирующему узлу;协调节点Верните результат клиенту.

Выше приведен весь контент. Если вам это нравится, вы можете поставить лайк, добавить в избранное и подписаться на три прогулки подряд. Спасибо!