Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Sobre dados de séries temporais

Nesta página

  • Propriedades de dados de séries temporais
  • Comparação de coleções de séries temporais com collections regulares
  • Como funciona o bucketing
  • Como o metaField afeta o bucketing
  • O Catálogo de buckets
  • Criação
  • Encerramento
  • Exclusão

Internamente, o MongoDB otimiza os dados de séries temporais agrupando documentos em uma coleção de séries temporais com base em valores metaField comuns. A seleção de uma função útil fornece otimizações significativas para a densidade de armazenamento e o desempenho da query. Para mais informações, consultemetaFields do .

Os dados de série temporal têm várias propriedades que os diferenciam de outros formatos de dados:

  • Os documentos chegam em ordem, exigindo operações de inserção frequentes para anexá-los.

  • As operações de atualização são raras, pois cada documento representa um único ponto no tempo.

  • As operações de exclusão são raras se seu aplicação se beneficia por ter um extenso registro histórico.

  • Os dados são indexados por tempo e um identificador, como um código da ação, que identifica a série temporal exclusiva à qual pertence.

  • O volume de dados é alto, pois cada série temporal individual requer um número grande e constante de documentos.

Para levar em conta esses fatores, o MongoDB usa um formato colunar especializado que agrupa documentos de cada série temporal. Isso tem os seguintes benefícios:

  • Tamanhos de armazenamento e índice reduzidos

  • Mais eficiência da query

  • Menos E/S em operações de leitura

  • Aumento do uso do cache na memória do WiredTiger , melhorando ainda mais a velocidade da query

  • Menos complexidade para trabalhar com dados de séries temporais

Em uma collection regular, os dados são armazenados sequencialmente como blocos no disco, otimizando a velocidade de gravação. No entanto, isso requer um índice para cada ponto de dados , que rapidamente fica muito grande. Ele também requer um segundo índice que contenha o identificador da série temporal e os próprios registros de data e hora, para que os usuários possam consultar uma única série. Para ler esses dados, o MongoDB precisa processar todo o banco de banco de dados e os blocos de disco que os contêm, mesmo que um bloco contenha apenas um único documento relevante.

Este modelo é otimizado para operações CRUD e atualizações frequentes. O saldo de uma conta bancária só precisa refletir o estado atual, portanto, o documento de cada titular da conta é atualizado à medida que essas informações mudam.

Compare isso com uma coleção de séries temporais. As coleções de séries temporais gravam dados em ordem, o que significa que as transações recentes podem ser mantidas na memória para uma recuperação muito mais rápida. Por serem escritos em sequência, os documentos são armazenados juntos, portanto não há necessidade de ler cada bloco de disco depois que um documento não estiver mais na memória. Os dados são indexados pelo metaField, levando a índices muito menores.

Quando você cria uma coleção de séries temporais, o MongoDB cria automaticamente uma collection de sistemas system.buckets . O MongoDB agrupa documentos que têm ambos:

  • Um valor metaField idêntico, que deve identificar exclusivamente uma série temporal. Se um metaField for um objeto ou array, o MongoDB agrupa somente se todos os campos de objeto ou elementos de array corresponderem.

  • timeField valores próximos. Os parâmetros granularity, bucketMaxSpanSeconds e bucketRoundingSeconds da coleção de séries temporais controlam o período de tempo coberto por cada bucket. Para obter mais informações, consulte Definir a granularidade dos dados de série temporal.

Por exemplo, com uma granularidade de seconds, o MongoDB buckets documentos na mesma hora. Se um bucket contiver um documento com um valor metaField de sensorA e um valor timeField de 2024-08-01T18:23:21Z, um documento de entrada com um metaField de sensorB entrará em um bucket separado, independentemente do tempo. Um documento recebido de sensorA vai para o mesmo bucket somente se seu timeField estiver entre 2024-08-01T18:00:00Z e 2024-08-01T18:59:59Z.

Se um documento com um tempo de 2023-03-27T16:24:35Z não se encaixa em um bloco existente, o MongoDB cria um novo bloco com um mínimo de tempo de 2023-03-27T16:00:00Z e um tempo máximo de 2023-03-27T19:59:59Z.

