Todos os produtos
Search
Central de documentação

ApsaraDB for MongoDB:Problemas de desempenho causados por excesso de bancos de dados e coleções

Última atualização: Jun 26, 2026

Um número excessivo de bancos de dados e coleções na sua instância MongoDB pode degradar o desempenho do banco e causar outros problemas.

Os termos banco de dados e tabela, comuns em bancos de dados tradicionais, correspondem respectivamente a database e collection no MongoDB.

No MongoDB, o mecanismo de armazenamento WiredTiger cria um arquivo em disco correspondente para cada coleção. Cada índice também gera um novo arquivo em disco. Para cada recurso aberto, como um objeto do sistema de arquivos, o mecanismo WiredTiger mantém uma estrutura de dados dhandle. Essa estrutura armazena informações como detalhes de checkpoint, contadores de referência de sessão, ponteiros para estruturas B+ tree em memória e dados estatísticos.

Portanto, quanto mais bancos de dados e coleções uma instância MongoDB possui, mais objetos do sistema de arquivos o mecanismo WiredTiger precisa manter abertos. Isso aumenta o número de estruturas de dados dhandle em memória. Quando uma grande quantidade dessas estruturas dhandle é mantida em memória, pode ocorrer contenção de locks, o que degrada o desempenho da instância.

