Введение во временные ряды
Представьте, что вы хотите узнать, как температура на улице меняется в течение дня. Каждый час вы смотрите на термометр и записываете время вместе с текущей температурой. Через некоторое время у вас получится что-то вроде этого:
Такие данные о температуре — один из примеров того, что мы называем временным рядом — последовательностью измерений, упорядоченной во времени. Каждая строка в таблице представляет одно отдельное измерение в конкретный момент времени.
Таблицы удобны, когда нужно идентифицировать отдельные измерения, но по ним трудно увидеть общую картину. Более распространённая визуализация для временных рядов — график, который вместо этого располагает каждое измерение вдоль оси времени. Такие визуальные представления, как график, помогают обнаруживать закономерности и особенности данных, которые иначе было бы трудно заметить.
Данные о температуре, как в примере, далеко не единственный пример временного ряда. Другие примеры временных рядов:
- Использование процессора и памяти
- Данные датчиков
- Фондовый индекс
Хотя каждый из этих примеров представляет собой последовательности измерений, упорядоченных по времени, у них есть и другие общие свойства:
- Новые данные добавляются в конец через регулярные интервалы — например, каждый час в 09:00, 10:00, 11:00 и так далее.
- Измерения редко обновляются после того, как были добавлены — например, вчерашняя температура не меняется.
Временные ряды — мощный инструмент. Они помогают понять прошлое, позволяя анализировать состояние системы в любой момент времени. Временные ряды могут сообщить вам, что сервер упал через мгновение после того, как свободное место на диске упало до нуля.
Временные ряды также помогают предсказывать будущее, выявляя тенденции в ваших данных. Если число зарегистрированных пользователей каждый месяц растёт на 4% последние несколько месяцев, вы можете предсказать, насколько большой будет ваша база пользователей к концу года.
Некоторые временные ряды имеют закономерности, повторяющиеся через известный период. Например, температура обычно выше днём, прежде чем опуститься ночью. Выявляя такие периодические, или сезонные, временные ряды, вы можете уверенно делать прогнозы на следующий период. Если вы знаете, что нагрузка на систему достигает пика каждый день около 18:00, вы можете добавить больше машин непосредственно перед этим.
Агрегирование временных рядов
В зависимости от того, что вы измеряете, данные могут сильно различаться. Что если вы хотите сравнить периоды, более длительные, чем интервал между измерениями? Если вы измеряете температуру раз в час, за день у вас получится 24 точки данных. Чтобы сравнить температуру в августе по годам, вам пришлось бы объединить 31 раз по 24 точки данных в одну.
Объединение набора измерений называется агрегацией. Существует несколько способов агрегирования данных временных рядов. Вот некоторые распространённые:
- Average возвращает сумму всех значений, делённую на общее количество значений.
- Min и Max возвращают наименьшее и наибольшее значения в наборе.
- Sum возвращает сумму всех значений в наборе.
- Count возвращает количество значений в наборе.
Например, агрегировав данные за месяц, вы можете определить, что август 2017 года в среднем был теплее, чем годом ранее. Чтобы вместо этого увидеть, в каком месяце была самая высокая температура, вы сравнили бы максимальную температуру каждого месяца.
То, как вы решите агрегировать данные временных рядов, — важное решение, и оно зависит от истории, которую вы хотите рассказать с помощью своих данных. Обычно для визуализации одних и тех же данных временных рядов по-разному используют разные агрегации.
Временные ряды и мониторинг
В ИТ-индустрии данные временных рядов часто собирают для мониторинга инфраструктуры, оборудования или событий приложений. Машинно-генерируемые данные временных рядов обычно собираются с короткими интервалами, что позволяет реагировать на любые неожиданные изменения через мгновения после их появления. Как следствие, данные накапливаются стремительными темпами, что делает жизненно важным наличие способа эффективно хранить и запрашивать данные. В результате базы данных, оптимизированные для данных временных рядов, в последние годы становятся всё более популярными.
Базы данных временных рядов
База данных временных рядов (TSDB) — это база данных, специально разработанная для данных временных рядов. Хотя для хранения измерений можно использовать любую обычную базу данных, TSDB обладает рядом полезных оптимизаций.
Современные базы данных временных рядов используют тот факт, что измерения только добавляются и редко обновляются или удаляются. Например, метки времени для каждого измерения меняются очень мало со временем, из-за чего сохраняются избыточные данные.
Посмотрите на эту последовательность меток времени Unix:
1572524345, 1572524375, 1572524404, 1572524434, 1572524464
Глядя на эти метки времени, все они начинаются с 1572524, что приводит к неэкономному использованию дискового пространства. Вместо этого мы могли бы сохранять каждую последующую метку времени как разницу, или дельту, от первой:
1572524345, +30, +29, +30, +30
Мы могли бы пойти ещё дальше, вычислив дельты этих дельт:
1572524345, +30, -1, +1, +0
Если измерения выполняются через регулярные интервалы, большинство этих дельт от дельт будут равны 0. Благодаря таким оптимизациям TSDB используют кардинально меньше места, чем другие базы данных.
Ещё одна особенность TSDB — возможность фильтровать измерения с помощью тегов. Каждая точка данных помечена тегом, добавляющим контекстную информацию, например место, где было выполнено измерение. Вот пример формата данных InfluxDB, демонстрирующий, как хранится каждое измерение.
weather,location=us-midwest temperature=82 1465839830100400200
| -------------------- -------------- |
| | | |
| | | |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+
Вот некоторые из TSDB, поддерживаемых Grafana:
Сбор данных временных рядов
Теперь, когда у нас есть место для хранения временных рядов, как же нам на самом деле собирать измерения? Для сбора данных временных рядов обычно устанавливают коллектор на устройство, машину или экземпляр, который вы хотите отслеживать. Некоторые коллекторы созданы с расчётом на конкретную базу данных, а некоторые поддерживают различные назначения вывода.
Вот несколько примеров коллекторов:
Коллектор либо отправляет данные в базу данных, либо позволяет базе данных забирать данные из него. Оба метода имеют свои плюсы и минусы:
Поскольку записывать каждое измерение в базу данных было бы неэффективно, коллекторы предварительно агрегируют данные и записывают их в базу данных временных рядов через регулярные интервалы.