Блог Галс Софтвэр

Координирующая нода (Coordinating Node) Elasticsearch: когда она нужна

Elastic Stack
Координирующая нода Elasticsearch/OpenSearch — это нода, которая обрабатывает HTTP(S) запросы индексации/поиска к кластеру. При этом любая нода в кластере может обрабатывать такие запросы и будет являться координирующей для конкретного запроса, если к ней обратился клиент.
Выделенной координирующей нодой является нода, которая не имеет никаких других ролей. Если в кластере предусмотрены такие ноды, клиенты настраиваются таким образом, чтобы все запросы на индексирование и запросы на поиск или и те и другие направлялись исключительно на эти ноды. Задача такой схемы — изолировать дата-ноды и мастер-ноды от аппаратных потребностей на координацию запросов.

Процесс выполнения поисковых запросов

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

Процесс индексирования запросов

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

Затраты на добавление координирующих нод

Каждая нода любого типа, входящая в кластер Elasticsearch, должна хранить актуальную копию состояния кластера. Мастер-нода отправляет каждое изменение состояния кластера каждой из этих нод и ждет подтверждения. Таким образом, добавление любой ноды представляет собой потенциальное увеличение задержки при применении любого изменения. Более очевидные затраты связаны с выделением дополнительных физических ресурсов для нового экземпляра Elasticsearch после предварительного сайзинга (количество процессоров, объем heap, пропускная способность сети).

Когда следует использовать выделенные координирующие ноды

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

Однако, не существует конкретных критериев, определяющих, когда использовать координирующие ноды, сколько их нужно и какими аппаратными характеристиками размера они должны обладать. Из нашей практики, внедрение координирующих нод обычно оправдывает себя, когда кластер достигает размера от 10 до 20 нод данных, а иногда и меньше. Наверное, лучшее понимание необходимости наличия координирующих нод даст утилита Rally.

Как использовать выделенные координационные ноды

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

Пример конфигурации координирующей ноды:
node.roles: [ ]

Что дальше

Подробно работу координирующих нод мы рассматриваем на наших семинарах-инструктажах по Elastic Stack и по OpenSearch.
Если вас интересует консалтинг по ElastiSearch/OpenSearch, оставьте заявку в форме обратной связи на этой странице.