Это самые важные методы Elasticsearch, которые я использовал для повышения пропускной способности записи для повседневной работы.

Используйте Bulk API

Массовый API позволяет выполнять несколько операций с индексами за один вызов API. Количество документов, которые вы индексируете в большом количестве, зависит от размера или простоты ваших документов JSON. 100 - хорошее число для начала и настройки оттуда.

Установите index.translog.durability на Async

Когда документ индексируется в Elasticsearch, он сначала записывается в файл журнала упреждающей записи, называемый translog. Когда журнал трансляций сбрасывается (по умолчанию сбрасывается после каждого индекса, удаления, обновления или массового запроса, либо когда транслог становится определенного размера, либо после определенного интервала времени) Elasticsearch затем сохраняет данные на диск во время фиксации Lucene, дорогая операция. Установив для него значение async, вы говорите Elasticsearch не выполнять фиксацию после каждого запроса. Это значительно повышает производительность записи.

Компромисс заключается в том, что в случае аппаратного сбоя вы можете потерять данные, которые еще не были зафиксированы (до 5 секунд или 512 МБ данных по умолчанию, вы можете уменьшить index.translog.interval или index.translog.flush_threshold_size соответственно).

P.S. Я обнаружил это поздно ночью, когда работал над увеличением пропускной способности записи, потому что наш потребитель Kafka отставал после неожиданного увеличения нагрузки. После того, как я изменил index.translog.durability, я не мог не оставаться и смотреть, как падает лаг.

Увеличьте index.refresh_interval

Изменения, внесенные в индекс, недоступны, пока Elasticsearch не выполнит операцию обновления, еще одну дорогостоящую операцию. По умолчанию это происходит с интервалом в 1 с, но даже увеличение его до 5 с может иметь огромное значение. 30 лет и старше, и вы, вероятно, начнете видеть убывающую отдачу.

Используйте Nginx в качестве прокси для постоянных подключений и балансировки нагрузки

Установив Nginx перед вашими клиентскими узлами Elasticsearch, вы можете заставить Nginx поддерживать постоянные соединения, а не забивать Elasticsearch и заставлять его справляться со стрессом, возникающим при открытии и закрытии соединения для каждого запроса. А с Nginx вы можете балансировать нагрузку между несколькими клиентскими узлами.

Разделение узлов данных, главного и клиентского узлов

Узлы Elasticsearch могут иметь любые 3 из следующих ролей:

  • Мастер: управляет кластером (на каких узлах должен храниться этот осколок и т. Д.)
  • Данные: хранит данные и выполняет операции, связанные с данными, такие как CRUD, поиск и агрегирование.
  • Клиент: перенаправляет запросы на главный узел и узлы данных, обрабатывает этап сокращения поиска и распределяет массовое индексирование.

Данные и клиентские узлы будут поглощать ресурсы под давлением, и важно, чтобы мастер всегда получал небольшие ресурсы, необходимые для стабильности. Поэтому подумайте о том, чтобы назначить каждому узлу определенную роль. Наличие выделенных клиентских узлов также упрощает добавление и удаление основных узлов и узлов данных.

Использовать несколько дисков

Вы можете задать несколько путей для каждого узла данных в параметре path.data, чтобы увеличить общий объем хранилища и производительность ввода-вывода. Это немного безопаснее, чем RAID – 0, поскольку с RAID – 0, если какой-либо диск выйдет из строя, вы потеряете все сегменты. При использовании нескольких path.data Elasticsearch хранит все файлы, относящиеся к данному сегменту, на одном диске. Если диск выходит из строя, будут потеряны только его сегменты. Конечно, убедитесь, что у вас есть хотя бы одна реплика для ваших индексов.

Сжатие

HTTP API Elasticsearch по умолчанию не поддерживает сжатые запросы. Использование сжатия немного снизит производительность записи, но вы, вероятно, захотите сжать, чтобы сэкономить полосу пропускания и предотвратить насыщение.

Мониторинг с помощью плагинов

HQ - это плагин для мониторинга, который я считаю наиболее полезным. На его странице диагностики узлов отображается таблица показателей для каждого узла, а также используются пороговые значения, чтобы судить и указывать, как все выглядит.

Спасибо за чтение и надеюсь, что это поможет вам. Дайте мне знать, если вы слышали о чем-нибудь, пробовали что-нибудь еще или у вас есть вопросы.

Подписывайтесь на меня в Twitter, чтобы быть в курсе того, что я узнал, создав свой инструмент личных финансов, Stash.