Как хранить временные ряды в mongodb

Мне нужно создать базу данных временных рядов и выполнить следующие задачи:

  • создать новый временной ряд
  • обновить существующие временные ряды
  • запросить один или несколько временных рядов сразу (например, все временные ряды на ту же дату и т. д.)

Монго адаптирован к этому, и если да, то как мне структурировать базу данных? (один раз serie = один документ? Или один документ = одна запись временной серии, и все эти документы составляют коллекцию, которая представляет собой весь временной ряд?)

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

Любая ссылка на учебник, в котором подробно описывается, как управлять временными рядами в Монго, очень приветствуется.

Спасибо!

10 голосов | спросил RockScience 7 MaramWed, 07 Mar 2012 11:46:36 +04002012-03-07T11:46:36+04:0011 2012, 11:46:36

3 ответа


5

Я предлагаю запись одного временного ряда для каждого документа. Существуют некоторые проблемы с хранением нескольких записей на документ:

  • один документ ограничен определенным размером (в настоящее время - 16 МБ); это ограничивает количество записей в одном документе.
  • по мере того, как в документ добавляются новые записи, весь документ (и временные ряды) без необходимости удаляется и перераспределяется в большую часть памяти.
  • запросы по суб-документам ограничены по сравнению с запросами в обычных документах
  • документы с очень плоскими структурами (например, один поддокумент для каждой секунды) не выполняются.
  • встроенный снимок карты не работает также и в поддоменах

Также обратите внимание на временную метку, встроенную в объект MongoDB ObjectId по умолчанию . Вы можете использовать это , если точность временных рядов меньше одной секунды ,

Вот пример документа BSON из библиотеки регистрации событий который использует MongoDB :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Так как журнал событий похож на временный ряд, возможно, стоит изучить остаток кода . Существуют версии в Java, C #, PHP и Python.

Вот еще один аналогичный проект с открытым исходным кодом: Зарков


[обновление] В ответ на комментарий @ RockScience я добавил еще несколько ссылок:

ответил Leftium 15 MaramThu, 15 Mar 2012 07:57:12 +04002012-03-15T07:57:12+04:0007 2012, 07:57:12
2

Я нашел этот вопрос на SO ( https://stackoverflow.com/вопросы /4814167 /storage-time-series-data-relational-or-non ), где OP спрашивает, как хранить временные ряды. Хотя его вопрос более основан на использовании базы данных NoSQL или RDBMS, и вы, похоже, довольно хорошо настроены на использование базы данных NoSQL.

Также найдена эта статья на странице « Уникальные требования к базе данных данных временных рядов ", которые могут быть полезны.

Надеюсь, что это поможет.

ответил Aaron 24 MarpmSat, 24 Mar 2012 16:11:56 +04002012-03-24T16:11:56+04:0004 2012, 16:11:56
1

Да, определенно, база данных NoSQL лучше подходит для хранения данных таймсеров, чем традиционные РСУБД.

Да MongoDB исключительно адаптирован к этому варианту использования.

-Как следует структурировать базу данных? Один документ = один временной ряд ввода VS нескольких временных рядов.

Ответ заключается в том, чтобы хранить в одном документе несколько временных рядов. Наличие меньше документов поможет производительности с меньшим количеством чтений. Один трюк заключается в подготовке документа с предопределенными значениями. Это оптимизирует обновление документа, избегая Record Padding .

Ниже приведен пример схемы оптимального хранения часового количества таймсеров с минимальным интервалом:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: “memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

Вы инициируете его с помощью 0 значений, а затем обновления будут оптимизированы. Чтения оптимизированы, потому что один документ считывается вместо 60. Если вам нужно хранить данные за день или месяц, то вы начинаете с того же метода, вы получаете идею.

Вот ссылка на учебник, в котором подробно объясняется, как управлять временными рядами в MongoDb из официального блога MongoDb: http://blog.mongodb.org /пост /65517193370 /схема-дизайн для времени серии-данных в MongoDB-

ответил Naim Zard 2 J000000Thursday15 2015, 23:13:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132