База данных временных рядов с многоколоночной агрегацией

Я пытаюсь разработать систему, которая имеет данные временных рядов. Вот требования к системе:

  • Данные поступают в систему в любое время суток из разных городов и отделов.
  • Эти отдельные записи должны быть доступны на всю жизнь. (необязательный)
  • Большинство запросов являются агрегатами. Однако они бывают по нескольким столбцам. Примеры запросов:
    • Сумма всех измерений в определенный день в определенном городе
    • Сумма всех измерений за (последний) месяц в отделе
    • Сумма всех измерений за (последнюю) неделю в городе для отдела
    • Сумма всех измерений в определенный день в штате (штат также будет частью записи)
  • Все запросы должны быть рассчитаны с очень низкой задержкой (< 300-500 мс)

Вот ограничения, которые у меня есть:

  • Я просмотрел несколько баз данных временных рядов. Насколько я понимаю, все они требуют дорогого оборудования. Я хотел бы знать, есть ли способ, которым мы можем запустить его на обычном оборудовании.
  • Я не уверен, сколько данных будет доступно в начале. В идеале это будет около 100 МБ в пике (в день). Поэтому я не хочу тратить сотни долларов в начале.
  • Еще одна идея, о которой я думал, - это создать экземпляр Amazon RDS, иметь несколько индексов для разных столбцов и объединять их по мере необходимости. Я не уверен, что это хорошая идея.

2 ответа

Вы можете попробовать Akumuli (предупреждение: я автор). Akumuli может выполнять агрегацию довольно быстро (менее миллисекунды), потому что это база данных, ориентированная на столбцы, и она предварительно вычисляет некоторые агрегаты для вас. И он может выполнять все запросы, которые вам нужны, например, если ваша серия выглядит так:

${measurement_name} city=${city_name} dept=${department_name} state=${state_name}

И фактические данные выглядят так (например, это данные о потребляемой мощности, измеряемые в ваттах):

W city=Jersey_City state=New-Jersey dept=1
W city=Jersey_City state=New-Jersey dept=2
W city=Paris state=Iowa dept=1
W city=Paris state=Iowa dept=2
W city=Texas state=Texas dept=1
W city=Texas state=Texas dept=3
W city=Paris state=Arkansas dept=1
W city=Paris state=Arkansas dept=2

Вы можете объединить все данные с dept=1 а также dept=2 теги, использующие этот запрос:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "dept" ],
    "where": { "dept": [1, 2] }
}

Вы получите сумму за каждый отдел, но будут включены только отделы 1 и 2.

Вместо этого вы можете разделить по городам:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "city" ],
}

Вы получите сумму за каждое название города (все отделы в одном городе будут объединены). Конечно, вы можете фильтровать по тегу, используя where пункт.

Если у вас есть несколько городов с одинаковыми названиями (например, Париж в Айове и Арканзасе), вы можете сгруппировать значения по городам и штатам:

{
    "aggregate": { "W": "sum" },
    "range": { "from": "20170501T000000",
               "to": "20170502T000000" },
    "group-by": [ "city", "state" ],
}

Вы получите одно значение для Paris Arkansas и другое для Paris Iowa.

Агрегации, которые вы описали, довольно стандартные. Было бы трудно найти базу данных, которая бы не поддерживала их.

Вы можете попробовать Axibase TSD. Он может эффективно рассчитывать календарные агрегаты (например, ежедневные итоги) с несколькими измерениями в заданном пользователем часовом поясе. Это было бы полезно, если собираемые вами метрики определяются действиями конечного пользователя:

SELECT date_format(time, "yyyy-MMM-dd", "US/Eastern"), 
  entity AS 'city', SUM(value)
FROM "email.active_sessions"
  WHERE datetime >= current_year
  AND entity.tags.state = 'PA'
GROUP BY entity, PERIOD(1 DAY, "US/Eastern")

Интервалы можно удобно указывать с помощью расширенных ключевых слов / функций. Вот как выглядит условие "(последняя) неделя":

WHERE datetime >= previous_week AND datetime < current_week

Обратитесь к документации SQL для дополнительных примеров.

ATSD работает в большинстве дистрибутивов Linux и может выполняться как в автономном, так и в распределенном режимах.

Раскрытие: я работаю на Axibase.

Другие вопросы по тегам