Принцип работы ЭС, лежащий в основе чтения и письма, достаточно прочесть эту статью!

Архитектура Elasticsearch
Принцип работы ЭС, лежащий в основе чтения и письма, достаточно прочесть эту статью!

предисловие

Это как черный ящик, если вы не понимаете его внутренней работы, что еще вы можете сделать? Единственное, что вы можете сделать, это использовать 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, поисковая система ищет инвертированный индекс и считывает из него документы, содержащие слово, и эти документы являются результатами поиска, предоставленными пользователю.

Следует обратить внимание на две важные детали об инвертированных индексах:

  • Все термины в инвертированном индексе соответствуют одному или нескольким документам;
  • термины в инвертированном индексеСортировать в возрастающем лексикографическом порядке

Вышеупомянутое просто каштан, не строго лексикографически восходящий.