База данных Whisper
Whisper — это база данных с фиксированным размером, похожая по дизайну и назначению на RRD (round-robin-database). Она обеспечивает быстрый и надёжный хранение числовых данных во времени. Whisper позволяет использовать более высокое разрешение (секунды на точку) для недавних данных, которые затем деградируют до более низкого разрешения для долгосрочного хранения исторических данных.
Точки данных
Точки данных в Whisper хранятся на диске в формате big-endian с плавающей запятой двойной точности. Каждое значение сопоставлено со временем в секундах с начала эпохи Unix (01.01.1970). Значение данных анализируется функцией float() Python, и, таким образом, ведет себя так же, как и для специальных строк, таких как 'inf'. Максимальные и минимальные значения определяются допустимым диапазоном значений с плавающей запятой интерпретатора Python, который можно найти, выполнив:
python -c 'import sys; print sys.float_info'
Архивы: Хранение и точность
Базы данных Whisper содержат один или несколько архивов, каждый с определённым разрешением данных и временем хранения (определённым количеством точек или максимальным возрастом по времени). Архивы упорядочены от архива с наивысшим разрешением и самым коротким временем хранения к архиву с наименьшим разрешением и самым длинным временем хранения.
Для поддержки точного агрегирования от архивов с более высоким разрешением к архивам с более низким разрешением точность архива с более длительным хранением должна быть кратна точности архива с более низким разрешением, который следует за ним. Например, архив с 1 точкой данных каждые 60 секунд может иметь последующий архив с более низким разрешением с разрешением 1 точка данных каждые 300 секунд, так как 60 делится на 300 без остатка. В противоположность этому, точность в 180 секунд (3 минуты) не может быть далее после точности в 600 секунд (10 минут), так как отношение точек, подлежащих распространению от первого архива к следующему, будет 3 1/3, и Whisper не будет выполнять частичную интерполяцию точек.
Общее время хранения базы данных определяется архивом с наибольшим временем хранения, так как временные периоды каждого архива перекрываются (см. Многоархивное хранение и поведение при извлечении). То есть, пара архивов с временами хранения в 1 месяц и 1 год не обеспечит 13 месяцев хранения данных, как можно предположить. Вместо этого она обеспечит 1 год хранения — длину своего самого длительного архива.
Агрегирование Rollup
Базы данных Whisper с более чем одним архивом нуждаются в стратегии для сжатия нескольких точек данных, когда данные сворачиваются в архив с более низким разрешением. По умолчанию используется функция среднего значения. Доступные методы агрегирования:
- среднее значение
- сумма
- последнее
- максимум
- минимум
Многоархивное хранение и поведение при извлечении
Когда Whisper записывает данные в базу данных с несколькими архивами, входящая точка данных записывается во все архивы одновременно. Точка данных будет записана в архив с наивысшим разрешением как есть, и будет агрегирована по выбранному методу агрегирования (см. Агрегирование Rollup) и размещена в каждом из архивов с более длительным временем хранения. Если вам требуется агрегирование точек с наивысшим разрешением, пожалуйста, рассмотрите использование carbon-aggregator для этой цели.
При извлечении данных (ограниченных диапазоном времени), используется первый архив, который может удовлетворить весь период времени. Если временной период перекрывает границу архива, используется архив с более низким разрешением. Это позволяет упростить поведение при извлечении данных, поскольку разрешение данных является постоянным для всего возвращённого ряда.
Эффективность использования дискового пространства
Whisper имеет некоторую неэффективность в использовании дискового пространства из-за определённых конструктивных решений:
- Каждая точка данных хранится со своим временем
- Вместо того, чтобы время извлекалось из её положения в архиве, время хранится с каждой точкой. Временные метки используются при извлечении данных для проверки достоверности точки данных. Если временная метка не соответствует ожидаемому значению для её положения относительно начала запрошенного ряда, она считается устаревшей, и возвращается значение NULL
- Архивы перекрывают временные периоды
- Во время записи точки данных Whisper сохраняет одни и те же данные во всех архивах одновременно (см. Многоархивное хранение и поведение при извлечении). Из этого следует, что все архивы хранят данные с настоящего момента до каждого из их времен хранения. По этой причине архивы с более низким разрешением должны быть настроены на значительно более низкое разрешение и более длительные времена хранения, чем их аналоги с более высоким разрешением, чтобы уменьшить перекрытие.
- Все временные интервалы в архиве занимают место, независимо от того, хранится ли в них значение
- Хотя Whisper позволяет надёжно хранить нерегулярные обновления, он наиболее эффективен с точки зрения пространства, когда точки данных хранятся с каждым интервалом обновления. Это свойство является следствием фиксированного размера базы данных и позволяет чтение и запись данных ряда выполнять в одной непрерывной операции с диском (для каждого архива в базе данных).
Отличия между Whisper и RRD
- RRD не может принимать обновления для временного интервала до его последнего обновления
- Это означает, что нет способа заполнить данные в ряду RRD. Whisper не имеет этого ограничения, и это упрощает импорт исторических данных в Graphite.
- RRD не был разработан для нерегулярных обновлений
- Во многих случаях (в зависимости от конфигурации), если обновление выполняется в ряду RRD, но за ним не следует ещё одно обновление вскоре, первоначальное обновление будет потеряно. Это делает его менее подходящим для записи данных, таких как операционные метрики (например, код ссылок).
- Whisper требует, чтобы обновления метрик происходили с таким же интервалом, как и в архиве с наилучшим разрешением
- Это возлагает на пользователя ответственность за агрегирование значений, соответствующих архиву с наилучшим разрешением, а не на базу данных. Это также означает, что обновления записываются непосредственно в архив с наилучшим разрешением, а не ставится в очередь для агрегирования и записи позже (во время последующей операции записи), как в RRD.
Производительность
Whisper достаточно быстрый для большинства задач. Он медленнее, чем RRDtool, в первую очередь из-за того, что Whisper написан на Python, а RRDtool — на C. Разница в скорости на практике невелика, поскольку было приложено много усилий для оптимизации Whisper, чтобы он был максимально близок к скорости RRDtool. Тестирование показало, что операции обновления занимают от 2 до 3 раз больше времени, чем RRDtool, а операции извлечения — от 2 до 5 раз больше времени. На практике фактическая разница измеряется сотнями микросекунд (10^-4), что означает менее миллисекунды разницы для простых случаев.
Формат базы данных
| WhisperFile | Header,Data | |||
| Header | Metadata,ArchiveInfo+ | |||
| Metadata | aggregationType,maxRetention,xFilesFactor,archiveCount | |||
| ArchiveInfo | Offset,SecondsPerPoint,Points | |||
| Data | Archive+ | |||
| Archive | Point+ | |||
| Point | timestamp,value |
Типы данных в формате struct Python:
| Metadata | !2LfL |
| ArchiveInfo | !3L |
| Point | !Ld |
© 2008–2012 Chris Davis
© 2011–2016 The Graphite Project
Licensed under the Apache License, Version 2.0.
https://graphite.readthedocs.io/en/latest/whisper.html