Como devo armazenar séries temporais no mongodb


11

Preciso criar um banco de dados de séries temporais e executar as seguintes tarefas:

  • criar novas séries temporais
  • atualizar séries temporais existentes
  • consultar uma ou várias séries temporais ao mesmo tempo (por exemplo, todas as séries temporais para a mesma data, etc ...)

O Mongo está adaptado a isso e, se sim, como devo estruturar o banco de dados? (uma série temporal = um documento? Ou um documento = uma entrada da série temporal, e todos esses documentos formam a coleção, que é a série temporal inteira?)

Estou um pouco perdido aqui e acho difícil encontrar qualquer informação, pois geralmente o Mongo é apresentado como muito flexível, para que o usuário possa escolher a infraestrutura.

Qualquer link para o tutorial que explique especificamente como gerenciar séries temporais no Mongo é muito bem-vindo.

Obrigado!


Leia Design de esquema para dados de séries temporais no MongoDB hoje. Muito bom escrever sobre isso.
akauppi

Há um white paper atualizado que discute séries temporais no MongoDB. mongodb.com/collateral/time-series-best-practices #
Robert Walters

Respostas:


6

Sugiro uma única entrada de série temporal por documento. Existem alguns problemas com o armazenamento de várias entradas por documento:

  • um único documento está limitado a um determinado tamanho (atualmente 16 MB); isso limita quantas entradas podem ser armazenadas em um único documento
  • À medida que mais entradas são adicionadas a um documento, o documento inteiro (e a série temporal) serão desnecessariamente excluídos e realocados para um pedaço maior de memória
  • consultas em sub-documentos são limitadas em comparação com consultas em documentos regulares
  • documentos com estruturas muito planas (como um sub-documento por cada segundo) não têm bom desempenho
  • o redutor de mapa incorporado não funciona tão bem em sub-documentos

Observe também que um carimbo de data / hora está embutido no MongoDB ObjectId padrão . Você pode usar isso se a precisão da série temporal for inferior a um segundo.

Aqui está um exemplo de documento BSON de uma biblioteca de log de eventos que usa o 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
    }
}

Como um log de eventos é semelhante a uma série temporal, pode valer a pena estudar o restante do código . Existem versões em Java, C #, PHP e Python.

Aqui está outro projeto semelhante de código aberto: Zarkov


[update] Em resposta ao comentário do @ RockScience, adicionei mais algumas referências:


serão muitos documentos se minha série temporal tiver dados intradiários por vários anos !!! não é um problema ter tantos documentos? Vindo de um background sql, acho que não tem muita memória. (Como haverá muita repetição para todos os pontos de dados da mesma série temporal)
RockScience

@RockScience: O MongoDB, como muitos outros bancos de dados NoSQL, evita a normalização e a eficiência da memória em favor de outras coisas, como flexibilidade, velocidade e uso reduzido da CPU. Se você precisar de eficiência de memória, o MongoDB pode não ser a solução certa para você. O MongoDB copia o nome do texto completo de cada campo em todos os documentos, pelo amor de Deus! De qualquer forma, atualizei minha resposta com mais alguns recursos, incluindo um estudo de caso de como o MongoDB foi usado para armazenar uma série temporal muito grande.
Leftium 11/09/13


2

Sim, definitivamente, o banco de dados NoSQL é mais adequado para armazenar dados de séries temporais do que o RDBMS tradicional.

Sim O MongoDB está excepcionalmente adaptado a este caso de uso.

-Como você deve estruturar o banco de dados? Um documento = uma entrada de série temporal VS várias séries temporais.

A resposta é armazenar em um documento várias séries temporais. Ter menos documentos ajudará o desempenho com menos leituras. Um truque é preparar seu documento com os valores predefinidos. Isso otimizará a atualização do documento, evitando o preenchimento de registros .

Aqui está um exemplo de esquema sobre como armazenar idealmente uma hora no valor de séries temporais com um intervalo de minutos:

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

Você o inicia com 0 valores e as atualizações serão otimizadas. As leituras são otimizadas porque um documento é lido em vez de 60. Se você precisar armazenar um dia de dados ou um mês em que prosseguir com a mesma técnica, terá uma idéia.

Aqui está o link para um tutorial que explica especificamente como gerenciar séries cronológicas no MongoDb a partir do Blog oficial do MongoDb: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
A compactação de dados em um documento será melhor com o desempenho e o uso de recursos. Existem três cenários de esquema discutidos nas séries temporais atualizadas do white paper das melhores práticas do MongoDB. mongodb.com/collateral/time-series-best-practices #
Robert Walters
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.