- PVSM.RU - https://www.pvsm.ru -
— How big a cluster do I need?
— Well, it depends… (злобное хихиканье)
Elasticsearch — сердце Elastic Stack, в котором происходит вся магия с документами: выдача, приём, обработка и хранение. От правильного количества нод и архитектуры решения зависит его производительность. И цена, кстати, тоже, если ваша подписка Gold или Platinum.
Основные характеристики аппаратного обеспечения — это диск (storage), память (memory), процессоры (compute) и сеть (network). Каждый из этих компонентов в ответе за действие, которое Elasticsearch выполняет над документами, это, соответственно, хранение, чтение, вычисления и приём/передача. Поговорим об общих принципах сайзинга и раскроем то самое «it depends». А в конце статьи ссылки на вебинары и статьи по теме. Поехали!
Эта статья основана на материалах вебинара Дэвида Мура «Sizing and Capacity Planning» [1]. Его рассуждения мы дополнили ссылками и комментариями, чтобы было чуть понятнее. В конце статьи бонус-трек — ссылки на материалы Elastic для тех, кто хочет лучше погрузиться в тему. Если у вас хороший опыт работы с Elasticsearch, пожалуйста, поделитесь в комментариях как проектируете кластер. Нам и всем коллегам было бы интересно узнать ваше мнение.
В начале статьи мы говорили про 4 компонента, формирующие аппаратное обеспечение: диск, память, процессоры и сеть. На утилизацию каждого из этих компонентов влияет роль ноды. Одна нода может выполнять сразу несколько ролей, но с ростом кластера, эти роли должны быть распределены по разным нодам.
Master-ноды выполняют контроль за работоспособностью кластера в целом. В работе master-нод должен соблюдаться кворум, т.е. их количество должно быть нечётным (может быть 1, но лучше 3).
Data-ноды выполняют функции хранения. Для повышение производительности кластера, ноды нужно разделить на «горячие» (hot), «тёплые» (warm) и «холодные» (frozen) [2]. Первые предназначены для оперативного доступа, вторые для хранения, а третьи для архива. Соответственно, для «горячих» разумно использование локальных SSD-дисков, а для «тёплых» и «холодных» подойдёт массив HDD локально или в SAN.
Для определения объёма памяти нод для хранения, Elastic рекомендует пользоваться следующей логикой: «горячие» → 1:30 (30Гб дискового пространства на каждый гигабайт памяти), «тёплые» → 1:100, «холодные» → 1:500). Под JVM Heap не более 50% общего объёма памяти [3] и не более 30Гб во избежание набега garbage collector. Оставшаяся память будет использована как кэш операционной системы.
На утилизацию ядер процессоров в большей степени влияют такие показатели производительности инстанса Elastisearch как thread pools и thread queues [4]. Первые формируются на основе тех действий, которые выполняет нода: search, analyze, write и другие. Вторые являются очередью из соответствующих запросов различных типов. Количество доступных для использования процессоров Elasticsearch определяет автоматически, но в настройках можно указать это значение вручную (может быть полезно когда у вас на одном хосте запущено 2 и более инстанса Elasticsearch). Максимальное количество thread pools и thread queues каждого типа можно задать в настройках. Показатель thread pools — это основной показатель производительности Elasticsearch.
Ingest-ноды принимают на вход данные от сборщиков (Logstash, Beats и т.д.), выполняют преобразования над ними и записывают в целевой индекс.
Ноды Machine learning предназначены для анализа данных. Как мы писали в статье о машинном обучении в Elastic Stack [5], механизм написан на С++ и работает за пределами JVM, в которой крутится сам Elasticsearch, поэтому разумно выполнять такую аналитику на отдельной ноде.
Coordinator-ноды принимают поисковый запрос и маршрутизируют его. Наличие такого типа нод ускоряет обработку поисковых запросов.
Если рассматривать нагрузку на ноды в разрезе инфраструктурных мощностей, распределение будет примерно таким:
Нода | Диск | Память | Процессор | Сеть |
Master | ↓ | ↓ | ↓ | ↓ |
Data | ↑↑ | ↑ | ↑ | → |
Ingest | ↓ | → | ↑ | → |
Machine Learning | ↓ | ↑↑ | ↑↑ | → |
Coordinator | ↓ | → | → | → |
↑↑ — очень высокая, ↑ — высокая, → — средняя, ↓ — низкая |
Дальше мы приведём 4 основных типа операций в Elasticsearch, каждая из которых требует определённого типа ресурсов.
Index — обработка и сохранение документа в индексе. На схеме ниже представлены ресурсы, используемые на каждом из этапов.
Delete — удаление документа из индекса.
Update — работает как Index и Delete, потому что документы в Elasticsearch неизменны.
Search — получение одного или более документов или их агрегация из одного или более индексов.
С архитектурой и типами нагрузки разобрались, теперь перейдём к формированию модели сайзинга.
Elastic рекомендует использовать две стратегии сайзинга: ориентированную на объём хранения и на пропускную способность. В первом случае первостепенное значение приобретают дисковые ресурсы и память, а во втором память, процессорная мощность и сеть.
Перед проведением расчётов получим исходные данные. Нужно:
К сожалению, фактор изменения данных вычисляется только опытным путём и зависит от разных вещеё: формата сырых данных, количества полей в документах и т.д. Чтобы это выяснить, нужно загрузить в индекс порцию тестовых данных. На тему таких тестов есть интересное видео с конференции [6] и дискуссия в коммьюнити Elastic [7]. В общем случае можно оставлять его равным 1.
По умолчанию, Elasticsearch сжимает данные [8] по алгоритму LZ4, но есть и DEFLATE, который жмёт на 15% сильнее. В общем можно добиться сжатия 20-30%, но это тоже вычисляется опытным путём. При переключении на алгоритм DEFLATE возрастает нагрузка на вычислительные мощности.
Ещё есть дополнительные рекомендации:
А теперь переходим к формулам. Ничего сложного тут нет, и, думаем, вам будет интересно проверить ваш кластер на соответствие этим рекомендациям.
Общее количество данных (Гб) = Сырые данные в день * Количество дней хранения * фактор увеличения данных * (количество реплик — 1)
Общее хранилище данных (Гб) = Общее количество данных (Гб) *(1 + 0,15 запаса + 0,05 дополнительные нужды)
Общее количество нод = ОКРВВЕРХ (Общее хранилище данных (Гб) / Объём памяти на ноду / соотношение памяти к данных + 1 эквивалент ноды данных)
Перед проведением расчётов получим исходные данные. Нужно:
Ещё есть дополнительные рекомендации:
Формулы выглядят следующим образов:
Количество шард = Количество index patterns * Количество основных шард * (Количество реплицированных шард + 1)* количество дней хранения
Количество нод данных = ОКРВВЕРХ ( Количество шард / (20 * Память на каждую ноду))
Самый частый случай, когда нужна высокая пропускная способность —это частые и в большом количестве поисковые запросы.
Необходимые исходные данные для расчёта:
Пиковое значение тредов = ОКРВВЕРХ (пиковое количество поисковых запросов в секунду * среднее количество время ответа на поисковый запрос в миллисекундах / 1000 миллисекунд)
Объём thread pool = ОКРВВЕРХ (( количество физических ядер на ноду * количество threads на ядро * 3 / 2) +1)
Количество нод данных = ОКРВВЕРХ ( Пиковое значение тредов / Объём thread pool )
Возможно, не все исходные данные будут у вас на руках при проектировании архитектуры, но посмотрев вебинар [1] или прочитав эту статью появится понимание, что в принципе влияет на количество аппаратных ресурсов.
Обращаем ваше внимание, что не обязательно придерживаться приведённой архитектуры (например, создавать ноды-координаторы и ноды-обработчики). Достаточно знать, что такая эталонная архитектура существует и она может дать прирост производительности, которого вы не могли добиться другими средствами.
В одной из следующих статей мы опубликуем полный список вопросов, на которые нужно получить ответы для определения размера кластера.
Для связи с нами можно использовать личные сообщения на Хабре или форму обратной связи на сайте [9].
Дололнительные материалы
Вебинар «Elasticsearch sizing and capacity planning» [1]
Вебинар о планировании мощностей Elasticsearch [10]
Выступление на ElasticON с темой «Quantitative Cluster Sizing» [6]
Вебинар про утилиту Rally для определения показателей производительности кластера [11]
Статья о сайзинге Elasticsearch [12]
Вебинар об архитектуре Elastic stack [13]
Автор: GalsSoftware
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nosql/332490
Ссылки в тексте:
[1] вебинара Дэвида Мура «Sizing and Capacity Planning»: https://www.elastic.co/webinars/elasticsearch-sizing-and-capacity-planning
[2] «горячие» (hot), «тёплые» (warm) и «холодные» (frozen): https://www.elastic.co/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management
[3] JVM Heap не более 50% общего объёма памяти: https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
[4] thread pools и thread queues: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html
[5] статье о машинном обучении в Elastic Stack: https://habr.com/ru/company/galssoftware/blog/455387/
[6] интересное видео с конференции: https://www.elastic.co/elasticon/conf/2016/sf/quantitative-cluster-sizing
[7] дискуссия в коммьюнити Elastic: https://discuss.elastic.co/t/json-index-conversion-factors-elastic-sizing-factors/169211
[8] Elasticsearch сжимает данные: https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#index-codec
[9] форму обратной связи на сайте: https://gals.software/solutions/elasticstack
[10] Вебинар о планировании мощностей Elasticsearch: https://www.elastic.co/webinars/elasticsearch-capacity-planning-scaling-with-replicas-and-indices
[11] Вебинар про утилиту Rally для определения показателей производительности кластера: https://www.elastic.co/webinars/using-rally-to-get-your-elasticsearch-cluster-size-right
[12] Статья о сайзинге Elasticsearch: https://www.elastic.co/blog/found-sizing-elasticsearch
[13] Вебинар об архитектуре Elastic stack: https://www.elastic.co/webinars/elasticsearch-architecture-best-practices
[14] Источник: https://habr.com/ru/post/470640/?utm_campaign=470640&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.