предисловие
Это как черный ящик, если вы не понимаете его внутренней работы, что еще вы можете сделать? Единственное, что вы можете сделать, это использовать es API для выполнения самых простых операций чтения и записи данных. Если что-то пойдет не так, и вы ничего не знаете, что вы можете ожидать от вас?
Поэтому для более глубокого понимания внутренней структуры ЭС и решения проблем, возникающих во время использования, особенно важно знать лежащий в основе принцип работы ЭС, а затем я расскажу, каков лежащий в основе принцип работы.
процесс записи данных
- Клиент выбирает узел для отправки запроса, этот узел
coordinating node
(координаторный узел). -
coordinating node
на документемаршрутизация, перенаправьте запрос на соответствующий узел (с основным сегментом). - на самом узле
primary shard
Обработайте запрос, затем синхронизируйте данные сreplica node
. -
coordinating node
если найденоprimary node
и всеreplica node
После того, как все сделано, результат ответа возвращается клиенту.
es процесс чтения данных
в состоянии пройтиdoc id
поинтересоваться, согласноdoc id
Выполните хэш и рассудите, что времяdoc id
Какой сегмент выделен и запрос из этого сегмента.
- Клиент отправляет запрос налюбойузел, который становится
coordinate node
. -
coordinate node
правильноdoc id
Выполнить хэш-роутинг и перенаправить запрос на соответствующий узел, который будет использоваться в это время.round-robin
алгоритм случайного опроса,существуетprimary shard
И случайным образом выберите одну из всех своих реплик, чтобы сбалансировать нагрузку запросов на чтение. - Узел, получивший запрос, возвращает документ
coordinate node
. -
coordinate node
Вернуть документ клиенту.
es процесс поиска данных
Самое мощное в es — это полнотекстовый поиск, то есть, например, у вас есть три куска данных:
java真好玩儿啊
java好难学啊
j2ee特别牛
вы согласноjava
ключевые слова для поиска, будут содержатьjava
изdocument
выискивать. es ответит вам: java — это весело, java сложно выучить.
- Клиент отправляет запрос на
coordinate node
. - Координирующий узел перенаправляет поисковый запрос навсеосколок, соответствующий
primary shard
илиreplica shard
, Все будет хорошо. - этап запроса: каждый сегмент будет отправлять свои собственные результаты поиска (фактически некоторые
doc id
) возвращается узлу-координатору, а узел-координатор выполняет слияние данных, сортировку, разбиение по страницам и другие операции для получения окончательного результата. - фаза выборки: затем координирующий узел в соответствии с
doc id
к каждому узлувытащить фактическийизdocument
Данные, наконец, возвращаются клиенту.
Запросы на запись записываются в основной сегмент, а затем синхронизируются со всеми сегментами реплики; запросы на чтение могут быть прочитаны из основного сегмента или сегмента реплики с использованием алгоритма случайного опроса.
Основной принцип записи данных
Сначала запишите в буфер памяти, поиск данных в буфере невозможен, в то же время данные записываются в лог-файл транслога.
Если буфер почти заполнен или по прошествии определенного времени, данные буфера памяти будутrefresh
к новомуsegment file
, но данные не вводятся напрямую в это времяsegment file
файл на диске, но сначала введитеos cache
. Этот процессrefresh
.
Каждую 1 секунду es записывает данные из буфера вновый segment file
, который производит один в секундуновый файл на диске segment file
,этоsegment file
Данные, записанные в буфер за последнюю 1 секунду, сохраняются в буфере.
Но если в это время в буфере нет данных, конечно, операция обновления не будет выполнена, если данные в буфере есть, то по умолчанию операция обновления будет выполняться раз в секунду, и будет создан новый файл сегмента. быть смытым.
В операционной системе файлы на диске на самом деле имеют то, что называетсяos cache
, то есть кэш операционной системы, то есть до того, как данные будут записаны в файл на диске, он попадет вos cache
, сначала введите кэш памяти на уровне операционной системы. если толькоbuffer
Данные сбрасываются операцией обновленияos cache
, эти данные можно найти.
почему es называетсяПочти в реальном временииз?NRT
, полное имяnear real-time
. По умолчанию обновление выполняется каждую секунду, поэтому es работает в режиме квази-реального времени, потому что записанные данные можно увидеть только через 1 секунду. доступно через esrestful api
илиjava api
,руководствоВыполнение операции обновления заключается в том, чтобы вручную сбросить данные из буфера вos cache
, чтобы данные можно было искать немедленно. пока данные вводятсяos cache
, буфер будет очищен, потому что буфер не нужно сохранять, а данные были сохранены на диск в транслоге.
Повторите вышеуказанные шаги, новые данные будут продолжать поступать в буфер и транслогироваться, и будут продолжатьbuffer
данные записываются один за другим с новымsegment file
идти, каждый разrefresh
После опустошения буфера транслог сохраняется. По мере продвижения этого процесса транслог будет становиться все больше и больше. Когда транслог достигнет определенной длины, он будет запущенcommit
работать.
Первым шагом в операции фиксации является преобразование существующих данных в буфереrefresh
прибытьos cache
Перейти к очистке буфера. Затем положитеcommit point
Запишите на диск файл, который идентифицирует этоcommit point
соответствующий всемsegment file
, при этом заставляяos cache
Все текущие данные вfsync
в файл на диске. НаконецпустойДля существующего файла журнала транслога перезапустите транслог, и на этом операция фиксации будет завершена.
Эта операция фиксации называетсяflush
. Автоматически выполняться каждые 30 минут по умолчаниюflush
, но также срабатывает, если транслог слишком великflush
. Операция сброса соответствует всему процессу коммита, мы можем вручную выполнить операцию сброса через es api и вручную синхронизировать данные в кеше ОС на диск.
Какова цель файла журнала транслога? Перед выполнением операции фиксации данные остаются либо в буфере, либо в кеше ОС. И буфер, и кеш ОС являются памятью. После выхода из строя машины все данные в памяти будут потеряны. Поэтому вам нужно записать операции, соответствующие данным, в специальный лог-файл.translog
, как только машина выключится и снова перезагрузится, es автоматически прочитает данные в файле журнала транслога и восстановит их в буфере памяти и кэше ОС.
Транслог сначала записывается в кеш ОС.По умолчанию он сбрасывается на диск каждые 5 секунд, поэтому по умолчанию может быть 5 секунд данных, которые останутся только в кеше ОС буфера или файла транслога. Если машина зависнет, будетпотерял5 секунд данных. Но эта производительность лучше, потеря данных до 5 секунд. Вы также можете установить транслог так, чтобы каждая операция записи была прямойfsync
на диск, но производительность будет намного хуже.
-
index.translog.sync_interval
Управляйте длительностью транслога fsync на диск, минимум 100 мс; -
index.translog.durability
Независимо от того, обновляется ли транслог каждые 5 секунд или fsync каждый запрос, этот параметр имеет 2 значения: запрос (fsync выполняется для каждого запроса, es будет ждать транслога fsync на диск перед возвратом успеха) и асинхронный (значение по умолчанию), транслог fsync каждые 5 секунд. секунды).
Таким образом, что касается потери данных, поиск данных возможен после записи в течение 1 секунды; если данные могут быть потеряны, есть 5 секунд данных, которые остаются в буфере, кэше транслога ОС, кэше файла сегмента ОС, а не на диск. Время простоя вызовет 5 секундданные потеряны.
в заключении, данные сначала записываются в буфер памяти, а затем каждые 1 с, данные обновляются в кэш ОС, и данные могут быть найдены в кэше ОС (поэтому мы говорим, что es можно искать от записи до поиска, в середине есть задержка 1с). Каждые 5 с данные записываются в файл транслога (так что, если машина не работает, данные памяти полностью теряются, и данные будут потеряны на срок до 5 с).Данные в области сбрасываются в файл сегмента файл диска.
После записи данных в файл сегмента одновременно устанавливается инвертированный индекс.
Основной принцип удаления/обновления данных
Если это операция удаления, фиксация создаст.del
файл, который идентифицирует документ какdeleted
статус, то при поиске по.del
Файл знает, был ли документ удален.
В случае операции обновления исходный документ идентифицируется какdeleted
состояние, а затем записать новый фрагмент данных.
Каждый раз, когда буфер обновляется, он генерируетsegment file
, поэтому по умолчанию 1 секундаsegment file
, так внизsegment file
Их будет все больше и больше, и слияние в это время будет выполняться регулярно. Каждый раз, когда вы объединяете, несколькоsegment file
слились в одно, и здесь будут обозначаться какdeleted
документ даетфизически удален, затем вставьте новыйsegment file
Напишите на диск, здесь будет записаноcommit point
, выявление всех новыхsegment file
, затем откройтеsegment file
для использования в поиске при удалении старыхsegment file
.
нижняя люцена
Проще говоря, lucene — это пакет jar, который содержит различные упакованные коды алгоритмов для построения инвертированных индексов. Когда мы разрабатываем на Java, мы можем ввести lucene jar и разрабатывать его на основе lucene API.
С помощью lucene мы можем индексировать существующие данные, и lucene предоставит нам структуру данных для организации индекса на локальном диске.
Перевернутый индекс
В поисковой системе каждый документ имеет соответствующий идентификатор документа, а содержимое документа представлено в виде набора ключевых слов. Например, документ 1 был токенизирован для извлечения 20 ключевых слов, и каждое ключевое слово будет записывать номер и место его появления в документе.
Тогда инвертированный индексключевые слова для документаСопоставление идентификаторов, каждое ключевое слово соответствует серии файлов, и ключевые слова появляются в этих файлах.
Возьмите каштан.
Имеются следующие документы:
После токенизации документа получаем следующееПеревернутый индекс.
Кроме того, практичный инвертированный индекс может также записывать больше информации, например информацию о частоте документов, указывающую, сколько документов в коллекции документов содержат определенное слово.
Тогда с инвертированным индексом поисковая система сможет легко ответить на запрос пользователя. например, пользователь вводит запросFacebook
, поисковая система ищет инвертированный индекс и считывает из него документы, содержащие слово, и эти документы являются результатами поиска, предоставленными пользователю.
Следует обратить внимание на две важные детали об инвертированных индексах:
- Все термины в инвертированном индексе соответствуют одному или нескольким документам;
- термины в инвертированном индексеСортировать в возрастающем лексикографическом порядке
Вышеупомянутое просто каштан, не строго лексикографически восходящий.