Supercarregando Coleções de Séries Temporais: Melhorias Chaves no MongoDB 8.0 com Processamento de Blocos
Avalie esse anúncio
O cenário de dados de séries temporais tem evoluído significativamente nos últimos anos. As empresas estão capturando dados mais granulares, reconhecendo que o valor dos dados aumenta proporcionalmente à sua precisão. Armazenar dados com registro de data e hora e realizar análises temporais está se tornando essencial, até mesmo obrigatório em todos os setores. À medida que os volumes de dados implicitamente aumentam e a análise baseada em precisão se torna cada vez mais crucial, as ferramentas que fornecem maneiras eficientes de trabalhar com dados de séries temporais se tornam ainda mais críticas.
Para atender à crescente demanda por análises de séries temporais, introduzimos as Coleções de séries temporais no MongoDB 5.0, projetadas para atender às necessidades de expansão de dados com registro de data e hora. Ao contrário das soluções ponto que exigem configurações complexas separadas, a Coleção de séries temporais do MongoDB permite que os usuários simplesmente criem uma coleção e aproveitem instantaneamente os recursos de séries temporais. Ao longo do tempo, expandimos seus recursos com recursos como compressão colunar, análise temporal aprimorada, indexação enriquecida, suporte geográfico e integração perfeita com o portfólio mais amplo do MongoDB - criando uma experiência simplificada e amigável ao desenvolvedor.
Em nosso próximo lançamento 8.0, temos o deleite em introduzir novos recursos que melhoram significativamente a escalabilidade e o desempenho de query para gerenciar grandes volumes de trabalho de séries temporais, oferecendo uma relação preço/desempenho ainda melhor para nossos usuários.
À medida que os volumes de dados de séries temporais aumentam, o desafio não é apenas o dimensionamento, mas sim fazê-lo de forma eficiente, equilibrando recursos, custo e desempenho. Com o MongoDB 8.0, estamos introduzindo otimizações importantes em Coleções de séries temporais para ajudar os usuários a maximizar o valor dos recursos enquanto gerenciam volumes de trabalho cada vez mais complexos.
Em versões anteriores, as Coleções de séries temporais inseriam dados em um formato descompactado, causando um conjunto de trabalho maior, maior uso de cache e amplificação de gravação, levando a alta E/S à medida que dados não compactados eram gravados no mecanismo de armazenamento WiredTiger. Isso era especialmente problemático para volumes de trabalho de alta cardinalidade com milhões de dispositivos, sensores, etc. Com o MongoDB 8.0, As coleções de séries temporais agora escrevem diretamente em um formato de coluna comprimida, reduzindo o uso do cache, reduzindo a E/S de escrita, melhorando o desempenho da inserção e a eficiência do armazenamento.
Para os usuários, os benefícios de um menor uso de cache se traduzem diretamente em redução de custos. Os usuários poderão extrair muito mais valor dos recursos de cluster existentes, resultando em uma melhor relação preço/desempenho. Observamos melhorias na taxa de transferência de 2a3x, com o uso do cache reduzido em 10-20x em comparação com as cargas de trabalho na versão 7.0. Por exemplo, a carga de trabalho no MongoDB 7.0 pode sofrer flutuações de desempenho, levando a um desempenho de gravação inconsistente e a um padrão dente de serra causado por sobrecarga de E/S. Gravação de grandes quantidades de dados não compactados em checkpoints sobrecarregados de disco. Como mostrado abaixo, um teste em um 7.0 O cluster Atlas M50 (RAM - 32GB, Armazenamento 160GB, 8 vCPUs) atingiu picos de 500K inserções/s enquanto exibia este padrão:
Com 8.0, o desempenho de gravação agora é estável, eliminando a sobrecarga de E/S. Conforme mostrado abaixo, a mesma carga de trabalho no Atlas M50 atinge 600K inserções/s estáveis, eliminando o padrão dente de serra anterior.
O engajamento do usuário salientou que o desempenho da query é crucial à medida que as cargas de trabalho de séries temporais são dimensionadas. Tradicionalmente, o mecanismo de query MongoDB processa um documento de dados de cada vez, o que pode ser ineficiente para análises de grande escala. Para Coleções de séries temporais, essa ineficiência se deve à necessidade de descompactar e remodelar um grande volume de dados compactados. Para resolver isso, introduzimos o Processamento de Blocos para Coleções de Séries Temporais – um novo modelo de execução automática de queries que processa "blocos de dados" de uma só vez, aproveitando resumos em nível de coluna e evitando a sobrecarga de descompactar e remodelar documentos. Essa abordagem melhora significativamente o desempenho, especialmente para a agregação que aproveita estágios como $match, $sort, $group e outros estágios analíticos como $setWindowFields.
Ao tornar cada etapa mais eficiente, o impacto geral se torna exponencial, reduzindo a sobrecarga e aproveitando padrões de dados de séries temporais anteriormente indisponíveis. Cada estágio de agregação processa blocos de dados maiores, levando a um modelo de execução de consulta mais eficiente com desempenho significativamente mais rápido. Casos de uso como análise financeira e IoT, que envolvem filtragem, agrupamento e classificação intensiva (ou seja, $match, $group, $sort), sofrerão importantes melhorias de desempenho. Com o processamento de blocos, observamos melhorias que variam de 10a40x, com algumas agregações de grande escala atingindo até 100x.
Vamos explorar como o Processamento de blocos pode otimizar agregações financeiros comuns, como gerar OHLC (Open, High, Low, Close) e calcular uma média móvel exponencial durante um período de tempo especificado. Neste exemplo, analisamos uma agregação que notou uma 20melhoria x em um50 conjunto de réplicas do Atlas M usando a bifurcação do TSBS (conjunto de benchmarking de séries temporais) do MongoDB. Usamos o caso de uso financeiro TSBS que gera uma carga de trabalho contendo 10 símbolos de ações, cada um criando um evento por segundo em 7 dias, resultando em aproximadamente 6 milhões de eventos carregados em uma coleção de séries temporais.
Aqui está um documento de amostra para que você possa ver como é isso:
1 { 2 "time" : ISODate("2022-01-01T00:00:00Z"), 3 "tags" : { 4 "symbol" : "MDB" 5 }, 6 "_id" : ObjectId("64c4092a9451cd8064c69be1"), 7 "measurement" : "price", 8 "price" : 200.13171 9 }
Começamos criando uma coleção de séries temporais
market_data
no MongoDB, em que timeField
está definido como tempo e metaField como tags. A granularidade está definida como "segundos" para capturar dados financeiros em um 1intervalo de minutos.1 db.createCollection("market_data", { 2 timeseries: { 3 timeField: "time", 4 metaField: "tags", 5 granularity: "seconds" 6 } 7 }
Criamos dois índices compostos para dar suporte a queries dentro do volume de trabalho:
1 db.market_data.createIndex({ "tags": 1, "time": 1 }); 2 db.market_data.createIndex({ "tags.symbol": 1, "time": -1 });
Em seguida, construímos uma query para gerar a OHLC e a média móvel exponencial para um grupo de símbolos de ações computados a cada 4 horas em uma janela de 1 dias.
1 db.market_data.aggregate([ 2 {"$match": {"$expr": {"$gte": ["$time", {"$dateSubtract": {"startDate": new Date("2022-01-01T03:00:00Z"), "unit": "hour", "amount": 24}}]}}}, 3 {"$sort": {"time": 1}}, 4 {"$group": { 5 "_id": {"symbol": "$tags.symbol", "time": {"$dateTrunc": {"date": "$time", "unit": "minute", "binSize": 240}}}, 6 "high": {"$max": "$price"}, 7 "low": {"$min": "$price"}, 8 "open": {"$first": "$price"}, 9 "close": {"$last": "$price"} 10 }}, 11 {"$setWindowFields": { 12 "partitionBy": "$_id.symbol", 13 "sortBy": {"_id.time": 1}, 14 "output": {"expMovingAverage": {"$expMovingAvg": {"input": "$close", "N": 100}}} 15 }}, 16 {"$sort": {"_id.time": -1}} 17 ]);
1 { 2 "_id": { "symbol": "MDB", "time": ISODate("2022-01-01T02:00:00Z") }, 3 "high": 148.27729312597552, 4 "low": 51.01901106672195, 5 "open": 126.83590008130241, 6 "close": 99.44471233463418, 7 "expMovingAverage": 99.44471233463418 8 }
Em comparação com 7.0, essa query viu suas operações por segundo melhorarem incríveis 2000% ou 20x. Esse aumento drástico reflete nosso compromisso contínuo em ajudar os usuários do MongoDB a lidar com dados complexos de séries temporais com facilidade, e estamos ansiosos para ver o que pode ser alcançado com esses novos aprimoramentos.
Experimente e deixe-nos saber seu feedback!
fornecido por Nishith Atreya eMichael Gargiulo
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.