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

Sobre dados de séries temporais

Nesta página

  • Propriedades dos dados de série temporal
  • Comparação de coleções de séries temporais com coleções regulares
  • Como o bucketing funciona
  • Como o metaField afeta o bucket
  • O catálogo Bucket
  • Criação
  • Fechamento
  • 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 um útil fornece otimizações significativas para a densidade de armazenamento e o desempenho da consulta. Para mais informações, consulte metaFields.

Os dados de séries temporais 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 o seu aplicativo se beneficiar de um registro histórico extenso.

  • Os dados são indexados por tempo e por um identificador, como uma cotação de ações, que identifica a série temporal exclusiva à qual pertencem.

  • Os dados são de alto volume, pois cada série temporal individual requer um número grande e crescente de documentos.

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

  • Armazenamento e índices reduzidos

  • Mais eficiência da query

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

  • Maior uso do cache de memória WiredTiger, melhorando ainda mais a velocidade de query

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

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

Esse 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 são alteradas.

Compare isso a uma coleção de séries temporais. As coleções de séries temporais gravam os 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. Como eles são gravados em sequência, os documentos são armazenados juntos, portanto, não há necessidade de ler todos os blocos 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 coleção de sistemasystem.buckets. O MongoDB agrupa documentos que têm tanto:

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

  • timeField valores que estão próximos. Os parâmetros granularity, bucketMaxSpanSeconds e bucketRoundingSeconds da coleção de time series controla o período de tempo abordado por cada bucket. Para obter mais informações, consulte Definir granularidade para dados de séries temporais.

Por exemplo, com uma granularidade de seconds, o MongoDB armazena 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 recebidos 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 medidas mais finas para mais amplas, como estender a cobertura do bucket de minutos/hora. Isso atualiza a definição de visualização da coleção, mas não altera a forma como os dados são armazenados nos buckets existentes.

Como valores metaField devem corresponder exatamente aos documentos de grupo, o número de buckets em uma coleção de séries temporais depende do número de valores metaField exclusivos. Coleções com valores de metaField refinados ou variáveis geram muitos buckets compactados e de curta duração. Isso leva à redução da eficiência de armazenamento e consulta.

Por exemplo, no documento a seguir, metadata é uma boa opção de metaField pois facilita a query 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 bucket é um cache de memória especializado no 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 de tempo 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 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 alguma 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 e 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 encerra 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 do documento de entrada que está fora dos limites do bucket. Esses limites são determinados pela configuração de granularidade da coleção.

  • O bucket alcançou 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 125KiB).

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

      Esse é um limite interno definido que otimiza o desempenho quando os dados consistem em menos documentos maiores.

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

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

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

  • mongod reinicia. Isso fecha todos os buckets.

O MongoDB elimina um bucket quando:

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

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

Voltar

Séries temporais