Маршрутизация документов

Когда вы добавляете документ в индекс elasticsearch должен понять в какие шарды ему распределять документ.

Как Elasticsearch узнает, в какой шард должен попасть документ и как он его выбирает? Шард выбирается на основе простой формулы маршрутизации, которая обрабатывается автоматически. Схема маршрутизации по умолчанию хеширует _id документа и использует его для поиска шарда. При желании вы можете указать другое значение. Сама формула выглядит так shard_num = hash(_routing) % num_primary_shards

Маршрутизация по умолчанию обеспечивает равномерное распределение документов по всему набору шардов - у вас не будет никаких «горячих шардов».

После индексирования документа узел сообщает остальным узлам в кластере в каких шардах находится документ.

Параметр refresh_interval

Новые проиндексированные документы недоступны для поиска, пока не произойдет обновление. По умолчанию для обновления требуется до одной секунды. Это компромисс между отзывчивостью и скоростью.

Параметр refresh_interval управляет этим поведением.

PUT my_index
{
  "settings": {
    "refresh_interval": "30s"
  }
}

Анатомия поиска

Распределенный поиск - сложная задача. Вы должны искать совпадения в копии каждого шарда в индексе, и найти документы - это только половина дела! Результаты поиска должны быть объединены в единый отсортированный список документов, представляющий страницу результатов.

Т.е представим ситуацию что вы отправляете запрос о поиске всех документов со значением 200 в заголовке на node-1. Это node-1 перед тем как отдать вам ответ должна проверить каждый шард в индексе на наличие таких документах на всех узлах.

Фаза запроса (Query Phase)

Начальная часть поиска называется фазой запроса (query phase). Запрос транслируется в копию каждого шарда в индексе, и каждый шард выполняет запрос локально.

Допустиvм вы ищете в индексе с 4 шардами. Первый узел отправит запросы на все узлы, на которых находятся шарды, причем не важно первичные или реплицированные шарды.

Фаза извлечения (Fetch Phase)

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

В итоге

  • Поиск состоит из фазы запроса (query phase) и фазы выборки (fetch phase).
  • По умолчанию в формуле, которая используется для определения в какой шард положить документ используется id документа
  • Шард- это единственный экземпляр Lucene, который хранит данные.