Problemas potenciais

  • **Consultas lentas e aumento na latência das requisições devido a handleLock ou schemaLock.**

    O excesso de bancos de dados e coleções pode causar consultas lentas, gerando logs semelhantes ao exemplo abaixo:

    2024-03-07T15:59:16.856+0800 I  COMMAND  [conn4175155] command db.collections command: count { count: "xxxxxx", query: { A: 1, B: 1 }, 
    $readPreference: { mode: "secondaryPreferred" }, $db: "db" } planSummary: COLLSCAN keysExamined:0 keysExaminedBySizeInBytes:0 
    docsExamined:1 docsExaminedBySizeInBytes:208 numYields:1 queryHash:916BD9E3 planCacheKey:916BD9E3 reslen:185 
    locks:{ ReplicationStateTransition: { acquireCount: { w: 2 } }, Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 2 } }, 
    Collection: { acquireCount: { r: 2 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 304, timeReadingMicros: 4 }, 
    timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268ms

    O log de consulta lenta acima mostra que uma operação simples de contagem em uma coleção com apenas um documento teve um tempo de execução longo. O trecho timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268ms do log indica que a requisição de leitura gastou muito tempo esperando para adquirir os locks handleLock e schemaLock do mecanismo de armazenamento subjacente, devido ao grande número de coleções.

  • Erros de falta de memória (OOM) durante a fase inicial de sincronização ao adicionar um novo nó.

  • Aumento no tempo de inicialização da instância.

  • Maior tempo de sincronização de dados.

  • Processos de backup e restauração de dados mais demorados.

  • Taxa de falha elevada em backups físicos.

  • Recuperação de falhas mais lenta.

Nota

Ter muitos bancos de dados e coleções não causa problemas necessariamente. O impacto real depende de fatores como o modelo de dados da aplicação e a carga de trabalho. Considere, por exemplo, dois cenários onde bancos de dados da mesma especificação possuem 10.000 coleções e 100.000 arquivos no total. Os desafios enfrentados são completamente diferentes:

  • Sistema de software contábil: Os padrões de acesso são altamente concentrados. A maioria das coleções serve para armazenamento de dados frios, e apenas um subconjunto pequeno e recente é acessado frequentemente.

  • Sistema de gerenciamento multitenant: Os tenants são isolados usando coleções separadas, e quase todas as coleções são acessadas ou utilizadas ativamente.

Métodos de otimização

Remover coleções desnecessárias

Identifique coleções no banco de dados que podem ser excluídas, como aquelas expiradas ou que não estão mais em uso. Utilize o comando dropCollection para removê-las. Para mais informações, consulte dropCollection().

Aviso

Antes de executar qualquer operação de exclusão, garanta que você tenha um backup completo disponível.

Utilize os seguintes comandos para visualizar informações sobre bancos de dados e coleções:

  • Execute o comando abaixo para ver a quantidade de coleções em um banco de dados.

    db.getSiblingDB(<dbName>).getCollectionNames().length
  • Execute este comando para obter informações detalhadas sobre um banco de dados, incluindo o número de coleções, índices e documentos, além do tamanho total dos dados.

    // View statistics for a specific database.
    db.getSiblingDB(<dbName>).stats()
  • Use o comando a seguir para ver detalhes específicos de uma coleção.

    // View statistics for a specific collection.
    db.getSiblingDB(<dbName>).<collectionName>.stats()

Remover índices desnecessários

Reduzir a quantidade de índices diminui também o número de arquivos em disco e as estruturas dhandle correspondentes mantidas pelo mecanismo de armazenamento WiredTiger, ajudando a mitigar esse problema.

Siga estes princípios básicos para otimização de índices:

  • Evite índices não utilizados

    Se uma consulta nunca acessa um campo específico, qualquer índice nesse campo não será usado. Tais índices são considerados inutilizados e podem ser removidos.

  • Respeite as regras de prefixo de índice

    Por exemplo, se você tiver os índices {a:1} e {a:1,b:1}, o primeiro é um prefixo redundante do segundo e pode ser removido.

  • Considere a ordem dos campos do índice para consultas de igualdade

    Para correspondências de igualdade, a ordem dos campos em um índice composto não importa. Por exemplo, para consultas nos campos a e b, os índices {a:1,b:1} e {b:1,a:1} são funcionalmente equivalentes. Você pode remover aquele que é usado com menos frequência.

  • Use a regra ESR para consultas de intervalo

    Para criar um índice composto ideal para suas consultas, organize os campos na ordem de Equality, Sort, Range. Para mais informações, consulte The ESR (Equality, Sort, Range) Rule.

  • Revise índices com baixa contagem de acertos

    Um índice com poucos acertos geralmente se sobrepõe a um índice mais eficiente. Analise todos os padrões de consulta relevantes para determinar se é seguro removê-lo.

É possível usar o estágio de agregação $indexStats do MongoDB para visualizar estatísticas de todos os índices em uma coleção. Certifique-se de ter as permissões necessárias antes de executar o comando abaixo.

// View index statistics for a specific collection.
db.getSiblingDB(<dbName>).<collectionName>.aggregate({"$indexStats":{}})

O comando retorna uma saída semelhante ao exemplo a seguir.

{
   "name" : "item_1_quantity_1",
   "key" : { "item" : 1, "quantity" : 1 },
   "host" : "examplehost.local:27018",
   "accesses" : {
      "ops" : NumberLong(1),
      "since" : ISODate("2020-02-10T21:11:23.059Z")
   }
}

A tabela a seguir descreve os parâmetros nas informações retornadas.

Parâmetro

Descrição

name

O nome do índice.

key

Detalhes da chave do índice.

accesses.ops

O número de operações que utilizaram este índice, equivalente à contagem de acertos do índice.

accesses.since

O momento a partir do qual a coleta de estatísticas começou. Este campo e o campo ops são redefinidos quando a instância reinicia ou quando o índice é reconstruído.

Caso observe que um índice tem uma contagem de acertos muito baixa, por exemplo, se accesses.ops for 1, provavelmente trata-se de um índice redundante ou não utilizado que pode ser considerado para exclusão. Se sua instância MongoDB for versão 4.4 ou superior, use o comando hideIndex para ocultar o índice antes de excluí-lo. Isso permite confirmar que não há impacto negativo na sua aplicação por um período, reduzindo o risco da exclusão do índice.

Exemplo

Suponha que você tenha uma coleção de jogadores com a regra: "Sempre que um jogador coletar 20 coins, elas são convertidas em 1 star." Um documento na coleção se parece com isto:

// players collection
{
  "_id": "ObjectId(123)",
  "first_name": "John",
  "last_name": "Doe",
  "coins": 11,
  "stars": 2
}

Atualmente, a coleção possui os cinco índices seguintes, cobrindo todos os campos:

  • _id (índice padrão)

  • { last_name: 1 }

  • { last_name: 1, first_name: 1 }

  • { coins: -1 }

  • { stars: -1 }

A lógica de otimização dos índices é a seguinte:

  • As consultas da aplicação não acessam o campo coins, então { coins: -1 } é um índice não utilizado.

  • De acordo com a regra de prefixo de índice mencionada anteriormente, o índice { last_name: 1, first_name: 1 } cobre o índice { last_name: 1 }. Portanto, você pode remover o índice { last_name: 1 }.

  • Usando o comando $indexStats, você observa que a contagem de acertos para { stars: -1 } é baixa. No entanto, ao final de uma rodada de jogo, a aplicação exige ordenar os jogadores pelo número de stars em ordem decrescente para um ranking. Assim, embora não seja usado frequentemente, o índice { stars: -1 } deve ser mantido para evitar uma varredura completa na coleção.

Após a otimização, restam três índices na coleção:

  • _id

  • { last_name: 1, first_name: 1 }

  • { stars: -1 }

Os benefícios dessa otimização incluem:

  • Redução do espaço de armazenamento.

  • Melhoria no desempenho de escrita.

Se tiver mais dúvidas sobre otimização de índices, abra um ticket para entrar em contato com o suporte técnico da Alibaba Cloud e obter assistência.

Consolidar dados de múltiplas coleções

Consolide dados de várias coleções em uma única coleção para reduzir a contagem total de coleções.

Por exemplo, um banco de dados chamado temperatures armazena dados de temperatura de sensores. Um sensor opera das 10:00 às 22:00, lendo e armazenando dados de temperatura a cada meia hora. Ele guarda os dados de temperatura de cada dia em uma coleção separada, nomeada conforme a data.

Os trechos abaixo mostram dados parciais de duas coleções, temperatures.march-09-2020 e temperatures.march-10-2020.

  • Coleção temperatures.march-09-2020

    {
      "_id": 1,
      "timestamp": "2020-03-09T010:00:00Z",
      "temperature": 29
    }
    {
      "_id": 2,
      "timestamp": "2020-03-09T010:30:00Z",
      "temperature": 30
    }
    ...
    {
      "_id": 25,
      "timestamp": "2020-03-09T022:00:00Z",
      "temperature": 26
    }
  • Coleção temperatures.march-10-2020

    {
      "_id": 1,
      "timestamp": "2020-03-10T010:00:00Z",
      "temperature": 30
    }
    {
      "_id": 2,
      "timestamp": "2020-03-10T010:30:00Z",
      "temperature": 32
    }
    ...
    {
      "_id": 25,
      "timestamp": "2020-03-10T022:00:00Z",
      "temperature": 28
    }
    

Com o tempo, o número de coleções no banco de dados aumenta. Como o MongoDB não impõe um limite rígido para a quantidade de coleções e esse modelo carece de uma política clara de ciclo de vida dos dados, o número de coleções e seus índices correspondentes cresce indefinidamente.

Além do problema do crescimento contínuo do número de coleções, esse modelo de dados dificulta a execução de consultas que abrangem vários dias. Para consultar dados ao longo de vários dias e analisar tendências de temperatura de longo prazo, seria necessário usar consultas $lookup, que têm desempenho inferior comparado a consultas dentro de uma única coleção.

Um modelo de dados melhor consiste em armazenar todas as leituras de temperatura em uma única coleção, com os dados de cada dia armazenados em um único documento. Essa abordagem é um exemplo do Bucket Pattern. O exemplo a seguir mostra o modelo otimizado.

// temperatures.readings
{
  "_id": ISODate("2020-03-09"),
  "readings": [
    {
      "timestamp": "2020-03-09T010:00:00Z",
      "temperature": 29
    },
    {
      "timestamp": "2020-03-09T010:30:00Z",
      "temperature": 30
    },
    ...
    {
      "timestamp": "2020-03-09T022:00:00Z",
      "temperature": 26
    }
  ]
}
{
  "_id": ISODate("2020-03-10"),
  "readings": [
    {
      "timestamp": "2020-03-10T010:00:00Z",
      "temperature": 30
    },
    {
      "timestamp": "2020-03-10T010:30:00Z",
      "temperature": 32
    },
    ...
    {
      "timestamp": "2020-03-10T022:00:00Z",
      "temperature": 28
    }
  ]
}

O modelo otimizado consome muito menos recursos que o modelo original. Não é mais necessário criar índices baseados na hora do dia, e o índice padrão _id na coleção facilita consultas por data. Isso também resolve o problema de um número ilimitado de coleções.

Nota

Para dados de séries temporais, considere também o uso de coleções de séries temporais para resolver esse problema.

O recurso de coleções de séries temporais é suportado apenas no MongoDB 5.0 e versões posteriores.

Dividir a instância

Se não for possível reduzir o número total de bancos de dados e coleções dentro de uma única instância MongoDB, considere uma divisão lógica da instância do banco de dados, juntamente com as alterações correspondentes na sua aplicação.

Você pode abordar isso em dois cenários:

Cenário

Solução de divisão

Considerações

Coleções distribuídas por vários bancos de dados

Se a lógica de negócios entre os bancos de dados não for intimamente relacionada (por exemplo, múltiplas aplicações ou serviços compartilhando uma única instância de banco de dados), use o DTS (Data Transmission Service) para migrar alguns bancos de dados para uma nova instância de conjunto de réplicas ou cluster fragmentado do ApsaraDB for MongoDB. Antes que a migração seja concluída, você também deve dividir a lógica da aplicação e os métodos de acesso adequadamente.

Se a lógica de negócios entre os bancos de dados for intimamente relacionada, consulte a solução de divisão para o cenário de banco de dados único.

  • Ao criar uma tarefa DTS, selecione os Source Objects apropriados.

  • Durante a migração, você pode manter os nomes originais dos bancos de dados e coleções ou alterá-los.

  • Após concluir a migração, exclua os bancos de dados correspondentes da instância de origem usando o comando dropDatabase.

Coleções concentradas em um único banco de dados

Sua equipe de negócios deve primeiro determinar se todas as coleções podem ser divididas com base em uma dimensão específica, como região, cidade, prioridade ou qualquer outro atributo de negócio relevante.

Em seguida, use o DTS para migrar algumas coleções para uma ou mais novas instâncias MongoDB, dividindo efetivamente uma instância em N instâncias. Antes que a migração seja concluída, você deve dividir a lógica da aplicação e os métodos de acesso adequadamente.

  • Ao criar uma tarefa DTS, selecione os Source Objects apropriados.

  • Durante a migração, você pode manter os nomes originais das coleções ou alterá-los.

  • Após concluir a migração, exclua as coleções correspondentes da instância de origem usando o comando drop.

  • Após a divisão, será necessária lógica adicional na aplicação para lidar com consultas agregadas entre instâncias.

Exemplo

Uma plataforma de gerenciamento multitenant utiliza um banco de dados MongoDB. No modelo de dados inicial, cada tenant tinha uma coleção separada. Conforme o negócio cresceu, o número de tenants ultrapassou cem mil, e o tamanho total do banco de dados atingiu o nível de terabytes. A instância frequentemente apresentava acesso lento ao banco de dados e alta latência.

A equipe de negócios decidiu dividir os tenants por região geográfica, separando os tenants domésticos em Norte, Nordeste, Leste, Centro, Sul, Sudoeste e Noroeste da China. Eles criaram novas instâncias MongoDB nas zonas de disponibilidade correspondentes a cada região e realizaram múltiplas rodadas de migração usando o DTS. Para atender à necessidade de análise agregada do negócio, eles também configuraram a sincronização das instâncias MongoDB para um data warehouse.

A divisão reduziu significativamente o número de bancos de dados e coleções em cada instância MongoDB, permitindo que a equipe reduzisse as especificações das instâncias consequentemente. Ao adotar um princípio de acesso pela região mais próxima, a aplicação reduziu a latência das requisições para o nível de milissegundos, melhorando muito a experiência do produto. A manutenção subsequente das instâncias também se tornou muito mais simples.

Migrar para um cluster fragmentado com shard tags

Se todas as suas coleções estiverem em um único banco de dados e você quiser gerenciá-las como uma única instância lógica, considere migrar seus dados para uma arquitetura de cluster fragmentado e usar shard tags para gerenciamento. O método de gerenciamento por shard tag é um pouco mais complexo e requer etapas operacionais extras (usando sh.addShardTag e sh.addTagRange). No entanto, uma única instância MongoDB ainda gerencia todas as coleções, exigindo mudanças mínimas na sua aplicação. Você só precisa substituir a string de conexão pela da nova instância de cluster fragmentado.

Por exemplo, se sua instância tem 100.000 coleções ativas, você pode adquirir uma nova instância de cluster fragmentado com 10 shards. Siga o processo abaixo para configurar a instância e migrar os dados, o que resultará em 10.000 coleções ativas por shard. O procedimento é o seguinte:

  1. Adquira uma nova instância de cluster fragmentado. Este exemplo usa uma instância com 2 shards. Para instruções sobre como criar um cluster fragmentado, consulte Criar uma instância de cluster fragmentado.

  2. Conecte-se ao nó mongos da instância de cluster fragmentado. Para mais informações, consulte Conectar-se a uma instância de cluster fragmentado do ApsaraDB for MongoDB usando o mongo shell.

  3. Execute os comandos abaixo para adicionar uma shard tag a cada shard.

    sh.addShardTag("d-xxxxxxxxx1", "shard_tag1")
    sh.addShardTag("d-xxxxxxxxx2", "shard_tag2")
    Nota
    • Antes de executar esses comandos, certifique-se de que a conta em uso tenha as permissões necessárias.

    • O DMS (Data Management) atualmente não suporta o comando sh.addShardTag. Recomendamos conectar-se à instância com o mongo shell ou mongosh para executar esses comandos.

  4. Pré-configurar as regras de distribuição de intervalo baseadas em tags para todas as coleções fragmentadas.

    use <dbName>
    sh.enableSharding("<dbName>")
    sh.addTagRange("<dbName>.test", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag1")
    sh.addTagRange("<dbName>.test1", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag2")

    Este exemplo usa _id como chave de fragmentação. Escolha uma chave de fragmentação adequada à sua carga de trabalho e garanta que todas as operações de consulta incluam o campo da chave de fragmentação. A chave de fragmentação deve ser consistente com o campo usado na próxima etapa. Você também deve usar os limites [MinKey,MaxKey] para garantir que todos os dados de uma única coleção residam em um único shard.

  5. Executar a operação shardCollection para todas as coleções a serem migradas.

    sh.shardCollection("<dbName>.test", {"_id":1})
    sh.shardCollection("<dbName>.test1", {"_id":1})
  6. Execute o comando sh.status() para confirmar que as regras estão em vigor.

    zhongli.test
            shard key: { "_id" : 1 }
            unique: false
            balancing: true
            chunks:
                    d-xxx	1
            { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0)
             tag: shard_tag1  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } }
    zhongli.test1
            shard key: { "_id" : 1 }
            unique: false
            balancing: true
            chunks:
                    d-xxx	1
            { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0)
             tag: shard_tag2  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } }
  7. Migrar dados de uma instância de conjunto de réplicas para uma instância de cluster fragmentado.

    Nota

    Como você já pré-fragmentou as coleções na instância de destino, todas as informações de bancos de dados e coleções já existem. Portanto, você deve definir o Processing Mode of Conflicting Tables como Ignore Errors and Proceed na sua tarefa DTS.

  8. Após verificar a consistência dos dados, altere suas aplicações para acessar a nova instância de cluster fragmentado.

