2017-02-20 4 views
1

Наши ES довольно медленные, мы не оптимизировали его (и запрос), но, согласно this link, запрос отклонения от Elastic - это форма обратной связи, которая просит замедлить и адаптировать размер основной массы.Elastic дает непоследовательные результаты при стрессе

Мы построили форму противодавления, где размер блокирующего массива (список отдельных запросов, отправленных одновременно, мы еще не используем MSearch) зависит от того, сколько запросов было отклонено в предыдущей части. Мы ожидаем завершения текущего объема, прежде чем начинать новый. Очевидно, что все отклоненные запросы повторно вводятся в очередь запросов (в виде данных, необходимых для построения запроса). Например, если наш Elastic может обрабатывать 500 одновременных запросов, и мы отправляем 600, некоторые из них будут отклонены, а новый размер будет уменьшен до 480 (20% скидка).

Мы обнаружили, что ES возвращает разные результаты по ранее отклоненным запросам. Например, он может вернуть что-то вроде ожидаемого результата, но со смещением 2. У нас также отсутствуют пропущенные результаты, когда адрес должен иметь 1 результат, но из-за этой ошибки нет ни одного.

Если объемный размер меньше порога, который может обрабатывать ES, все идет так, как ожидалось, и мы получаем ожидаемые результаты.

Это не похоже на проблему с библиотекой (elastic4s).

Упругая конфигурация: 2 узлов с 5 осколками каждого

на узле: 2 процессора, 32 Гб ОЗУ, 16 Гб кучи. Все остальное по умолчанию

Я не мог найти информацию в Интернете, у кого-нибудь была эта проблема? Каково было решение?

То, что мы пытались до сих пор:

  • Thread.sleep между громадами как ссылка выше предлагает.

  • Извлечение кеша на уровне запросов, а также удаление его из индекса.

  • Пытается использовать тот же индекс на другом (более медленном) оборудовании.

  • Проверено, что проблема не в гонке (в нашем коде).

Update:

Что the query нравится.

бассейн Темы для поиска: "search" : { "type" : "fixed", "min" : 4, "max" : 4, "queue_size" : 1000 },

второго UPDATE:

Мы также попытались установить предпочтение нашего запрос (думая, что это была проблема с осколками): .preference(Preference.Primary) без какого-либо положительного результата (они были даже более случайным, чем раньше). Два последовательных прогона с этим параметром дают разные «случайные» результаты, поэтому это не согласовано.

ответ

0

Причина несогласованных результатов состояла в том, что Elastic отвечает Success, если результат был получен как минимум у 1 осколка.Таким образом, в основном, если только один из наших 5 осколков преуспел, запрос вернет успешный результат только с 20% данных.

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

Решение этой проблемы либо использовать только один осколок или для лечения более 0 не удалось осколками в качестве общего сбоя запроса, используя следующий объект, что каждый ES ответ имеет:

"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },

Смежные вопросы