Рекомендации при работе с elasticsearch
Распределение памяти для elasticsearch
При распределении памяти, необходимо выделить память для самого контейнера elasticsearch memlimit, в зависимости от количества выделенной памяти для контейнера, нужно добавить переменную окружения ES_JAVA_OPTS, память, выделенная через данную переменную, будет использована для системного кэша.
Важно: память, которая выдается через ES_JAVA_OPTS, не должна превышать 50% доступной ОЗУ, выделенной на контейнер, потому что вся оставшаяся память будет выделена для Apache Lucene.
Подробнее можно прочитать здесь.
В зависимости от потребностей, можно выделить менее 50% памяти, вся оставшаяся память будет выделена для Apache Lucene, что может улучшить производительность. Данная практика советуется, если не производятся операции, связанные с агрегированием строк (fielddata).
Подробнее можно прочитать здесь.
Для лучшей работы heap size для elasticsearch не должен превышать 30GB, так как при использовании меньшей памяти, используются сжатые указатели.
Дополнительно можно ознакомиться здесь.
В идеале использовать не больше 4GB heap sizing, так как будут использованы 32-битные указатели.
Выделяемая память для elasticsearch должна быть как можно меньше, не рекомендуется выделять много памяти, так как это может привести к более долгим паузам
сборщика мусора .При выделении малого количества памяти сборщик мусора не будет освобождать ресурсы в достаточном количестве, что приведет к
переполнению памяти . Также при выполнении запросов, если сервер ноды кластета elasticsearch достигает состояния, при котором происходит нехватка ресурсов, сервер может перестать отвечать, во избежание полного отключения.
Мониторинг сборщика мусора
Нормальное состояние работы сборщика мусора заключается в частых и периодических срабатываниях освобождения ресурсов в достаточном количестве. Используемая память при работе elasticsearch варьируется от 30% до 70% от общей доступной памяти, выделенной на JAVA процесс ноды, находящейся в кластере elasticsearch, при нормальном состоянии.
Нагрузка на память не должна превышать в стабильном состоянии 75%. При высокой потребности нагрузка не должна превышать 85%.
При нагрузке выше чем 85% стоит провести мониторинг работы сервера elasticsearch, так как это может привести к дальнейшим проблемам.
Возможные решения можно просмотреть здесь.
Заметка: чтобы проверить нагрузку на ноды, можно сделать следующий запрос
GET {host}/_cat/nodes?v&h=name,node*,heap*
где host - это хост ноды elasticsearch.
Настройка репликации
При работе состояние кластера должно иметь статус Green, это означает, что для каждого основного шарда, количество созданных репликационных шардов соответствует настройке количества репликационных шардов для всех индексов. В ином случае статус будет желтый или красный.
Количество создаваемых реплик не должно быть больше или равно количеству нод в кластере elasticsearch, так как репликационный шард не может создаваться на той же ноде, на которой присутствует основной шард. Подробнее можно прочитать здесь или здесь.
Настройку количества репликационных шардов можно проверить в настройках индекса по пути:
index.number_of_replicas
Шардирование (Sharding)
Количество шардов на каждой ноде может быть неограниченным, но для лучшей производительности, на 1GB памяти JVM, иметь не более
20 шардов .Также рекомендуется иметь шарды размером от 20GB до 40GB. Иметь шарды меньшего размера не оптимально.
Также стоит настроить ILM для решения проблемы с большим количеством шардов.