Nota
  • Se precisar adicionar mais shards à instância, você deve repetir a Etapa 3 para adicionar tags a todos os novos shards.

  • Se novas coleções forem adicionadas continuamente ao banco de dados, você deve repetir as Etapas 4 e 5 para elas. Caso não execute essas etapas, as novas coleções serão criadas apenas no shard primário, fazendo com que o número de coleções nesse shard aumente e potencialmente levando à instabilidade de desempenho novamente.

Migrar para um cluster fragmentado com zonas

Este método é semelhante ao uso de shard tags, mas utiliza o recurso Zones do MongoDB. Requer etapas operacionais extras, especificamente sh.addShardToZone() e sh.updateZoneKeyRange().

O procedimento é o seguinte:

  1. Adquira uma nova instância de cluster fragmentado. Este exemplo usa uma instância com 2 shards. Para instruções sobre como criar um cluster fragmentado, consulte Criar uma instância de cluster fragmentado.

  2. Conecte-se ao nó mongos da instância de cluster fragmentado. Para mais informações, consulte Conectar-se a uma instância de cluster fragmentado do ApsaraDB for MongoDB usando o mongo shell.

  3. Execute os comandos abaixo para atribuir cada shard a uma zona.

    sh.addShardToZone("d-xxxxxxxxx1", "ZoneA")
    sh.addShardToZone("d-xxxxxxxxx2", "ZoneB")
    Nota
    • Antes de executar esses comandos, certifique-se de que a conta em uso tenha as permissões necessárias.

    • O DMS atualmente não suporta o comando sh.addShardToZone. Recomendamos conectar-se à instância com o mongo shell ou mongosh para executar esses comandos.

  4. Pré-configurar as regras de distribuição de intervalo baseadas em zonas para todas as coleções.

    use <dbName>
    sh.enableSharding("<dbName>")
    sh.updateZoneKeyRange("<dbName>.test", { "_id": MinKey }, { "_id": MaxKey }, "ZoneA")
    sh.updateZoneKeyRange("<dbName>.test1", { "_id": MinKey }, { "_id": MaxKey }, "ZoneB")

    Este exemplo usa _id como chave de fragmentação. Escolha uma chave de fragmentação adequada à sua carga de trabalho e garanta que todas as operações de consulta incluam o campo da chave de fragmentação. A chave de fragmentação deve ser consistente com o campo usado na próxima etapa. Você também deve usar os limites [MinKey,MaxKey] para garantir que todos os dados de uma única coleção residam em um único shard.

  5. Executar a operação shardCollection para todas as coleções a serem migradas.

    sh.shardCollection("<dbName>.test", { "_id": 1 })
    sh.shardCollection("<dbName>.test1", { "_id": 1 })
  6. Execute o comando sh.status() para visualizar a distribuição da fragmentação e confirmar que a configuração de zona está em vigor. A saída de exemplo é a seguinte:

    {  "_id" : "shardDistributionDB",  "primary" : "d-xxx24",  "partitioned" : false,  "version" : {  "uuid" : UUID("1dc635xxx"),  "lastMod" : 1 } }
            shardDistributionDB.test
                    shard key: { "_id" : "hashed" }
                    unique: false
                    balancing: true
                    chunks:
                            d-2ze9797089ef3704      1
                    { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx04 Timestamp(1, 0)
                     tag: ZoneA  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } }
            shardDistributionDB.test1
                    shard key: { "_id" : "hashed" }
                    unique: false
                    balancing: true
                    chunks:
                            d-2zed2e752c35af24      1
                    { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx24 Timestamp(1, 0)
                     tag: ZoneB  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } }
  7. Migrar dados de uma instância de conjunto de réplicas para uma instância de cluster fragmentado.

    Nota

    Como você já pré-fragmentou as coleções na instância de destino, todas as informações de bancos de dados e coleções já existem. Portanto, você deve definir o Processing Mode of Conflicting Tables como Ignore Errors and Proceed na sua tarefa DTS.

  8. Após verificar a consistência dos dados, altere suas aplicações para acessar a nova instância de cluster fragmentado.

