При использовании elasticsearch для сбора и анализа логов возникает вопрос оптимизации для одного сервера. Т.к. elasticsearch
расчитан для использования в кластере, то большинство настроек “по умолчанию” выставлены так, что один сервер работает не эффективно. В этой заметке я разберу несколько примеров оптимизации elasticsearch
для работы на одном сервере.
Shards
Первое что нужно знать, что каждый шард использует пямять и процессор. При использовании elasticsearch
и logstash
получается, что каждый день logstash
создает новый indice
, а дефолтные настройки elasticsearch
создают 5 шардов в каждом индексе. В итоге с каждым днем кол-во шардов увеличивается вместе с утилизацие памяти и процессора.
Первое что стоит сделать это изменить глобальные настройки elasticsearch
так, чтобы кол-во шардов было оптимальное. Если не планируется кластер, то и создавать большое кол-во шардов не имеет смысла. За эту настройку отвечает директива index.number_of_shards
. Добавив ее в конфиг можно установить кол-во создаваемых шардов для всех новых индексов. Как мне кажется, при использовании только одного сервера elasticsearch
, логично установить этот параметр равным 1.
Replics
Реплики - еще один инструмент кластера elasticsearch
, который взаимодействует с шардами. Кол-во реплик указывают сколько “копий” шардов должно храниться на других нодах кластера, что в случае использования одной ноды не актуально. За эту настройку отвечает директива index.number_of_replicas
. Если сервер один, то и реплицировать некуда, устанавить этот параметр в 0 - логичное решение.
Однако что делать, если сервер уже работает какое-то время с дефолтными настройками? Можно заметить, что API elasticsearch
возвращает следующее:
$ curl -XGET http://localhost:9200/_cat/shards
logstash-2016.05.09 1 p STARTED 1520055 985.3mb 127.0.0.1 logstash1
logstash-2016.05.09 1 r UNASSIGNED
logstash-2016.05.09 3 p STARTED 1520640 985.9mb 127.0.0.1 logstash1
logstash-2016.05.09 3 r UNASSIGNED
logstash-2016.05.09 4 p STARTED 1520955 981.4mb 127.0.0.1 logstash1
logstash-2016.05.09 4 r UNASSIGNED
logstash-2016.05.09 2 p STARTED 1520377 966mb 127.0.0.1 logstash1
где UNASSIGNED
- это шарды-реплики, которые ожидают репликации.
Исправить это можно следующим обращением к api:
curl -XPUT "localhost:9200/logstash-2016.05.09/_settings" -d '{
"index" : {
"number_of_replicas" : 0
}
}'
если количество индексов с шардами, ожидающими репликации большое, то можно воспользоваться следующим однострочником:
$ for ind in `curl -XGET http://localhost:9200/_cat/shards | grep UNASSIGNED | awk '{print $1}' | uniq`; do curl -XPUT "localhost:9200/$ind/_settings" -d '{ "index" : { "number_of_replicas" : 0 } }'; done