Привет, Хабр! Меня зовут Илья Степанов, я работаю в СберТехе в команде продукта Platform V DataGrid — распределённой базы данных, основанной на Apache Ignite и доработанной до enterprise-уровня надёжности и безопасности. В статье расскажу, как мы обеспечиваем промышленный мониторинг критических систем и визуализируем метрики наших кластеров.

Периодически к нам обращаются пользователи и клиенты с вопросом: «Как лучше визуализировать то или иное состояние кластера?» В нашем продукте есть несколько способов получения метрик из кластера. В том числе «классические» для Java-приложений: можно прочитать метрики через JMX, экспортировать в формате Prometheus, сбрасывать в log-файл, получать в результате SQL-запроса или через вызов управляющего скрипта. То есть, с метриками может работать практически любая система мониторинга.

Для мониторинга Platform V DataGrid и других продуктов Platform V у нас есть специализированный продукт — Platform V Monitor, обеспечивающий сбор, хранение, визуализацию и анализ телеметрии. Помимо него, для сбора и хранения телеметрии доступны самые разные системы: Zabbix, Prometheus, InfluxDB, Victoriametrics и другие. Тогда для создания панелей чаще всего используется Grafana — распространённая платформа для мониторинга, визуализации и анализа данных. В поставке с Grafana идёт много плагинов для создания панелей, а ещё здесь можно установить дополнительные компоненты, которые расширяют возможности визуализации.

В простых случаях, например, когда вам нужно отобразить график с метрикой или нарисовать таблицу с данными, достаточно будет стандартных компонентов Grafana. Однако этого будет недостаточно, если потребуется модифицировать метрики перед визуализацией, составить более сложную логику работы с сырыми данными или отобразить нестандартные графики. Platform V Monitor, в свою очередь, позволяет это делать. А также обладает возможностями журналирования, трассировки, оповещения и прогнозирования значений метрик.

Я опишу наш опыт работы именно с Grafana, как с более известным и популярным решением.

Первое время для модификации данных мы использовали функции Transform в Grafana, но затем свели их применение к минимуму. Причин было две:

  1. Многие функции на момент использования носили статус beta или alpha, что приводило к ошибкам в их работе.

  2. После обновления Grafana до новой версии клиенты жаловались на ошибки в отображении данных. Как правило, причина была одна: изменение поведения функций Transform.

В итоге мы решили реализовать свой подход к модификации и визуализации данных в тех случаях, когда стандартных панелей недостаточно. Для этого выбрали плагин HTMLGraphics для Grafana. Благодаря связке JavaScript с HTML и CSS он позволяет реализовывать любую логику и визуализацию панелей. Код можно править прямо в настройках панели и без дополнительных манипуляций на стороне Grafana.

Примеры отображения метрик

Насколько быстро кластер выполняет операции над кешами

У базовых операций с кешем (например, GET, PUT, REMOVE) есть свой набор метрик. Скажем, метрика CacheGets отвечает за общее количество операций GET в определённом кеше, на конкретном узле кластера. Метрика CachePuts отвечает на вопрос, сколько было операций PUT, и т. д. Метрики увеличиваются каждый раз, когда узел кластера завершит ту или иную операцию.

Для оценки скорости выполнения операций мы используем гистограммы. Каждая операция имеет свою гистограмму с предустановленными временными интервалами. Так, для операции GET по умолчанию имеются следующие временные интервалы в метриках:

GetTime_0_1000000
GetTime_1000000_10000000
GetTime_10000000_100000000
GetTime_100000000_250000000
GetTime_250000000_1000000000
GetTime_1000000000_inf

Интервалы в именах метрик отображаются в наносекундах. Каждая такая метрика — это счётчик. Он увеличивается, если операция с кешем завершилась в его временных пределах. Нам остаётся только собрать все метрики гистограмм со всех узлов кластера по интересующему нас кешу.

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

Метрика показывает скорость выполнения операций GET за конкретный промежуток времени.
Метрика показывает скорость выполнения операций GET за конкретный промежуток времени.

Визуализируем скорость выполнения транзакций

С метриками транзакций ситуация похожая. Есть метрики количества успешных транзакций (txCommits) и гистограммы, которые отображают скорость выполнения транзакций. Гистограммы группируются по системному и пользовательскому времени исполнения (nodeSystemTimeHistogram и nodeUserTimeHistogram). Системное время — время, затраченное на получение блокировок, фиксации транзакции и т. д. Пользовательское время — время, затраченное на вычисления логики транзакции.

В отличие от метрик кеша, метрики транзакций создаются на узле без учёта количества кешей. Таким образом, метрик транзакций в разы меньше, чем метрик кешей. По умолчанию создаются следующие временные интервалы в метриках:

nodeUserTimeHistogram_0_1
nodeUserTimeHistogram_1_2
nodeUserTimeHistogram_2_4
nodeUserTimeHistogram_4_8
nodeUserTimeHistogram_8_16
nodeUserTimeHistogram_16_25
nodeUserTimeHistogram_25_50
nodeUserTimeHistogram_50_75
nodeUserTimeHistogram_75_100
nodeUserTimeHistogram_100_250
nodeUserTimeHistogram_250_500
nodeUserTimeHistogram_500_750
nodeUserTimeHistogram_750_1000
nodeUserTimeHistogram_1000_3000
nodeUserTimeHistogram_3000_5000
nodeUserTimeHistogram_5000_10000
nodeUserTimeHistogram_10000_25000
nodeUserTimeHistogram_25000_60000
nodeUserTimeHistogram_60000_inf

