Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Поиск данных

Маршрутизация запросов поиска по фрагментам

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

Адаптивная выборка реплик

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

  • Время отклика предыдущих запросов между узлом координатора и подходящим узлом
  • Время, затраченное подходящим узлом на выполнение предыдущих поисков
  • Размер очереди потоковой обработки search пула потоков подходящего узла

Адаптивная выборка реплик разработана для уменьшения задержки поиска. Однако вы можете отключить адаптивную выборку реплик, установив cluster.routing.use_adaptive_replica_selection в значение false с помощью API настроек кластера. При отключении Elasticsearch маршрутизирует запросы поиска с помощью метода круговой очереди, что может привести к замедлению поиска.

Указание предпочтений

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

Для ограничения набора узлов и фрагментов, подходящих для запроса поиска, используйте параметр запроса API поиска preference.

Например, следующий запрос выполняет поиск my-index-000001 с preference значением _local. Это ограничивает поиск фрагментами на локальном узле. Если локальный узел не содержит копий фрагментов данных индекса, запрос использует адаптивную выборку реплик на другом подходящем узле в качестве резервного варианта.

GET /my-index-000001/_search?preference=_local
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

Также вы можете использовать параметр preference для маршрутизации поисков на определённые фрагменты на основе предоставленной строки. Если состояние кластера и выбранные фрагменты не изменяются, запросы с использованием той же строки preference маршрутизируются на те же фрагменты в том же порядке.

Рекомендуется использовать уникальную строку preference, например, имя пользователя или идентификатор сеанса веб-браузера. Эта строка не может начинаться с _.

Вы можете использовать этот параметр для предоставления кэшированных результатов для часто используемых и ресурсоёмких поисков. Если данные фрагмента не меняются, повторяющиеся запросы с той же строкой preference извлекают результаты из того же кэша запросов фрагментов. В случаях с временными рядами, таких как логирование, данные в старых индексах редко обновляются и могут быть получены непосредственно из этого кэша.

Следующий запрос выполняет поиск my-index-000001 со строкой preference значением my-custom-shard-string.

GET /my-index-000001/_search?preference=my-custom-shard-string
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

Если у узла есть осознанность распределения фрагментов, то он будет отдавать предпочтение фрагментам с одинаковыми значениями атрибутов осознанности. Из-за этих атрибутов разные узлы координатора могут по-разному маршрутизировать один и тот же запрос, даже если запросы используют одинаковые пользовательские значения preference. Для отключения маршрутизации на основе атрибутов осознанности установите системную переменную es.search.ignore_awareness_attributes в значение true в параметрах JVM каждого узла в кластере.

Если состояние кластера или выбранные фрагменты изменяются, одна и та же строка preference может не маршрутизировать запросы к тем же фрагментам в том же порядке. Это может произойти по ряду причин, включая перемещения фрагментов и сбои фрагментов. Узел также может отклонить запрос поиска, который Elasticsearch перенаправит на другой узел.

Использование значения маршрутизации

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

Например, следующий запрос индексирования направляет документ, используя my-routing-value.

POST /my-index-000001/_doc?routing=my-routing-value
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "kimchy"
  }
}

Вы можете использовать то же значение маршрутизации в параметре запроса API поиска routing. Это гарантирует, что поиск выполняется на том же фрагменте, что и при индексировании документа.

GET /my-index-000001/_search?routing=my-routing-value
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

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

GET /my-index-000001/_search?routing=my-routing-value,my-routing-value-2
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

Конкурентность и параллельность поиска

По умолчанию Elasticsearch не отклоняет запросы поиска на основе количества фрагментов, к которым обращается запрос. Однако обращение к большому количеству фрагментов может значительно увеличить использование ЦП и оперативной памяти.

Советы по предотвращению индексов с большим количеством фрагментов см. в разделе Избегайте перефрагментирования.

Вы можете использовать параметр max_concurrent_shard_requests для управления максимальным количеством одновременных фрагментов, которые может обработать запрос поиска на узел. Это предотвращает перегрузку кластера одним запросом. Значение по умолчанию равно максимальному количеству 5.

GET /my-index-000001/_search?max_concurrent_shard_requests=3
{
  "query": {
    "match": {
      "user.id": "kimchy"
    }
  }
}

Вы также можете использовать настройку кластера action.search.shard_count.limit для установки лимита поиска по фрагментам и отклонения запросов, которые обращаются к слишком большому количеству фрагментов. Вы можете настроить action.search.shard_count.limit с помощью API настроек кластера.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-shard-routing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API