Observação

Você pode modificar a granularidade de uma coleção de séries temporais, mas apenas para alterar de medições mais refinadas para mais aproximadas, como estender a cobertura de bucket de minutos para horas. Isso atualiza a definição de visualização da collection, mas não altera como os dados são armazenados nos buckets existentes.

Como os valores metaField devem corresponder exatamente aos documentos do grupo, o número de buckets em uma coleção de séries temporais depende do número de valores metaField exclusivos. Collections com valores metaField refinados ou em constante mudança geram muitos buckets de curta duração e pouco compactados. Isso leva à diminuição da eficiência de armazenamento e query.

Por exemplo, no documento a seguir , metadata é uma boa opção de metaField , pois facilita a consulta de dados de um determinado sensor meteorológico. Usando esses campos, o MongoDB agrupa as leituras de um único sensor.

{
timestamp: ISODate("2021-05-18T00:00:00.000Z"),
metadata: { sensorId: 5578, type: 'temperature' },
temp: 12,
_id: ObjectId("62f11bbf1e52f124b84479ad")
}

O catálogo de buckets é um cache especializado na memória em WiredTiger. Ele rastreia buckets para minimizar a latência e coordenar gravações simultâneas.

Para cada bucket aberto, o catálogo mantém informações como metaField, gravadores ativos, período coberto, número de documentos, tamanho e operações recentes. Como o MongoDB cria buckets separados para documentos com um metaField diferente , vários buckets são normalmente abertos ao mesmo tempo.

Para evitar inconsistências causadas por condições de corrida, os buckets podem ser fechados e removidos do catálogo de buckets quando uma operação conflitante é executada. Reiniciar o mongod fecha todos os buckets e redefine o catálogo de buckets.

  • O MongoDB cria um novo bucket se não houver um adequado para um documento recebido. Isso ocorre quando qualquer uma das seguintes afirmações é verdadeira:

    • O documento metaField não corresponde a nenhum bucket ativo.

    • O carimbo de data/hora do documento está fora do intervalo de todos os buckets ativos.

    • O documento excede o tamanho restante ou o limite de documento de todos os buckets ativos.

    O registro de data/hora inicial de um novo bucket é arredondado para baixo com base na granularidade da coleção. Isso lida com casos em que documentos com carimbos de data/hora fora de ordem chegam em sucessão próxima.

O MongoDB fecha um bucket em qualquer uma das seguintes circunstâncias:

  • O tempo avançou ou retrocedeu além do período coberto, conforme indicado por um carimbo de data/hora de documento recebido que está fora dos limites do bucket. Esses limites são determinados pela configuração de granularidade da collection.

  • O bucket atingiu o limite de documento (padrão 1000).

  • O bucket excedeu seu limite de tamanho de armazenamento. Isso acontece quando:

    • O tamanho excede o máximo permitido (padrão 125KB).

    • O número de documentos está abaixo de um número mínimo (padrão 10) e o tamanho está abaixo 12MiB.

      Este é um limite interno definido que otimiza o desempenho quando os dados consistem em documentos maiores e em menor número.

    • O conjunto de buckets ativos não se encaixa no tamanho permitido do cache do mecanismo de armazenamento. Você pode revisar estas informações utilizando o comando de banco de dados de dados do collStats .

  • O catálogo de buckets excede a alocação de memória total permitida (por padrão, 2.5% de memória disponível do sistema)

  • Uma operação conflitante, como uma migração ou atualização de chunk, altera o estado no disco de um bucket.

  • mongod reinicia. Isso fecha todos os buckets.

O MongoDB exclui um bucket quando:

  • Seu carimbo de data/hora máximo permitido é menor que o tempo atual menos o parâmetro expireAfterSeconds da coleção. Isso equivale ao tempo de vida de uma collection TTL .

  • Um comando delete ou db.collection.deleteMany() exclui o último documento no bucket.

Voltar

Séries temporais