Интервалы в именах метрик отображаются в миллисекундах. С точки зрения отображения на панели мы рекомендуем тот же подход, что и для метрик кеша — график и суммирование.

Гистограмма показывает пользовательское время, затраченное на вычисления логики транзакции.
Гистограмма показывает пользовательское время, затраченное на вычисления логики транзакции.

Сколько времени осталось на ребалансировку данных в кластере

Одна из самых продолжительных операций в кластере — ребалансировка данных. Она зависит от объёма информации в партициях, скорости работы сети и других внешних факторов. Важно отметить: ребалансировка не блокирует работу с данными в кластере и запускается только в случае изменения топологии кластера. При ребалансировке партиции перемещаются с одного узла на другой. Вот несколько примеров метрик, которые позволяют следить за этим процессом:

  • RebalancingPartitionsLeft — общее количество оставшихся партиций к перемещению.

  • RebalancingPartitionsTotal — общее количество партиций к перемещению.

  • RebalancingStartTime — время начала операции по ребалансировке.

  • RebalancingEndTime — время окончания операции по ребалансировке.

Эти метрики формируются для каждой кеш-группы на каждом узле. Таким образом, мы можем вывести график убывания метрики RebalancingPartitionsLeft и отслеживать статус выполнения операции. Дополнительно можно посчитать примерный прогноз по завершению ребалансировки, данных для расчёта скорости (партиция в минуту) более чем достаточно. Однако это приблизительный расчёт, так как не учитывается размер партиций к перемещению и другие внешние факторы.

Сколько и каких узлов мы можем вывести из топологии без потери данных в кластере

По умолчанию кластер пытается разложить данные равномерно по всем узлам. Этот процесс можно контролировать, например, через BackupFilter. С помощью BackupFilter мы можем объединить узлы кластера в ячейки. Каждая Primary-партиция в такой ячейке будет иметь Backup-партицию в той же ячейке. В случае выхода узла из кластера можно узнать, сколько узлов осталось в ячейке и какие узлы нельзя потерять. Это важно в тех ситуациях, когда партиции находятся в единственном экземпляре.

Каждая кеш-группа публикует метрики партиций:

  • AffinityPartitionsAssignmentMap — карта распределения партиций в кластере.

  • OwningPartitionsAllocationMap — карта партиций в кластере в состоянии OWNING.

Если в AffinityPartitionsAssignmentMap есть партиция, которая хранится только на одном узле (0=[8dec8996-15f7-4846-a4fe-0121cb869cd3]), и на кластере не запущена ребалансировка, значит, такая партиция хранится в единственном экземпляре. Важно не терять узел с соответствующим идентификатором, так как это может привести к потере данных в кластере.

Осталось только собрать метрики, проанализировать количество идентификаторов для каждой партиции и вывести на экран:

Скорость работы пулов потоков кластера

На каждом узле кластера есть ряд системных пулов потоков. Каждый отвечает за свою функциональность. Например, Queries Pool — за работу SQL и Scan, Striped Pool — за базовые операции с кешами, Public Pool — за Compute, и т. д. У каждого пула — свои метрики узла:

  • TotalQueueSize/QueueSize — размер очереди в пулах.

  • TotalCompletedTasksCount/CompletedTaskCount — количество завершённых задач в потоках.

Также у каждого пула есть свой набор гистограмм:

TaskExecutionTime_0_10
TaskExecutionTime_10_50
TaskExecutionTime_50_100
TaskExecutionTime_100_500
TaskExecutionTime_500_1000
TaskExecutionTime_1000_inf

Интервалы в именах метрик отображаются в миллисекундах. Настроив мониторинг на метрики пулов, можно отслеживать скорость работы каждого узла:

Отображаем проблемы в кластере

Пожалуй, один из самых сложных и спорных вопросов. Что считать проблемой? Конечно, есть ряд метрик, которые одинаково важны для всех пользователей, скажем, количество узлов в кластере. Но в остальных случаях у клиентов разные SLA: для кого-то повышенное потребление места на диске — это проблема, а для кого-то — нормальная ситуация.

Поэтому один из первых шагов — определить список метрик и их пороговое значение. Также необходимо спроектировать, где конкретно будет проверяться метрика на соответствие пороговому значению. Обычно такие проверки проводят на стороне системы мониторинга. Например, в Zabbix за это отвечает функциональность «триггеры». Но при желании проверки можно вынести на Grafana.

Если у вас всего один кластер, то, скорее всего, вы захотите сделать визуализацию отдельно для каждого узла. А если кластеров 50, 100, 200? В таких случаях визуализацию нужно строить по кластерам, а не по узлам, предусмотрев сортировку и фильтрацию. Вот пример «дашборда здоровья», где каждый кластер — это отдельный круг с информацией о количестве найденных проблем:

Заключение

С помощью Grafana и плагина HTMLGraphics, либо с помощью Platform V Monitor можно визуализировать практически любую метрику нашего кластера. Клиентам Platform V DataGrid вместе с дистрибутивом мы поставляем более 20 готовых дашбордов, которые эффективно используются в промышленной эксплуатации. Такой подход к визуализации метрик помогает:

  • Аккумулировать всю информацию на одном экране, упрощая работу службы поддержки и ускоряя время обработки информации о состоянии кластера.

  • Ускорить решение инцидентов благодаря детализации работы кластера — администратор видит подробную информацию обо всех ключевых характеристиках системы и может быстро принять правильное решение.

Комментарии (0)