Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Criar construções de índices contínuas em clusters fragmentados

As compilações de índice contínuo são uma alternativa às compilações de índice padrão.

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.

Aviso

Certifique-se de não estar executando operações DDL enquanto conduz a construção do índice contínuo.

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.

As compilações de índice contínuo reduzem a resiliência do cluster e aumentam a duração da compilação.

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.

A partir do MongoDB 8.0, você pode usar a função directShardOperations para realizar operações de manutenção que exigem que você execute comandos diretamente em um shard.

Aviso

Executar comandos utilizando a função directShardOperations pode fazer com que seu cluster pare de funcionar corretamente e pode causar corrupção de dados. Use a função directShardOperations apenas para fins de manutenção ou sob a orientação do suporte do MongoDB . Quando terminar de executar as operações de manutenção, pare de usar a função directShardOperations .

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 Criar uma compilação de índice contínuo no conjunto de réplicas.

Conecte mongosh o a uma instância do no cluster fragmentado e desabilite as migrações para a collection em que você deseja executar o índice de compilação mongos contínua:

db.adminCommand(
{
setAllowMigrations: "<db>.<collection>",
allowMigrations: false
}
)

O comando anterior garante que o conjunto correto de shards seja direcionado para compilações de índice contínuo, pois nenhuma migração para a coleção terá permissão para ser confirmada.

Se o comando retornar o seguinte erro, significa que a collection não está fragmentada. Você pode ignorar o erro com segurança e continuar com a próxima etapa.

MongoServerError[NamespaceNotSharded]: Collection must be sharded so migrations can be blocked

Para determinar quais fragmentos devem estar envolvidos na construção do índice contínuo, execute a seguinte agregação na coleção em que você deseja construir o índice:

db.getSiblingDB(<db>).getCollection(<collection>).aggregate([{$collStats:{}},{$group: {_id: "$ns", shard_list: {$addToSet: "$shard"}}}])

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

db.getSiblingDB("test").getCollection("records").aggregate([{$collStats:{}},{$group: {_id: "$ns", shard_list: {$addToSet: "$shard"}}}])
[ { _id: 'test.records', shard_list: [ 'shardA', 'shardC' ] } ]

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:

Se você estiver usando um arquivo de configuração, faça as seguintes atualizações de configuração:

Por exemplo, para um membro do conjunto de réplicas de shard, o arquivo de configuração atualizado incluirá conteúdo como o seguinte exemplo:

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27218
# port: 27018
#replication:
# replSetName: shardA
#sharding:
# clusterRole: shardsvr
setParameter:
skipShardingConfigurationChecks: true
disableLogicalSessionCacheRefresh: true

E reinicie:

mongod --config <path/To/ConfigFile>

Outras configurações (por exemplo storage.dbPath, etc.) permanecem inalteradas.

Se estiver usando opções de linha de comando, faça as seguintes atualizações de configuração:

Por exemplo, reinicie o membro do conjunto de réplicas de fragmentos sem as opções --replSet e --shardsvr. Especifique um novo número de porta e defina os parâmetros skipShardingConfigurationChecks e disableLogicalSessionCacheRefresh como verdadeiro:

mongod --port 27218 --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true

Outras configurações (por exemplo --dbpath, etc.) permanecem inalteradas.

[1](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 use o método db.collection.createIndex() para criar um índice ascendente no campo username da coleção 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:

Se você estiver usando um arquivo de configuração:

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27018
replication:
replSetName: shardA
sharding:
clusterRole: shardsvr

Outras configurações (por exemplo storage.dbPath, etc.) permanecem inalteradas.

E reinicie:

mongod --config <path/To/ConfigFile>

Se você estiver usando opções da linha de comando:

Por exemplo:

mongod --port 27018 --replSet shardA --shardsvr

Outras configurações (por exemplo --dbpath, etc.) permanecem inalteradas.

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 reduzir o primário. Após a redução bem-sucedida, o primário atual se torna secundário e os nós do conjunto de réplicas elegem um novo primário.

  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 construir o índice para um fragmento, repita C. Construir índices nos fragmentos que contêm partes de coleção para os outros fragmentos afetados.

Conecte mongosh a uma instância mongos no cluster fragmentado e reative a migração com setAllowMigrations:

db.adminCommand(
{
setAllowMigrations: "<db>.<collection>",
allowMigrations: true
}
)

Se o comando retornar o seguinte erro, significa que a collection não está fragmentada. Você pode ignorar o erro com segurança.

MongoServerError[NamespaceNotSharded]: Collection must be sharded so migrations can be blocked

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 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.

Voltar

Crie em conjuntos de réplicas

Nesta página