Выделенные узлы в Elasticsearch для специального клиента? - PullRequest
2 голосов
/ 30 марта 2020

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

Типы запросов, направленных к этому кластеру, требуют значительных вычислительных ресурсов и могут занять минуты. Из-за типа данных в кластере, типов запросов, которые мы получаем, и нерегулярности, при которой они используются, мы не можем предсказать, когда эти запросы будут выполнены или выполнить какое-либо кэширование заранее. Если несколько клиентов делают запросы одновременно, они будут испытывать более медленную скорость ответа, чем обычно.

Для большинства клиентов это не проблема. Их данные недостаточно велики, чтобы заметить разницу (3 с -> 10 с иногда не имеют большого значения). Но для более крупных клиентов разница во времени может составлять минуты и очень заметна.

Что бы мы хотели, прежде всего, это последовательность, даже если в среднем эти операции выполнялись медленнее. Для этого мы бы хотели предоставить этим специальным клиентам выделенные узлы, в то время как все остальные клиенты используют общие узлы. На первый взгляд кажется, что единственный способ сделать это - создать выделенный кластер.

dedicated-clusters

Но это добавляет издержки в любом приложении, которое взаимодействует с упругим поиском, чтобы сначала выполнить поиск кластера для маршрутизации. В идеале мы могли бы создавать выделенные узлы в кластере. Таким образом, приложение не должно знать о маршрутизации кластера, и конфигурация индекса может быть разделена между этими «виртуальными кластерами».

dedicated nodes

Каждый документ имеет идентификатор клиента, который мы можем использовать для распределения по узлам, используя _routing. Но у этого есть свои проблемы. Во-первых, это не позволяет нам создавать общий c кластер по умолчанию. Во-вторых, это может означать, что выделенные узлы обмениваются данными о клиентах с другими клиентами - цель состоит в том, чтобы получить постоянные скорости, устраняя конфликт ресурсов узла. И, наконец, это не позволяет нам выделить несколько узлов для данного маршрута.

Существует ли способ создания правила маршрутизации, к которому можно явно добавлять узлы. например, я хочу добавить 3 узла к ключу маршрутизации 582123.

Можно ли создать правило маршрутизации по умолчанию для узлов, которые не соответствуют существующим маршрутам? Если нет, мы всегда можем иметь явный маршрут по умолчанию. Нам все еще нужно будет выполнить поиск приложения на маршруте, но это уменьшит сложность в мультикластерном сценарии.

1 Ответ

1 голос
/ 31 марта 2020

В зависимости от версии эластичного поиска, которую вы используете, и настройки ваших индексов, вы можете использовать распределение по индексу . По сути, вы присваиваете узлу атрибут, а затем указываете в настройках уровня индекса, где этот индекс (точнее, его сегменты) должен заканчиваться. Как вы прочтете в документации, вам нужно убедиться, что другие ограничения не нарушаются, например,

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

Это означает, что вам нужно иметь разные индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...