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

Construções de índice em coleções preenchidas

Nesta página

  • Comportamento
  • Impacto de Construções de Índices no Desempenho do Banco de Dados
  • Construções dos Índices em Ambientes Replicados
  • Falha e Recuperação de Construções
  • Monitorar Construções de Índices em Andamento
  • Encerrar Construções de Índices em Andamento
  • Processo de Construção de Índices

As compilações de índices usam um processo de compilação otimizado que mantém um bloqueio exclusivo na coleção no início e no final da compilação do índice O restante do processo de criação resulta em operações intercaladas de leitura e gravação. Para obter uma descrição detalhada do processo de criação de índice e do comportamento de bloqueio, consulte Processo de criação de índice.

O índice se baseia em um conjunto de réplicas ou em um cluster fragmentado simultaneamente em todos os membros do conjunto de réplicas com suporte de dados. O primary requer um número mínimo de membros votantes portadores de dados (ou seja, quorum para a confirmação), incluindo ele mesmo, que deve concluir a construção antes de marcar o índice como pronto para uso. Um membro "votante" é qualquer membro do conjunto de réplicas em que members[n].votes é maior que 0. Consulte Construção de índice em ambientes replicados para obter mais informações.

Observação

Para obter informações sobre como criar índices no Atlas, consulte a página de gerenciamento de índice na documentação do Atlas .

As versões anteriores do MongoDB suportavam a construção de índices em primeiro plano ou em segundo plano. As compilações de índice em primeiro plano eram rápidas e produziam estruturas de dados de índice mais eficientes, mas exigiam o bloqueio de todo o acesso de leitura-gravação ao banco de dados pai da coleção que estava sendo indexada durante a compilação. As compilações de índices em segundo plano foram mais lentas e tiveram resultados menos eficientes, mas permitiram acesso de leitura e gravação ao banco de dados e suas coleções durante o processo de construção.

As compilações de índice agora obtêm um bloqueio exclusivo somente na coleção que está sendo indexada durante o início e o fim do processo de compilação para proteger as alterações de metadados. O restante do processo de compilação usa o comportamento de produção de compilações de índices em segundo plano para maximizar o acesso de leitura e gravação à coleção durante a compilação. As criações de índices ainda produzem estruturas de dados de índices eficientes, apesar do comportamento de bloqueio mais permissivo.

O desempenho otimizado da construção de índice está pelo menos no mesmo nível das construções de índice em segundo plano. Para volumes de trabalho com poucas ou nenhuma atualização recebida durante o processo de construção, as compilações de índice otimizadas podem ser tão rápidas quanto uma compilação de índice de primeiro plano nesses mesmos dados.

Use db.currentOp() para monitorar o progresso das construções de índice em andamento.

O MongoDB ignora a opção de construção do índice background se especificada para createIndexes ou seus ajudantes de shellcreateIndex()ecreateIndexes().

Para índices que impõem restrições à coleção, como índices exclusivos, o mongod verifica todos os documentos pré-existentes e escritos simultaneamente em busca de violações dessas restrições após a conclusão da criação do índice. Documentos que violam as restrições do índice podem existir durante a construção do índice. Se algum documento violar as restrições de índice no fim da compilação, o mongod encerrará a compilação e gerará um erro.

Por exemplo, considere uma coleção preenchida inventory. Um administrador deseja criar um índice único no campo product_sku. Se algum documento na coleção tiver valores duplicados para product_sku, a construção do índice ainda poderá ser iniciada com êxito. Se alguma violação ainda existir no fim da construção, o mongod encerrará a construção e gerará um erro.

Da mesma forma, um aplicativo pode gravar documentos com êxito na coleção inventory com valores duplicados de product_sku enquanto a compilação do índice está em andamento. Se ainda houver alguma violação no fim da construção, o mongod encerrará a construção e vai gerar um erro.

Para reduzir o risco de falha nas construções de índices devido a violações de restrições:

  • Valide que nenhum documento na coleção viola as restrições de índices.

  • Pare todas as gravações na coleção de aplicativos que não podem garantir operações de gravação sem violação.

