Во время индексирования OpenSearch с высоким временем индексирования накапливает документы в памяти, а затем записывает их на диск, чтобы создать новый сегмент lucene. Создание большого количества сегментов неэффективно, поэтому существует отдельный процесс слияния, который объединяет небольшие сегменты, созданные во время индексирования, в более крупные сегменты.
Однако этот процесс отнимает много ресурсов, особенно дисковых ресурсов ввода-вывода. Когда OpenSearch обнаруживает, что процесс слияния не поспевает за скоростью индексирования, он начинает дросселировать индексирование, о чем свидетельствует высокое значение времени индексирования (index throttle time).
В этом случае операции индексирования, скорее всего, будут поставлены в очередь, и в конечном итоге запросы на индексирование будут отклонены. В лучшем случае данные не будут полностью обновлены, а в худшем - могут быть потеряны, если приложение не сможет повторно выполнить дросселированные запросы на запись.
Повторное выполнение запросов с ограничением скорости также может создавать дополнительную нагрузку на процессоры, расположенные выше по потоку, поскольку им приходится держать данные в очереди (если это возможно) и использовать ресурсы для повторного выполнения запросов.
Как решить проблему
Когда происходит дросселирование индекса, вы должны попытаться оптимизировать индексирование, используя некоторые из следующих действий:
Уменьшите частоту обновления индекса:
1 2 3 4 5 6 | PUT /my-index-000001/_settings { "index" : { "refresh_interval" : "30s" } } |
Отключите репликацию индексов:
1 2 3 4 5 6 | PUT /my-index-000001/_settings { "index" : { "number_of_replicas" : 0 } } |
Используйте массовое индексирование (_bulk) вместо индивидуального
Модернизируйте вращающиеся диски до SSD или NVMe.
Оптимизируйте сопоставления, чтобы сократить количество ненужных полей
Также обратите внимание, что стандартные отображения для строк создают как поля ключевых слов, так и текстовые поля, что является расточительством, если вам не нужно ни то, ни другое.
Примечания и полезные советы
Если вы видите, что дросселирование индекса происходит только на некоторых узлах, а не на всех узлах данных, это может быть связано с недостаточным количеством первичных шардов в индексе, чтобы распределить активность индексирования по всем узлам. Это может произойти, если у вас, например, один "занятый" индекс с одним шардом, что приведет к тому, что вся активность индексирования будет сосредоточена на узле, на котором находится шард для этого индекса. В этом случае решением будет увеличение количества шардов в настройках индекса и создание или перенос индекса.
Дополнительные рекомендации по улучшению индексации можно найти в полном списке рекомендаций здесь.