Construções de índice em coleções preenchidas
Nesta página
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 .
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 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()
.
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 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.
Coleções fragmentadas
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.
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 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.
Memória (RAM) Disponível do Sistema Insuficiente
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
.
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
createIndexes
e 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
.
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.
Para obter construções de índices contínuas em conjuntos de réplicas, consulte Construções de índices contínuas em conjuntos de réplicas.
Para compilações de índices contínuos em cluster, consulte Compilações de índices contínuos em clusters fragmentados.
Falha e Recuperação de Construções
Construções de Índices Interrompidas em um Primário mongod
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.
Construções de Índices Interrompidas em um Secundário mongod
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 dropped
manualmente.
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 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.
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 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.
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 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
|
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 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 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 Se o Se o |
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 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 mongod libera o bloqueio X na coleção. |