Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
Construção contínua de índices em clusters fragmentados
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.
Considerações
Índices únicos
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.
Tamanho do log
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.
Pré-requisitos
- Para construir índices únicos
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.
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 ummongos
para descartar o índice da collection.
Procedimento
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.
A. Pare o balanceador
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. |
B. Determinar a distribuição da coleção
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
.
C. Criar índices nos shards que contêm chunks da collection
Para cada fragmento que contém blocos para a coleção, siga o procedimento para construir o índice no fragmento.
C1. Parar um secundário e reiniciar como autônomo
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. |
C2. Construir o Índice
Conecte-se diretamente à instânciamongod
em 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 } )
C3. Reinicie o programa mongod
como um membro do conjunto de réplicas
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.
C4. Repetir o procedimento para os secundários restantes para o shard
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:
C5. Construa o índice no primário
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:
Use o método
rs.stepDown()
emmongosh
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.C3. Reinicie o programa
mongod
como um membro do conjunto de réplicas
D. Repetir para os outros fragmentos afetados
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.
E. Reinicie o Balanceador
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. |
Informações adicionais
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.