Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Construção contínua de índices em clusters fragmentados

Nesta página

  • Considerações
  • Pré-requisitos
  • Procedimento
  • Informações adicionais

As compilações de índice podem ter impacto no desempenho do cluster fragmentado. Por padrão, o MongoDB cria índices simultaneamente em todos os membros do conjunto de réplicas portadoras de dados. As compilações de índice em clusters fragmentados ocorrem apenas nos shards que contêm dados para a collection que está sendo indexada. Para cargas de trabalho que não toleram a diminuição do desempenho devido à criação de índices, considere usar o procedimento a seguir para criar índices de forma contínua.

As construções de índice contínuo retiram no máximo um membro do conjunto de réplicas de fragmento 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 por fragmento.

Para criar índices únicos usando o procedimento a seguir, você deve parar todas as gravações na collection durante o procedimento.

Se não for possível parar todos os escritos na coleção durante este procedimento, não use o procedimento nesta página. Em vez disso, crie seu índice único na coleção emitindo db.collection.createIndex() no mongos para um cluster fragmentado.

Certifique-se de que seu oplog seja grande o suficiente para permitir que a operação de indexação ou reindexação seja concluída sem ficar muito para trás para recuperar o atraso. Consulte a documentação de dimensionamento do oplog para obter informações adicionais.

Para construir índices únicos
  1. Para criar índices únicos usando o procedimento a seguir, você deve interromper todas as gravações na collection durante a compilação do índice. Caso contrário, você pode acabar com dados inconsistentes nos conjuntos de réplicas. Se não for possível parar todas as gravações na collection, não use o procedimento a seguir para criar índices únicos.

    Aviso

    Se não for possível parar todos os escritos na coleção, não use o procedimento a seguir para criar índices únicos.

  2. Antes de criar o índice, valide se nenhum documento na collection viola as restrições do índice. Se uma collection for distribuída entre shards e um shard contiver um chunk com documentos duplicados, a operação de criação de índice poderá ser bem-sucedida nos shards sem duplicatas, mas não no shard com duplicatas. Para evitar deixar índices inconsistentes entre shards, você pode emitir o db.collection.dropIndex() de um mongos para descartar o índice da collection.

Importante

O procedimento a seguir para criar índices de forma contínua se aplica a implantações de cluster fragmentados e não a implantações de conjuntos de réplicas. Para obter o procedimento para o conjunto de réplicas, consulte Construção contínua de índices no Conjunto de réplicas.

Conecte o mongosh a uma instância do mongos no cluster fragmentado e execute o sh.stopBalancer() para desabilitar o balanceador: [1]

sh.stopBalancer()

Observação

Se houver uma migração em andamento, o sistema a concluirá antes de encerrar o balancer.

Para verificar se o balanceador está desativado, execute sh.getBalancerState(), que retorna falso se o balanceador estiver desativado:

sh.getBalancerState()
[1] A partir do MongoDB 6.0.3, a divisão automática de chunks não é executada. Isso se deve às melhorias no balanceamento das políticas. Os comandos de divisão automática ainda existem, mas não executam uma operação. Nas versões do MongoDB anteriores a 6.0.3, sh.stopBalancer() também desabilita a divisão automática para o cluster fragmentado.

A partir mongosh conectado ao mongos, atualize a tabela de roteamento em cache para esse mongos para evitar o retorno de informações de distribuição obsoletas para a collection. Depois de atualizado, execute db.collection.getShardDistribution() para a collection na qual deseja construir o índice.

Por exemplo, se você quiser criar um índice ascendente na collection records no banco de dados test:

db.adminCommand( { flushRouterConfig: "test.records" } );
db.records.getShardDistribution();

O método produz a distribuição de fragmentos. Por exemplo, considere um cluster fragmentado com 3 fragmentos shardA, shardB e shardC e o db.collection.getShardDistribution() retorna o seguinte:

Shard shardA at shardA/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018
data : 1KiB docs : 50 chunks : 1
estimated data per chunk : 1KiB
estimated docs per chunk : 50
Shard shardC at shardC/s3-mongo1.example.net:27018,s3-mongo2.example.net:27018,s3-mongo3.example.net:27018
data : 1KiB docs : 50 chunks : 1
estimated data per chunk : 1KiB
estimated docs per chunk : 50
Totals
data : 3KiB docs : 100 chunks : 2
Shard shardA contains 50% data, 50% docs in cluster, avg obj size on shard : 40B
Shard shardC contains 50% data, 50% docs in cluster, avg obj size on shard : 40B

A partir da saída, você somente constrói os índices para test.records em shardA e shardC.

Para cada fragmento que contém blocos para a coleção, siga o procedimento para construir o índice no fragmento.

Para um fragmento afetado, interrompa o processo mongod associado a um de seus fragmentos secundários. Reinicie após fazer as seguintes atualizações de configuração:

[2](1, 2) Ao executar o mongod em uma porta diferente, você garante que os outros membros do conjunto de réplicas e todos os clientes não entrem em contato com o membro enquanto você estiver construindo o índice.

Conecte-se diretamente à instânciamongodem execução como standalone na nova porta e crie o novo índice para essa instância.

Por exemplo, conecte mongosh à instância e utilize o método db.collection.createIndex() para criar um índice ascendente no campo username da collection records :

db.records.createIndex( { username: 1 } )

Quando a criação do índice for concluída, encerre a instância mongod . Desfaça as alterações de configuração feitas ao iniciar como standalone para retornar à configuração original e reiniciar.

Importante

Certifique-se de remover o parâmetro skipShardingConfigurationChecks e o parâmetro disableLogicalSessionCacheRefresh .

Por exemplo, para reiniciar o membro do fragmento do seu conjunto de réplicas:

Permitir que a replicação alcance este membro.

Quando o membro alcançar os outros membros do conjunto, repita o procedimento um membro por vez para os membros secundários restantes para o fragmento:

  1. C1. Parar um secundário e reiniciar como autônomo

  2. C2. Construir o Índice

  3. C3. Reinicie o programa mongod como um membro do conjunto de réplicas

Quando todos os secundários do fragmento tiverem o novo índice, retire o primário do fragmento, reinicie-o como autônomo usando o procedimento descrito acima e crie o índice no primário anterior:

  1. Use o método rs.stepDown() em mongosh para diminuir o primário. Após a redução bem-sucedida, a primária atual se torna secundária e os membros do conjunto de réplicas elegem uma nova primária.

  2. C1. Parar um secundário e reiniciar como autônomo

  3. C2. Construir o Índice

  4. C3. Reinicie o programa mongod como um membro do conjunto de réplicas

Quando terminar de criar o índice para um fragmento, repita C. Construa índices nos fragmentos que contêm chunks de coleção para os outros fragmentos afetados.

Quando terminar a construção contínua do índice para os shards afetados, reinicie o balancer.

Conecte o mongosh a uma instância do mongos no cluster fragmentado e execute sh.startBalancer(): [3]

sh.startBalancer()
[3] A partir do MongoDB 6.0.3, a divisão automática de chunks não é executada. Isso se deve às melhorias no balanceamento das políticas. Os comandos de divisão automática ainda existem, mas não executam uma operação. Nas versões do MongoDB anteriores a 6.0.3, sh.startBalancer() também habilita a divisão automática para o cluster fragmentado.

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 entre os fragmentos de forma contínua, mas não consegue criar o índice para um fragmento associado ou cria 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 para collection fragmentadas. Para configurar estas 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.

← Construção contínua de índices em conjuntos réplicas