Para uma coleção fragmentada distribuída em vários fragmentos, um ou mais fragmentos podem conter um bloco com documentos duplicados. Dessa forma, a operação de criação de índice pode ser bem-sucedida em alguns fragmentos (ou seja, aqueles sem duplicatas), mas não em outros (ou seja, aqueles com duplicatas). Para evitar deixar índices inconsistentes nos fragmentos, você pode emitir o db.collection.dropIndex() de um mongos para remover o índice da coleção.

Para mitigar o risco dessa ocorrência, antes de criar o índice:

  • Valide que nenhum documento na coleção viola as restrições de índices.

  • Pare todas as gravações na coleção de aplicativos que não podem garantir operações de gravação sem violação.

Dica

Veja também:

Por padrão, o servidor permite até três compilações de índice simultâneas. Para alterar o número de compilações de índice simultâneas permitidas, modifique o parâmetro maxNumActiveUserIndexBuilds.

Se o número de construções de índices simultâneas atingir o limite especificado por maxNumActiveUserIndexBuilds, o servidor bloqueará construções de índices adicionais até que o número de construções de índices simultâneas caia abaixo do limite.

As construções de índices durante períodos de tempo em que a coleção de destino está sob carga de gravação pesada pode resultar em desempenho de gravação reduzido e construções de índices mais longas.

Considere a possibilidade de designar uma janela de manutenção durante a qual os aplicativos parem ou reduzam as operações de gravação na coleção. Inicie a compilação do índice durante essa janela de manutenção para mitigar o impacto negativo potencial do processo de compilação.

O createIndexes permite criar um ou mais índices em uma coleção. createIndexes usa uma combinação de memória e arquivos temporários no disco para concluir as compilações de índices. O limite padrão de uso de memória para createIndexes é de 200 megabytes, compartilhados entre todos os índices criados usando um único comando createIndexes. Após o limite de memória ser alcançado, o createIndexes utiliza arquivos de disco temporários em um subdiretório denominado _tmp dentro do diretório --dbpath para concluir a compilação.

Você pode substituir o limite de memória configurando o parâmetro do servidor maxIndexBuildMemoryUsageMegabytes. A definição de um limite de memória maior pode resultar na conclusão mais rápida das compilações de índices. No entanto, um limite muito alto em relação à RAM não utilizada no seu sistema pode resultar no esgotamento da memória e no desligamento do servidor.

Se a máquina host tiver RAM livre disponível limitada, talvez seja necessário agendar um período de manutenção para aumentar a RAM total do sistema para poder modificar o uso da RAM mongod.

Observação

Exige featureCompatibilityVersion 4.4+

Cada mongod no conjunto de réplica ou agrupamento fragmentado deve ter featureCompatibilityVersion configurado para pelo menos 4.4 para iniciar construções de índice simultaneamente entre membros do conjunto de réplicas.

Construir índices em um conjunto de réplicas ou cluster particionado é feito simultaneamente em todos os membros do conjunto de réplicas que contêm dados. Para clusters fragmentados, a construção de índices ocorre somente em fragmentos que contêm dados para a coleção que está sendo indexada. O primário requer um número mínimo de membros com dados voting (ou seja, quórum para a confirmação), incluindo ele próprio, que deve concluir a compilação antes de marcar o índice como pronto para uso.

O processo de construção é resumido da seguinte forma:

  1. O primário recebe o comando createIndexes e cria imediatamente uma entrada no oplog "startIndexBuild" associada à construção do índice.

  2. Os secundários iniciam a construção de índices após replicarem a entrada oplog "startIndexBuild".

  3. Cada membro "vota" para confirmar a construção assim que terminar de indexar os dados na coleção.

  4. Os membros secundários continuam a processar quaisquer novas operações de gravação no índice enquanto aguardam que os primários confirmem um quórum de votos.

  5. Quando o primário tem um quórum de votos, ele verifica se há violações de restrições de chaves, como erros de chave duplicadas.

    • Se não houver violações de restrições de chaves, o principal concluirá a construção de índices, marcará o índice como pronto para uso e criará uma entrada oplog "commitIndexBuild" associada.

    • Se houver alguma violação de restrição chave, a construção do índice falhará. A primária cancela a construção do índice e cria uma entrada de oplog "abortIndexBuild" associada.

  6. Os secundários replicam a entrada oplog "commitIndexBuild" e concluem a construção de índices.

    Se, em vez disso, os secundários replicarem uma entrada oplog "abortIndexBuild", eles anularão a construção de índices e descartarão o trabalho de construção.

