Иногда вы можете заметить, что процессор и нагрузка на некоторые узлы данных выше, чем на другие.
Иногда это может быть вызвано приложениями, которые неправильно распределяют нагрузку между узлами данных и выполняют все свои HTTP-вызовы только на одном или нескольких узлах. Вам следует исправить это в своем приложении.
Однако чаще всего это происходит из-за того, что "горячие" индексы расположены на небольшом количестве узлов. Типичным примером может быть приложение для ведения журналов, создающее ежедневные индексы с одним шардом на индекс. В этом случае, хотя у вас может быть много индексов, распределенных по всем шардам, вы можете обнаружить, что вся индексация выполняется только на одном шарде на одном узле, который содержит сегодняшний индекс журнала.
Подобное может произойти и на уровне поиска, если, например, у вас есть индекс "products", который интенсивно ищут пользователи.
Как исправить
Проверьте данные мониторинга, чтобы узнать, какие узлы затронуты, и посмотрите, какие узлы и индексы на этих узлах имеют самые высокие показатели индексации и поиска.
Балансировка нагрузки на всех узлах данных
Вы должны решить эту проблему, поставив балансировщик нагрузки перед узлами OpenSearch или включив ВСЕ узлы в клиентское приложение.
1 2 3 4 5 6 | es = opensearch( ['clientNode1', 'clientNode2','clientNode3'], http_auth=('user', 'secret'), scheme="https", port=443, ) |
В приведенном выше примере показано, как можно сбалансировать нагрузку на 3 узла (необходимо включить все узлы) при использовании python-клиента без балансировщика нагрузки. Все официальные клиенты OpenSearch используют подобные массивы в своей конструкции.
Высокая активность индексирования
Деятельность по индексированию выполняется первичными шардами, поэтому если у вас всего несколько "горячих" индексов, выполняющих всю работу по индексированию, может быть желательно увеличить количество первичных шардов, чтобы распределить эту деятельность по нескольким узлам. Количество шардов определяется при создании индекса, поэтому хорошо контролировать это с помощью шаблона индекса. Перед созданием шаблона проверьте, не существует ли уже шаблон для данного индекса:
1 | GET _cat/templates |
Шаблоны часто создаются для управления отображениями, но вы также можете управлять шардами и репликами в одном и том же шаблоне. Чтобы избежать путаницы и конфликтов между шаблонами, часто лучше создавать только один шаблон для каждого индекса. Приведенная ниже команда создаст или изменит шаблон с именем "mytemplate_name":
1 2 3 4 5 6 7 8 9 10 11 12 | PUT _index_template/mytemplate_name { "index_patterns": ["myindex*"], "template": { "settings": { "number_of_shards": 3 }, "mappings": { ... } } } |
Изменения в вашем шаблоне не вступят в силу до тех пор пока не будет создан новый индекс.
Высокая активность поиска
Если ваше приложение интенсивно работает с поиском, а не с индексами, то вы можете распределить эту активность по узлам, создав дополнительные реплики. В отличие от горячей активности индексирования, для операций поиска НЕ нужно создавать дополнительные первичные шарды. Вместо этого можно создать дополнительные реплики до количества узлов минус 1.
Изменить количество реплик существующего индекса можно с помощью:
1 2 3 4 5 6 | PUT /<my index>/_settings { "index" : { "number_of_replicas" : 3 } } |
В качестве альтернативы вы можете задать это с помощью шаблона:
1 2 3 4 5 6 7 8 9 10 11 12 13 | PUT _index_template/mytemplate_name { "index_patterns": ["myindex*"], "template": { "settings": { "number_of_shards": 1, "number_of_replicas":3 }, "mappings": { ... } } } |