предисловие
При создании индекса мы определяем базовую информацию о структуре индекса с помощью сопоставления.Далее нам обязательно нужно добавить данные бизнес-документа в ES, такие как бизнес-данные, такие как пользователи и журналы. Для недавно добавленных бизнес-данных мы генерируем соответствующие данные в соответствии с Mapping.Перевернутый индексИнформация .
Мы всегда говорили, что Elasticsearch — это поисковая система с открытым исходным кодом, основанная на Apache Lucene. Причина, по которой поиск Elasticsearch эффективен, не в том, что он сильно зависит от памяти, как в Redis, а в создании специальной структуры данных индекса —Перевернутый индексосуществленный. Из-за сценария использования: обработка структурированных или неструктурированных данных уровня PB, объем данных велик, и его необходимо сохранять, чтобы предотвратить потерю и потерю мощности, поэтому хранилище данных и индексов Elasticsearch зависит от жесткого диска сервера. Вот почему мы можем рассматривать использование хранилища на жестком диске SSD как один из элементов оптимизации при настройке производительности ES.
Я считаю, что все уже знают концепцию инвертированного индекса, поэтому я не буду повторять ее здесь.Можно сказать, что инвертированный индекс является основной причиной, по которой Elasticsearch обеспечивает эффективный поиск и поддерживает поиск неструктурированных данных, ноПосле записи инвертированного индекса на диск оннеизменный: он никогда не будет изменен.
Сегменты и точки фиксации
Неизменяемость инвертированных индексов в основном связана с тем, что нижний слой Elasticsearch основан на Lucene, а в Lucene предлагаетсяПоиск по сегментуКонцепция разделения индексного файла на несколько подфайлов, каждый подфайл называется ***сегментом***, каждый сегмент представляет собой независимый набор данных, в котором можно выполнять поиск, а сегмент является инвариантным, когда-то индексированные данные записывается на жесткий диск и не может быть изменен.
частьКонцепция в основном предлагается потому, что: в раннем полнотекстовом поиске для всей коллекции документов был создан большой инвертированный индекс, который был записан на диск. Если индекс обновляется, необходимо воссоздать полный индекс, чтобы заменить исходный индекс. Этот метод очень неэффективен, когда объем данных велик, а поскольку стоимость создания индекса очень высока, обновление данных не может быть слишком частым, а своевременность не может быть гарантирована.
Более того, на нижнем уровне принят режим сегментированного хранения, что позволяет почти полностью избежать появления блокировок при чтении и записи и значительно повышает производительность чтения и записи. Говоря об этом, вы можете подумать о концепции блокировки сегмента ConcurrentHashMap, на самом деле принцип несколько похож.
А инвертированный индекс в Elasticsearch спроектирован так, чтобы быть неизменным, что имеет следующие преимущества::
- Замок не требуется. Если вы никогда не обновляете индекс, вам не нужно беспокоиться об одновременном изменении данных несколькими процессами.
- Где остается индекс после его считывания в кеш файловой системы ядра. Из-за его неизменности, пока в кеше файловой системы достаточно места, большинство запросов на чтение будут напрямую запрашивать память, не затрагивая диск. Это дает большой прирост производительности.
- Другие кеши (например, кеши фильтров) всегда действительны в течение всего времени существования индекса. Их не нужно перестраивать каждый раз при изменении данных, потому что данные не меняются.
- Запись в один большой инвертированный индекс позволяет сжимать данные, сокращая дисковые операции ввода-вывода и использование индексов, которые необходимо кэшировать в памяти.
Каждыйчастьсам по себе является инвертированным индексом, нопоказательПомимо представления коллекции всех сегментов в Lucene, он также добавляетточка подачиКонцепция чего-либо.
Чтобы повысить производительность записи, Lucene не добавляет сегмент для каждого нового фрагмента данных, а использует стратегию отложенной записи.Всякий раз, когда появляются новые данные, они сначала записываются в память, а затем записываются на диск в партии. Если сегмент записывается на диск, создается точка фиксации,Точка фиксации — это файл, в котором перечислены все известные сегменты и записана вся информация о зафиксированных сегментах..
Процесс написания индекса
Выше было упомянуто неизменность индекса ES, а также концепции сегментов и точек фиксации. Итак, каковы его конкретные детали реализации и процесс записи на диск?
-
Пользователь создает новый документ, новый документ записывается в новый сегмент, а затем сначала добавляется в индексный кэш в памяти.
-
Время от времени кеш фиксируется, и новые сегменты кеша записываются в систему файлового кеша, а не сбрасываются непосредственно на диск. Это связано с тем, что для записи нового сегмента на диск требуется
fsync
чтобы гарантировать, что сегменты физически записываются на диск, чтобы данные не были потеряны в случае отключения электроэнергии. ноfsync
Операция очень дорогая, если ее выполнять один раз при каждой индексации документа, это вызовет большие проблемы с производительностью, но здесь новый сегмент будет записан в кэш файловой системы первым, и стоимость этого шага будет относительно низкий. -
Новый сегмент записывается в систему файлового кэша, после чего кэш памяти очищается. В системе файлового кэша будет незафиксированный сегмент. Хотя новый сегмент не фиксируется (сбрасывается на диск), файл уже находится в кэше и может быть открыт и прочитан, как и любой другой файл.
-
Сегменты, проиндексированные до сих пор, не были сброшены на диск, если они бесполезны.
fsync
Сбрасывая данные из кеша файловой системы на жесткий диск, мы не можем гарантировать, что данные будут существовать после сбоя питания или даже нормального выхода из программы. Elasticsearch добавляет транслог или журнал транзакций, в который записывается каждый раз, когда работает Elasticsearch. Как показано на рисунке выше, после индексации документа он добавляется в буфер памяти и одновременно добавляется в транслог. -
Время от времени новые документы добавляются в буфер в памяти и присоединяются к журналу транзакций (translog), после чего новые сегменты непрерывно записываются из буфера в памяти в систему файлового кэша, после чего в -буфер памяти опустеет, но журналов транзакций не будет. По мере того, как транслог становится все больше и больше, индекс очищается после определенного уровня, а после очистки сегмент полностью фиксируется, точка фиксации записывается на диск, а журнал транзакций очищается.
Из всего процесса мы можем понять следующие проблемы:
- Почему говорят, что ES Search работает почти в реальном времени?Поскольку индекс документа записывается из кеша памяти в систему файлового кеша, хотя он еще не зафиксирован и не сброшен на диск, содержимое буфера было записано в сегмент (сегмент6), и в новом сегменте можно искать . Вот почему мы говорим, что Elasticsearchпочти в реальном времениПоиск: изменения документа не отображаются сразу для поиска, но становятся видимыми в течение секунды.
- Как Elasticsearch обеспечивает сохранение обновлений без потери данных в случае отключения электроэнергии?Когда новый индексный документ записывается в кэш памяти, его копия также записывается в журнал транзакций (translog), который обеспечивает постоянную запись всех операций, которые еще не были сброшены на диск. Когда Elasticsearch запускается, он восстанавливает известные сегменты с диска, используя последнюю точку фиксации, и воспроизводит все изменения в транслоге, произошедшие с момента последней фиксации. translog также используется для предоставления CRUD в реальном времени. Когда вы пытаетесь запросить, обновить или удалить документ по идентификатору, он сначала проверит транслог на наличие последних изменений, прежде чем пытаться извлечь его из соответствующего сегмента. Это означает, что он всегда получает последнюю версию документа в режиме реального времени.
слияние сегментов
Поскольку процесс автообновления создает новый сегмент каждую секунду, это может привести к увеличению количества сегментов за короткий промежуток времени. Слишком большое количество сегментов принесет больше проблем. Каждый сегмент потребляет дескрипторы файлов, память и циклы ЦП. Более того, каждый поисковый запрос должен по очереди проверять каждый сегмент, поэтому чем больше сегментов, тем медленнее поиск.
Elasticsearch решает эту проблему, выполняя слияние сегментов в фоновом режиме. Маленькие сегменты объединяются в более крупные сегменты, которые затем объединяются в более крупные сегменты.
Когда сегменты объединяются, эти старые удаленные документы удаляются из файловой системы. Удаленные документы (или более старые версии обновленных документов) не копируются в новый фрагмент.
Как обновить индекс
Выше описан процесс сохранения индекса, и инвертированный индекс не подлежит изменению, а также преимущества такой настройки. Поскольку он неизменен, вы не можете его изменить. Но если вам нужно сделать новый документ доступным для поиска, это включает в себя обновление индекса. Индекс нельзя изменить, но его необходимо обновить. Это, казалось бы, противоречивое требование, что нам нужно сделать?
Решение ЕС:с большим количеством индексов. В чем смысл? То есть исходный индекс остается неизменным, и мы создаем индекс для нового документа. После этого, я не знаю, есть ли у вас какие-то сомнения или вы не понимаете, давайте объясним это через диаграммы.
Если у нас есть два документа информации журнала, информация выглядит следующим образом:
- Документ 1: параметр запроса name = 'zhang san' и age 20.
- Документ 2: результат ответа: code = 0000 и msg = 'success'.
На данный момент содержимое инвертированного индекса, которое мы получаем (часть опущена):
срок | Документация (док) |
---|---|
the | документ 1, документ 2 |
request | doc 1 |
param | документ 1, документ 2 |
is | документ 1, документ 2 |
name | doc 1 |
response | doc 2 |
result | doc 2 |
... | ... |
Если мы добавим документ 3 в это время: параметр запроса будет name = 'li si', а пол — женский, или изменим содержимое документа doc 2 следующим образом: результат ответа будет code = 9999 и msg = 'false'. Как ES справляется с этим сейчас?
Как упоминалось выше, чтобы сохранить неизменность индекса, ES создаст новый индекс, и информация индекса для вновь добавленного документа будет следующей:
срок | Документация (док) |
---|---|
the | doc 3 |
request | doc 3 |
param | doc 3 |
is | doc 3 |
name | doc 3 |
sex | doc 3 |
... | ... |
Информация индекса для измененного документа выглядит следующим образом;
срок | Документация (док) |
---|---|
the | doc 2 |
response | doc 2 |
result | doc 2 |
is | doc 2 |
code | doc 2 |
sex | doc 2 |
... | ... |
Добавляя новый дополнительный индекс для отражения последних изменений, а не напрямую переписывая весь инвертированный индекс. Каждый инвертированный индекс будет запрашиваться по очереди (начиная с самого старого), и результаты будут объединены после завершения запроса.
Как упоминалось выше, для измененного сценария один и тот же документ будет иметь на диске одновременно два индексных данных, один из которых является исходным индексом, а другой — модифицированным индексом.
С точки зрения обычной логики мы знаем, что поиск должен основываться на новом индексе, но сегмент неизменяем, поэтому мы не можем ни удалить документ из старого сегмента, ни изменить старый сегмент, чтобы отразить документ. Обновить. Вместо этого каждая точка фиксации будет содержать.del
файл, информация о сегментах этих удаленных документов будет указана в файле.
Когда документ "удален", это действительно просто.del
Файл помечен для удаления. Документ, помеченный для удаления, по-прежнему может быть сопоставлен запросом, но он будет удален из набора результатов до того, как будет возвращен окончательный результат.
Обновления документов работают аналогичным образом: при обновлении документа старая версия документа помечается для удаления, а новая версия документа индексируется в новый сегмент. Возможно, обе версии документа были сопоставлены запросом, но более старая версия удаленного документа была удалена до того, как был возвращен результирующий набор.
Личный общедоступный номер: JaJian
Добро пожаловать, нажмите и удерживайте изображение, чтобы подписаться на общедоступный номер: JaJian!
Регулярно предоставлять вам пояснения и анализ связанных технологий первоклассных интернет-компаний, таких как распределенные и микросервисы.