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.
A construção de índice em um conjunto de réplicas ou cluster fragmentado é simultânea em todos os nós de conjuntos de réplicas portadores de dados. O primário requer um número mínimo de membros votantes portadores de dados (ou seja, quórum para a confirmação), incluindo ele próprio, que deve concluir a construção antes de marcar o índice como pronto para uso. Um nó "votante" é qualquer nó do conjunto de réplicas em que members[n].votes é maior que 0. Consulte Construções de índice em ambientes replicados para 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 .
Comportamento
Comparação de Construções em Foreground e Background
As versões anteriores do MongoDB suportavam a construção de índices em primeiro plano ou em segundo plano. As construçõ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-gravar ao banco de dados pai da coleção que estava sendo indexada durante a compilação. As construções de índice em segundo plano foram mais lentas e produziram resultados menos eficientes, mas permitiram acesso de leitura e gravação ao banco de dados e suas coleções durante a compilação.
As compilações de índice agora obtêm um bloqueio exclusivo na coleção que está sendo indexada apenas no início e no final da compilação. O restante do processo de compilação usa o comportamento de produção de construções de índice em segundo plano para maximizar o acesso de leitura e gravação à coleção durante a compilação. As construções de índice ainda produzem estruturas de dados de índice 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().
Violações de Restrições Durante a Construção de Índices
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 construção de índice está em andamento.
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.
Coleções fragmentadas
Para uma coleção fragmentada distribuída em vários fragmentos, um ou mais fragmentos podem conter uma parte com documentos duplicados. Dessa forma, a operação de criação do índice pode ser bem-sucedida em alguns dos fragmentos (ou seja, naqueles sem duplicatas), mas não em outros (ou seja, nos com duplicatas). Para evitar deixar índices inconsistentes entre fragmentos, você pode emitir o db.collection.dropIndex() de um mongos para descartar 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.
Máximo de Construções de Índices Simultâneas
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.
Impacto de Construções de Índices no Desempenho do Banco de Dados
Construções de Índices Durante Volumes de Trabalho com Uso Intenso de Gravação
As construções de índices quando 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 período de manutenção durante a qual os aplicativos parem ou reduzam as operações de gravação na coleção. Inicie a construção de índices durante esta período de manutenção.
Memória (RAM) Disponível do Sistema Insuficiente
O createIndexes permite criar um ou mais índices em uma collection. createIndexes usa uma combinação de memória e arquivos temporários no disco para criar índices. O limite de memória padrão é de 200 megabytes por comando createIndexes, compartilhados igualmente entre todos os índices construídos nesse comando. Por exemplo, se você construir índices 10 com um comando createIndexes, o MongoDB alocará cada índice 20 megabytes para o processo de construção de índice ao utilizar o limite de memória padrão de 200. Quando você atinge o limite de memória, o MongoDB cria arquivos temporários no subdiretório _tmp dentro de --dbpath para concluir a compilação.
Ajuste o limite de memória com o parâmetro maxIndexBuildMemoryUsageMegabytes. O aumento desse parâmetro só é necessário em casos raros, como quando você executa muitas compilações simultâneas de índice com um único comando createIndexes ou quando indexa um conjunto de dados maior que 500GB.
Cada createIndexes comando tem um limite de maxIndexBuildMemoryUsageMegabytes. Ao usar o maxNumActiveUserIndexBuilds padrão de 3, o uso total de memória para todas as compilações de índice simultâneas pode chegar a até 3 vezes o valor de maxIndexBuildMemoryUsageMegabytes.
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.
Construções dos Índices em Ambientes Replicados
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:
O primário recebe o comando
createIndexese cria imediatamente uma entrada no oplog "startIndexBuild" associada à construção do índice.Os secundários iniciam a construção de índices após replicarem a entrada oplog "startIndexBuild".
Cada membro "vota" para confirmar a construção assim que terminar de indexar os dados na coleção.
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.
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.
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.
Aviso
Evite executar processos de compilação de índice contínuo e replicado simultaneamente, pois isso pode levar a problemas inesperados, como compilações quebradas e loops de falhas.
Observação
As construções de índice contínuo usam 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 construções de índice contínuo exigem pelo menos uma eleição de conjunto de réplicas . Use compilações de índice contínuo somente se você atender aos requisitos listados nas páginas do índice contínuo, pois o procedimento reduz a resiliência do cluster.
Quorum para o Commit Comparado com Write Concern
Existem diferenças importantes entre quóruns de commit e preocupações de gravação:
Construções de índice usam quorum para o commit.
As operações de escritura usam write concerns.
Cada nó portador de dados em um cluster é um membro votante.
O quórum para a confirmação especifica quantos membros votantes portadores de dados, ou quais membros votantes, incluindo o primário, devem estar preparados para confirmar uma construção simultânea de índice antes que o primário execute a confirmação.
A preocupação de gravação é o nível de reconhecimento de que a gravação se propagou para o número especificado de instâncias.
O quorum de confirmação especifica quantos nós devem estar prontos para concluir a criação do índice antes que o primário faça a confirmação da criação do índice. Por outro lado, quando o primário tiver confirmado a criação do índice, a preocupação de gravação especifica quantos nós devem finalizar a criação do índice antes que o comando retorne.
Falha e Recuperação de Construções
Construções de Índices Interrompidas no Primário e Secundário mongod
Se um mongod primário ou secundário executar uma limpeza shutdown com "force" : true ou receber um sinal de SIGTERM durante a construção de índice e o commitQuorum estiver definido como o padrão votingMembers, o progresso da construção de índice será salvo em disco. O mongod recupera automaticamente a construção de índice quando reiniciado e continua a partir do checkpoint salvo. Nas versões anteriores, a construção do índice deve ser reiniciada desde o início.
O mongod pode executar o processo de inicialização enquanto em recuperação construções de índice.
Se você reiniciar o mongod como autônomo (ou seja, removendo ou comentando replication.replSetName ou omitindo --replSetName), o mongod não poderá reiniciar a construção de índices. A compilação permanece em um estado pausado até que seja droppedmanualmente.
Construções de Índices Interrompidas em Standalone mongod
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.
Rollbacks durante o Processo de Construção
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.
Verificações de Consistência de Índices para Coleções fragmentadas
Uma coleção fragmentada tem um índice inconsistente se a coleção não tiver exatamente os mesmos índices (incluindo as opções de índice) em cada fragmento que contém partes para a coleção. Embora índices inconsistentes não devam ocorrer durante operações normais, eles podem ocorrer nos seguintes cenários:
Ao criar um índice com uma restrição de chave
uniquee um fragmento contém uma parte 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.Ao criar um índice entre os fragmentos de forma contínua (ou seja, criar manualmente o índice um a um nos fragmentos), mas não conseguir criar o índice para um fragmento associado ou criar incorretamente um índice com uma 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.
Monitorar Construções de Índices em Andamento
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.
Observe as Construções de Índices Interrompidas e Retomadas nos Registros
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",
Encerrar Construções de Índices em Andamento
Use o comando dropIndexes ou seus auxiliares de shell dropIndex() ou dropIndexes() para encerrar uma construção de índice em andamento. Consulte Interromper as Compilaçõ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.
Processo de Construção de Índices
A tabela a seguir descreve cada estágio do processo de construção de índices:
Estágio | Descrição |
|---|---|
Bloqueio | O |
Inicialização | O
|
Bloqueio | O |
Verificar Coleção | Para cada documento na coleção, o Se o Se o Depois que o |
Tabela de gravações do lado do processo | O Se o Se o Para cada documento gravado na coleção durante o processo de construção, o |
Votar e Aguardar o Quorum para o Commit | Um O Se o Se o
Enquanto aguarda o quórum para a confirmação, o |
Bloqueio | O |
Concluir o Processamento da Tabela de Gravações Laterais Temporárias | O Se o Se o |
Bloqueio | O |
Descartar Tabela de Gravações Laterais | O Se o Se o Neste ponto, o índice inclui todos os dados gravados na coleção. |
Tabela de Violações de Restrições do Processo | Se o
Se o |
Marcar o Índice como Pronto | O |
Bloqueio | O |