Если вы хотите, чтобы ваша система Elasticsearch работала с максимальной производительностью, необходимо периодически выполнять обслуживание индексов. К счастью, Elasticsearch предоставляет несколько полезных инструментов для решения этих задач. API Force Merge можно использовать для оптимизации индекса Elasticsearch, а API Refresh и Flush - для очистки индексов. В этой статье мы расскажем, как очищать и оптимизировать индексы Elasticsearch.
Хотя массовые запросы являются гораздо более эффективным способом индексирования документов, чем добавление их по одному, важно учитывать как количество индексируемых документов, так и их размер. Например, может показаться, что индексирование всего нескольких сотен документов не вызовет никаких проблем, но что, если средний размер этих документов составляет 1 ГБ или более? Чем больше запрос к Elasticsearch, тем меньше памяти остается для обработки других запросов. К счастью, найти "правильный" размер массового запроса, не приводящий к падению производительности, несложно - попробуйте индексировать пакеты документов, постепенно увеличивая их размер, пока не достигнете момента, когда производительность начнет снижаться.
Использование cURL для проверки работоспособности и состояния индексов кластера Elasticsearch
С помощью API _cat можно вернуть список всех индексов, а также узнать статус и состояние каждого из них:
1 2 | # получить список всех индексов: curl http://localhost:9200/_aliases?pretty |
1 2 | # получить состояние и статус каждого индекса curl -XGET 'localhost:9200/_cat/indices?v' |
Вы также можете использовать API _aliases для получения полного имени и псевдонима всех индексов на кластере Elasticsearch, как показано на скриншоте ниже:
Скриншот терминала, выполняющего cURL-запрос к кластеру Elasticsearch для получения имен, псевдонимов, статуса и состояния его индексов
Использование API Force Merge для оптимизации индекса Elasticsearch
API _optimize был переименован в _forcemerge
Одним из простых способов очистки и оптимизации индексов Elasticsearch является использование Force Merge API. Чтобы понять, как работают операции Force Merge, необходимо немного знать об архитектуре Elasticsearch, построенной на базе Lucene. Документы вставляются в индекс, который сопоставляется с одним или несколькими шардами. Каждый шард состоит из сегментов, которые можно рассматривать как мини-индексы, выполняющие поиск в определенной части коллекции данных. Force Merge позволяет поддерживать оптимальную производительность индексов Elasticsearch за счет слияния сегментов, что уменьшает количество сегментов в шарде и минимизирует избыточные данные.
Для выполнения принудительного слияния можно выполнить запрос POST cURL:
1 | curl -XPOST 'http://localhost:9200/pets/_forcemerge' |
Вы также можете выполнить принудительное слияние нескольких индексов в одном запросе: bash curl -XPOST 'localhost:9200/people1,people2/_forcemerge?pretty'
Параметры API Force Merge
Существует несколько параметров, которые можно использовать в запросе на принудительное слияние:
- max_num_segments: Этот параметр определяет максимальное количество сегментов после завершения слияния. По умолчанию используется значение "1", поэтому изменяйте его только в том случае, если вы не хотите, чтобы индексы были полностью объединены.
- only_expunge_deletes: Когда документ удаляется в Lucene, он только помечается как удаленный - на самом деле он не удаляется из сегмента. Установка этого параметра в значение "true" позволяет объединять только сегменты, содержащие удаления. По умолчанию используется значение "false".
- flush: Этот параметр представляет собой булеву опцию со значением по умолчанию true, которая будет очищать индекс после слияния.
Использование API Refresh для поддержания индексов Elasticsearch в актуальном состоянии
Для поддержания индексов в актуальном состоянии полезно также использовать API _refresh. Это заставляет явно обновлять индекс, обеспечивая доступность документов для поиска сразу после индексирования. Как и в случае с API Force Merge, обновление может быть выполнено через cURL:
1 | curl -X POST "localhost:9200/my_index/_refresh" |
Вызовы обновления выполняются Elasticsearch автоматически на регулярной основе, но использование API Refresh - это хороший способ убедиться в том, что вы получаете самую последнюю версию индекса перед его очисткой или внесением в него изменений.
Очистка индексов с помощью Flush API
Еще одним полезным API для поддержания индексов в хорошем состоянии является Flush API. С помощью API _flush можно освободить память индекса, очистив его от данных:
1 | curl -X POST "localhost:9200/some_index/_flush" |
Вот пример cURL, в котором два индекса сбрасываются с использованием опции force: bash curl -XPOST 'localhost:9200/people1,people2/_flush?force'
Тонкая настройка параметра Refresh Interval
Для определения частоты обновления индекса можно изменить параметр refresh_interval. Числовое значение представляет собой количество секунд до следующего обновления; по умолчанию эта настройка равна 1, что означает, что обновление выполняется каждую секунду:
1 2 3 4 5 | curl -XPUT 'localhost:9200/some_index/_settings' -H 'Content-Type: application/json' -d' { "index" : { "refresh_interval" : "2" } }' |
Заключение
Выполнение базового обслуживания индексов Elasticsearch требует некоторого дополнительного времени, но повышение производительности делает эти усилия оправданными. Использование Force Merge API, Refresh API и Flush API позволяет поддерживать индексы Elasticsearch в идеальном рабочем состоянии. Благодаря пошаговым инструкциям, приведенным в этой статье, вы без труда сможете очистить и оптимизировать индексы Elasticsearch с помощью этих удобных API.