Para clusters fragmentados, a construção de índices ocorre somente em fragmentos que contêm dados para a coleção que está sendo indexada.

Para obter uma descrição mais detalhada do processo de construção de índice, consulte Processo de construção de índice.

Por padrão, as compilações de índice usam um quorum de confirmação de "votingMembers"ou todos os membros votantes portadores de dados. Para iniciar uma construção de índice com um commit quorum não padrão, especifique o parâmetro commitQuorum para createIndexes ou seus auxiliares de shell db.collection.createIndex() e db.collection.createIndexes().

Para modificar o quorum de confirmação necessário para uma compilação de índice simultânea em andamento, use o comando setIndexCommitQuorum.

Observação

As compilações de índice podem afetar o desempenho do conjunto de réplicas. Para volumes de trabalho que não toleram a diminuição do desempenho devido a compilações de índices, considere a possibilidade de executar um processo de compilação de índice contínuo. As compilações de índice contínuo retiram no máximo um membro do conjunto de réplicas de cada vez, começando pelos membros secundários, e criam o índice nesse membro como autônomo. As compilações de índice contínuo exigem pelo menos uma eleição de conjunto de réplicas.

A partir do MongoDB 5.0, se o mongod primário executar uma limpeza shutdown com "force" : true ou receber um sinal SIGTERM durante a criação de um índice e o commitQuorum estiver definido como o padrão votingMembers, o progresso da criação do índice será salvo no disco. O mongod recupera automaticamente a criação de índices quando é reiniciado e continua a partir do checkpoint salvo. Nas versões anteriores, se a criação de índices for interrompida, ela terá que ser reiniciada desde o início.

A partir do MongoDB 5.0, se um mongod secundário executar uma limpeza shutdown com "force" : true ou receber um sinal SIGTERM durante a criação de um índice e o commitQuorum estiver definido como o padrão votingMembers, o progresso da criação do índice será salvo no disco. O mongod recupera automaticamente a criação de índices quando é reiniciado e continua a partir do checkpoint salvo. Nas versões anteriores, se a criação de índices for interrompida, ela terá que ser reiniciada desde o início.

O mongod pode executar o processo de inicialização enquanto o índice de recuperação é construído.

Se você reiniciar o mongod como autônomo (ou seja, removendo ou comentando replication.replSetName ou omitindo --replSetName), o mongod não pode reiniciar a compilação do índice. A compilação permanece no estado pausado até que seja droppedmanualmente.

Se o mongod for desligado durante a criação de índices, o trabalho de criação de índices e todo o progresso será perdido. Reiniciar o mongod não reinicia a construção do índice. Você deve reemitir a operação createIndex() para reiniciar a compilação do índice.

A partir do MongoDB 5.0, se um nó for revertido para um estado anterior durante a compilação do índice, o progresso da compilação do índice será salvo no disco. Se ainda houver trabalho a ser feito quando a reversão for concluída, o mongod recuperará automaticamente a compilação do índice e continuará a partir do ponto de verificação salvo.

O MongoDB pode pausar uma construção de índice em andamento para realizar uma reversão.

  • Se o rollback não reverter a construção do índice, o MongoDB reiniciará a construção do índice após concluir o rollback.

  • Se o rollback reverter a construção de índices, você deverá recriar o(s) índice(s) após a conclusão do rollback.

