O ApsaraDB for MongoDB 8.3 introduz comandos granulares para remoção de shard, registro de consultas lentas em andamento, rastreamento de memória por operação e novas expressões de agregação.
Para consultar o changelog da comunidade, veja MongoDB 8.3 release notes.
Visão geral
O ApsaraDB for MongoDB 8.3 inclui as seguintes alterações:
-
Novos recursos
-
Otimizações
Para acessar o changelog completo da comunidade, consulte MongoDB 8.3 release notes.
Melhorias na agregação
Acesso ao índice de array
As operações $map, $filter e $reduce agora expõem o índice do elemento atual. Vincule-o a uma variável com arrayIndexAs ou use a variável integrada $$IDX.
// Add a 1-based "rank" field to each element
db.scores.aggregate([
{ $project: {
ranked: { $map: {
input: "$items",
as: "item",
arrayIndexAs: "i",
in: { value: "$$item", rank: { $add: ["$$i", 1] } }
}}
}}
])
Novas expressões
|
Expressão |
Finalidade |
Exemplo de uso |
|
$subtype |
Retorna o subtipo BinData |
Diferenciar UUID de campos binários genéricos |
|
$createObjectId |
Gera um ObjectId aleatório no pipeline |
Atribuir IDs durante $merge ou $out sem ida e volta ao cliente |
|
$hash / $hexHash |
Produz hashes MD5, SHA-256 ou XXH64 |
Calcular fingerprints de conteúdo ou chaves de partição no servidor |
|
$serializeEJSON / $deserializeEJSON |
Converte entre BSON e Extended JSON |
Converter strings JSON armazenadas como campos de texto de volta para BSON tipado |
Conversões de tipo ampliadas
$toString agora processa objetos, arrays, expressões regulares, MaxKey, MinKey e timestamps.
$convert adicionou um parâmetro base para conversões de string/número nas bases 2, 8, 10 e 16.
Novas conversões $toArray (string para array, binData para array numérico) e $toObject (string para objeto). Consulte Convert binData to Array.
Revisão do gerenciamento de shard
Remoção granular de shard
removeShard foi descontinuado. Quatro novos comandos dividem a remoção de shard em etapas discretas e reversíveis:
Pause e retome a drenagem a qualquer momento. Esse recurso é útil durante janelas de manutenção ou picos de carga inesperados.
Requisito de roteamento de DDL
Operações DDL e applyOps devem passar pelo mongos. A execução direta em um nó de shard não é mais permitida. Essa mudança evita inconsistências de metadados em clusters com sharding.
Melhorias em monitoramento e diagnóstico
Registro de consultas lentas em andamento
Consultas lentas agora são registradas durante a execução, não apenas após a conclusão. Cada consulta é registrada uma vez ao ultrapassar o limiar definido.
Defina o limiar com --defaultSlowInProgMS na inicialização ou em tempo de execução:
db.setProfilingLevel(1, { slowms: 100, slowinprogms: 3000 })
Cada entrada de log inclui um originalQueryShapeHash que vincula o log no nível do shard à solicitação original no mongos.
Rastreamento de memória por operação
Dois novos campos aparecem em $currentOp, db.currentOp(), profiler, logs de consultas lentas, saída do explain e PlanCache.list():
|
Campo |
Descrição |
|
inUseTrackedMemBytes |
Memória atual consumida pela operação |
|
peakTrackedMemBytes |
Pico de memória consumido pela operação |
Use esses campos para identificar consultas que consomem muita memória e definir limites adequados.
queryStats em servidores de shard
Quando queryStats está ativado, os servidores de shard incluem consultas encaminhadas pelo mongos. Em versões anteriores, essas consultas eram invisíveis no nível do shard.
Saída seletiva do serverStatus
Novas métricas abrangem extensões de agregação, seções críticas de shard, operações TTL, busca vetorial, latência do fetcher de oplog de replicação e admissão na fila de execução.
Use a nova flag none: 1 para suprimir todas as seções opcionais e ativar apenas as desejadas:
db.runCommand({ serverStatus: 1, none: 1, locks: 1 })
Use lockContentionMetrics: 1 para incluir dados de contenção de bloqueio sob demanda.
O campo service foi removido da saída do serverStatus.
Aumento de retenção do FTDC
O limite padrão do diretório de diagnóstico FTDC aumentou de 200 MB para 500 MB. O connPoolStats agora é coletado para o mongod.
Desempenho e parâmetros do sistema
Limites de recursos pré-autenticação
Três novos parâmetros limitam os recursos consumidos por conexões não autenticadas:
|
Parâmetro |
Finalidade |
|
capMemoryConsumptionForPreAuthBuffers |
Limita a memória total para buffers de pré-autenticação |
|
messageSizeErrorRateSec |
Limita a taxa de respostas de erro de tamanho de mensagem |
|
preAuthMaximumMessageSizeBytes |
Defina o tamanho máximo do corpo da mensagem antes da autenticação |
Essas configurações protegem as instâncias contra exaustão de recursos causada por ataques de inundação de conexões.
Recuperação automática de pressão de cache
cachePressureQueryPeriodMilliseconds controla a frequência com que o mecanismo de armazenamento verifica a pressão do cache. Ao detectar pressão, o sistema aborta automaticamente as transações mais antigas para liberar espaço no cache.
Seleção de servidor consciente de sobrecarga
Quando overloadAwareServerSelectionEnabled está ativado, um cliente que recebe SystemOverloadedError tenta novamente automaticamente em um nó diferente.
Cinco parâmetros ajustam o backoff de nova tentativa para conexões internas de mongos para mongod:
|
Parâmetro |
Controle |
|
defaultClientBaseBackoffMillis |
Atraso inicial de nova tentativa |
|
defaultClientMaxBackoffMillis |
Atraso máximo de nova tentativa |
|
defaultClientRetryAttempts |
Contagem máxima de novas tentativas |
|
shardRetryTokenBucketCapacity |
Tamanho do pool de tokens de nova tentativa por sobrecarga por shard |
|
shardRetryTokenReturnRate |
Taxa de retorno de tokens em solicitações bem-sucedidas |
Isenções de limite de taxa de entrada
ingressRequestRateLimiterApplicationExemptions isenta aplicações específicas (por appName) dos limites de taxa de entrada. Defina o nome da aplicação na string de conexão:
mongodb://server:27017/db?appname=mongodump
Controle de impacto do profiler
Dois parâmetros impedem que o profiler degrade o desempenho em produção:
|
Parâmetro |
Finalidade |
|
internalQueryGlobalProfilingLockDeadlineMs |
Timeout global para o bloqueio de profiling |
|
internalProfilingMaxAbandonedWritesPerSecondPerDb |
Limite de gravações abandonadas do profiler por banco de dados por segundo |
Monitore a sobrecarga do profiler com profiler.totalAbandonedWrites e profiler.dbsPastThreshold no serverStatus.
Alterações em índices
Atualização da versão padrão do 2dsphere
A 2dsphereVersion padrão passou de 3 para 4.
Antes de fazer downgrade do FCV para uma versão inferior a 8.3, remova todos os índices 2dsphere versão 4.
Prioridade do GeoJSON na geração de índices
Quando um documento contém tanto GeoJSON quanto coordenadas numéricas legadas, a geração de índices prioriza o GeoJSON. Se você depende de coordenadas legadas em índices existentes, reconstrua esses índices após a atualização.
Alterações em séries temporais
|
Alteração |
Detalhe |
|
Restrição de chave de shard |
refineCollectionShardKey em coleções de séries temporais agora exige que a chave de shard referencie campos lógicos de metadados e de tempo. Chaves no formato de bucket não são mais aceitas. |
|
Nomenclatura de índices |
Índices de séries temporais não podem mais ser nomeados como _id_, e _id_ não pode ser usado como hint. |
|
Nomenclatura de timeField |
Um nome de timeField não pode mais começar com $. |
Alterações de comportamento
|
Área |
Alteração |
Comportamento anterior |
|
Códigos de erro de upsert |
Upserts que geram objetos BSON > 16 MB retornam o código de erro 10334 (BSONObjectTooLarge) |
Retornava 17419 ou 17420 |
|
validate |
validate verifica documentos que excedem 16 MB. validate(full=true) não ativa mais checkBSONConformance automaticamente. |
Sem verificação de 16 MB; validação completa ativava conformidade BSON |
|
Aritmética de datas |
$dateAdd / $dateSubtract com unidades diferentes de milissegundos e datas pré-epoch podem retornar resultados um segundo mais lentos |
Mais rápido, porém menos preciso |
|
Parsing de float |
Agora é possível analisar toda a faixa de floats de precisão dupla (incluindo subnormais como 7,08263e-317) |
Subnormais rejeitados |
|
Limite de caracteres de $trim |
O argumento chars de $trim, $ltrim e $rtrim tem limite de 4.096 caracteres |
Sem limite |
|
$mergeObjects |
Agora pode ser usado dentro de $setWindowFields |
Não suportado |
|
Memória TextOr |
O estágio TextOr (pontuação $text) tem limite de 100 MB; faz spill para disco quando allowDiskUse é true |
Sem limite |
|
explain em banco inexistente |
explain() em um banco de dados inexistente em um cluster com sharding não cria mais o banco implicitamente |
Banco criado implicitamente |
|
config.csrs.indexes |
A coleção de sistema config.csrs.indexes foi removida |
Presente |
|
findShardsOnConfigTimeoutMS |
Novo parâmetro que limita o tempo de consulta em config.shards |
Sem timeout |