Sobre dados de séries temporais
Nesta página
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.
Propriedades dos dados de série temporal
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.
Em coleções de séries temporais, os documentos não exigem um campo _id exclusivo porque o MongoDB não cria um índice no
_id
campo.
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
Comparação de coleções de séries temporais com coleções regulares
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.
Como o bucketing funciona
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 ummetaField
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âmetrosgranularity
,bucketMaxSpanSeconds
ebucketRoundingSeconds
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 o metaField afeta o bucket
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 Bucket
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.
Criação
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.
Fechamento
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.
Exclusão
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
oudb.collection.deleteMany()
exclui o último documento no bucket.