Uma collection fragmentada terá um índice inconsistente se a coleção não tiver exatamente os mesmos índices (inclusive as opções de índice) em cada shard que contiver blocos para a coleção. Embora os índices inconsistentes não devam ocorrer durante as operações normais, podem ocorrer, por exemplo:

  • Quando um usuário está criando um índice com uma restrição de chave unique e um fragmento contém um bloco com documentos duplicados. Nesses casos, a operação de criação do índice pode ser bem-sucedida nos fragmentos sem duplicatas, mas não no fragmento com duplicatas.

  • Quando um usuário está criando um índice nos fragmentos de maneira contínua (ou seja, criando manualmente o índice um a um nos fragmentos), mas não consegue criar o índice para um fragmento associado ou cria incorretamente um índice com especificação diferente.

O servidor de configuração primário verifica periodicamente se há inconsistências de índice nos fragmentos das coleções fragmentadas. Para configurar essas verificações periódicas, consulte enableShardedIndexConsistencyCheck e shardedIndexConsistencyCheckIntervalMS.

O comando serverStatus retorna o campo shardedIndexConsistency para relatar inconsistências de índice quando executado no servidor de configuração primário.

Para verificar se uma collection fragmentada tem índices inconsistentes, consulte Localizar índices inconsistentes em shards.

Para ver o status de uma operação de construção de índices, você pode usar o método db.currentOp() no mongosh. Para filtrar as operações atuais para operações de construções de índices, consulte Operações de indexação ativa para obter um exemplo.

O campo msg inclui uma medição da porcentagem completa do estágio atual do processo de criação do índice.

Enquanto um índice está sendo construído, o progresso é escrito no registro do MongoDB. Se uma compilação de índice for interrompida e retomada, haverá mensagens de registro com campos como estes:

"msg":"Index build: wrote resumable state to disk",
"msg":"Found index from unfinished build",

Use o comando dropIndexes ou seus auxiliares de shell dropIndex() ou dropIndexes() para encerrar uma construção de índice em andamento. Consulte Cancelar Construções de Índices em Andamento para obter mais informações.

Não use killOp para encerrar compilações de índice em andamento em conjuntos de réplicas ou clusters fragmentados.

A tabela a seguir descreve cada estágio do processo de construção de índices:

Estágio
Descrição
Bloqueio
O mongod obtém um bloqueio X exclusivo na coleção que está sendo indexada. Isso bloqueia todas as operações de leitura e gravação na coleção, incluindo a aplicação de todas as operações de gravação replicadas ou comandos de metadados destinados à coleção. O mongod não gera esse bloqueio.
Inicialização

O mongod cria três estruturas de dados neste estado inicial:

  • A entrada inicial de metadados do índice.

  • Uma tabela temporária ("tabela de gravações laterais"), que armazena chaves geradas a partir de gravações na coleção que está sendo indexada durante o processo de construção.

  • Uma tabela temporária ("tabela de violações de restrições") para todos os documentos que possam causar um erro de geração de chave. Os erros de geração de chaves ocorrem quando um documento tem chaves inválidas para os campos indexados. Por exemplo, um documento com valores de campo duplicados ao criar um índice índice único ou objetos GeoJSON malformados ao criar um índice 2dsphere.

Bloqueio
O mongod rebaixa o bloqueio de coleção X único para um bloqueio IX de intenção exclusivo. O mongod periodicamente produz esse bloqueio para intercalar operações de leitura e gravação.
Verificar Coleção

Para cada documento na coleção, o mongod gera uma chave para esse documento e transfere a chave para uma classificadora externa.

Se o mongod encontrar um erro de geração de chave ao gerar uma chave durante a verificação da coleção, ele armazenará essa chave na tabela de violações de restrições para processamento posterior.

Se o mongod encontrar qualquer outro erro na geração de uma chave, a construção falhará gerando um erro.

Depois que o mongod concluir a verificação da coleção, ele despejará as chaves classificadas no índice.

Tabela de gravações do lado do processo

O mongod drena a tabela de gravação lateral utilizando a prioridade de primeiro a entrar, primeiro a sair.

Se o mongod encontrar um erro de geração de chave durante o processamento de uma chave na tabela de gravação lateral, armazenará essa chave na tabela de violações de restrições para processamento posterior.

Se o mongod encontrar qualquer outro erro durante o processamento de uma chave, a criação falhará com um erro.

