TL; DR
Я наконец решил проблему, просто уменьшив количество осколков.
Полное раскрытие
При использовании инструментов разработки на кибане я мог найтимного ошибок в конечной точке _msearch
:
{
"shard": 2,
"index": "20180909_logs",
"node": "FCv8yvbyRhC9EPGLcT_k2w",
"reason": {
"type": "es_rejected_execution_exception",
"reason": "rejected execution of org.elasticsearch.transport.TransportService$7@754fe283 on EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@16a14433[Running, pool size = 7, active threads = 7, queued tasks = 1000, completed tasks = 16646]]"
}
},
Что в основном доказывает, что я загружаю свой сервер ES слишком большим количеством параллельных запросов на слишком много шардов.
Из того, что я мог понятьпо-видимому, для kibana нормально выполнять запросы по каждому индексу моего шаблона индекса, если некоторые из них не содержат каких-либо свежих данных (предполагается, что ES все равно запрашивает их, и приходят к выводу, что они почти не содержат данныхнет времени, так как поле метки времени проиндексировано)
Оттуда у меня было несколько вариантов:
- 1: уменьшить срок хранения данных
- 2: уменьшить числопараллельных запросов, которые я выполняю
- 3: добавить узлы в мой кластер
- 4: реструктурировать мои данные, чтобы использовать меньшее количество шардов
- 5: увеличить размер очереди поиска
1 и 2в моем случае это не вариант.
5, вероятно, будет работать, но, по-видимому, настоятельно рекомендуется против (насколько я понимаю, в большинстве случаев эта ошибка является лишь признаком более глубоких проблем, которые следует исправитьвместо этого)
Это одноузловой кластер объемом 160 ГБ, имеющий (сейчас) более 350 сегментов.Это приводит к чрезвычайно низкому среднему размеру для каждого шарда, поэтому я решил сначала попробовать номер 4. Переиндексировать мои данные, чтобы использовать меньшее количество шардов.
Как я его делю
Использовать один шард на индекс:
Я создал следующий шаблон индекса:
PUT _template/logs {
"template": "*_logs",
"settings": {
"number_of_shards": 1
}
}
Теперь все мои будущие индексы будут иметь один осколок.
Мне все еще нужно переиндексировать или объединить существующие индексы, но это должно быть сделано со следующей точкой в любом случае.
Переключение на месячные индексы (вместо ежедневных)
Я изменил код, который вставляет данные в ES, чтобы использовать основанный на месяце индексname (например, 201901_monthly_logs
, а затем переиндексирует каждый старый индекс к соответствующему в новом шаблоне:
POST _reindex
{
"source": {
"index": "20181024_logs"
},
"dest": {
"index": "201810_monthly_logs"
}
}
Наслаждайтесь!
Выполнив это, я сократился до 7 индексов(и еще 7 осколков). Все, что осталось, - это изменить шаблон индекса с _logs
на _monthly_logs
в моих визуализациях кибаны.
У меня не было никаких проблем с этого времени, я будупросто подожди еще немного, затем удали мои старые индексы.