Nota
  • Se precisar adicionar mais shards à instância, você deve repetir a Etapa 3 para atribuir zonas a todos os novos shards.

  • Se novas coleções forem adicionadas continuamente ao banco de dados, você deve repetir as Etapas 4 e 5 para elas. Caso não execute essas etapas, as novas coleções serão criadas apenas no shard primário, fazendo com que o número de coleções nesse shard aumente e potencialmente levando à instabilidade de desempenho novamente.

Aviso de risco

Recomendamos fortemente não usar o comando dropDatabase para excluir diretamente um banco de dados que contenha um grande número de coleções.

Após executar o comando dropDatabase, o mecanismo WiredTiger realiza uma operação de limpeza assíncrona, removendo sequencialmente os metadados e arquivos físicos de todas as coleções marcadas para exclusão. Essa operação pode interferir na replicação nos nós secundários, causando aumento na latência de replicação. Isso, por sua vez, pode acionar o mecanismo de controle de fluxo ou afetar todas as operações de escrita que usam {writeConcern:majority}.

Considere as seguintes abordagens para mitigar esse risco:

  • Exclua coleções em lotes com um intervalo razoável entre eles. Após todas as coleções serem excluídas, execute o comando final dropDatabase.

  • Use o DTS ou outras ferramentas de migração para mover os bancos de dados e coleções que deseja manter para uma nova instância. Após concluir a migração e o cutover, exclua a instância antiga.

Em todos os casos, configure alertas apropriados de latência de replicação para sua instância. Se sua instância encontrar esse problema, abra um ticket para obter assistência técnica.

Resumo

  • Como regra geral, tente manter o número total de coleções dentro de um único conjunto de réplicas abaixo de 10.000. Esse número deve ser menor se coleções individuais tiverem muitos índices (por exemplo, mais de 15).

  • Se os requisitos da sua aplicação demandarem um grande número de coleções, como em um sistema multitenant que usa isolamento baseado em coleções, considere dividir a lógica da sua aplicação e usar instâncias de cluster fragmentado.

  • Caso seu banco de dados já esteja afetado pelo excesso de coleções e você não saiba como modificar o modelo de dados da sua aplicação, abra um ticket para entrar em contato com o suporte técnico e obter assistência.

Documentos relacionados