Para cada documento gravado na coleção durante o processo de construção, o mongod gera uma chave para esse documento e a armazena na tabela de gravações laterais para posterior processamento. O mongod utiliza um sistema de snapshot para definir um limite para o número de chaves a serem processadas.

Votar e Aguardar o Quorum para o Commit

Um mongod que não faz parte de um conjunto de réplicas pula este estágio.

O mongod envia um "voto" ao primário para confirmar o índice. Especificamente, ele grava o "voto" em uma coleção interna replicada no primário.

Se o mongod for o primário, aguardará até ter um quórum para a confirmação de votos (todos os membros portadores de dados por padrão) antes de continuar o processo de criação de índices.

Se o mongod for um secundário, ele aguardará até replicar uma entrada oplog "commitIndexBuild" ou "abortIndexBuild":

  • Se o mongod replicar uma entrada de oplog "commitIndexBuild", terminará de drenar a tabela de gravações laterais e passará para o próximo estágio no processo de criação de índices.

  • Se o mongod replicar uma entrada oplog "abortIndexBuild", anulará a criação de índices e descartará o trabalho de construção.

Enquanto aguarda o quórum para a confirmação, o mongod acrescenta todas as chaves adicionais geradas a partir de operações de gravação à coleção que está sendo indexada na tabela de gravações laterais e drena periodicamente a tabela.

Bloqueio
O mongod atualiza o bloqueio de intenção exclusivo IX na coleção para um bloqueio compartilhado do S. Isso bloqueia todas as operações de gravação na coleção, incluindo a aplicação de todas as operações de gravação replicadas ou comandos de metadados destinados à coleção.
Concluir o Processamento da Tabela de Gravações Laterais Temporárias

O mongod continua drenando os registros restantes na tabela de gravações laterais. O mongod pode pausar a replicação durante esse estágio.

Se o mongod encontrar um erro de geração de chave durante o processamento de uma chave na tabela de gravação lateral, armazenará essa chave na tabela de violações de restrições para processamento posterior.

Se o mongod encontrar qualquer outro erro durante o processamento de uma chave, a criação falhará com um erro.

Bloqueio
O mongod atualiza o bloqueio compartilhado do S na coleção para um bloqueio exclusivo do X na coleção. Isso bloqueia todas as operações de leitura e gravação na coleção, incluindo a aplicação de todas as operações de gravação replicadas ou comandos de metadados destinados à coleção O mongod não gera esse bloqueio.
Descartar Tabela de Gravações Laterais

O mongod aplica todas as operações restantes na tabela de gravações laterais antes de descartá-la.

Se o mongod encontrar um erro de geração de chave durante o processamento de uma chave na tabela de gravação lateral, armazenará essa chave na tabela de violações de restrições para processamento posterior.

Se o mongod encontrar qualquer outro erro durante o processamento de uma chave, a criação falhará com um erro.

Neste ponto, o índice inclui todos os dados gravados na coleção.

Tabela de Violações de Restrições do Processo

Se o mongod for o principal, ele drenará a tabela de violações de restrições com a prioridade de primeiro a entrar, primeiro a sair.

  • Se nenhuma chave na tabela de violações de restrições produzir um erro de geração de chave ou se a tabela estiver vazia, o mongod descartará a tabela e criará uma entrada oplog "commitIndexBuild". Os secundários podem concluir a construção do índice associado após replicar a entrada do oplog.

  • Se alguma chave da tabela de violação de restrição ainda produzir um erro de geração de chave, o mongod interromperá a compilação e lançará um erro. O mongod cria uma entrada oplog "abortIndexBuild" associada para indicar que os secundários devem anular e descartar o trabalho de criação de índices.

Se o mongod for um secundário, ele descartará a tabela de violações de restrições. Como o primário deve drenar com êxito a tabela de violações de restrições antes de criar a entrada oplog " CommitopLogEntry ", o secundário pode presumir com segurança que não existem violações.

Marcar o Índice como Pronto

O mongod atualiza os metadados do índice para marcar o índice como pronto para uso.

Bloqueio
O mongod libera o bloqueio X na coleção.

Voltar

Sparse Indexes