Menu Docs

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

Remover fragmentos de um cluster compartilhado existente

Nesta página

  • Considerações
  • Certifique-se de que o processo balancer esteja habilitado
  • Determine o nome do shard a ser removido
  • Remova chunks do fragmento
  • Verificar o status da migração
  • Mova bancos de dados para outro primary shard
  • Finalize a migração

Para remover um fragmento, você deve garantir que os dados do fragmento sejam migrados para os fragmentos restantes no cluster. Este procedimento descreve como migrar dados com segurança e como remover um fragmento.

Quando você remove um fragmento em um cluster com uma distribuição desigual de fragmentos, o balanceador primeiro remove os fragmentos do fragmento de drenagem e, em seguida, equilibra a distribuição desigual de fragmentos restante.

Este procedimento descreve como remover um fragmento de um cluster. Não use esse procedimento para migrar um cluster inteiro para um novo hardware. Para migrar, consulte Migrar um cluster fragmentado para hardware diferente.

Para remover um fragmento, primeiro conecte-se a uma das instâncias do mongos do cluster usando mongosh. Em seguida, use a sequência de tarefas neste documento para remover um shard do cluster.

  • Uma remoção de fragmento pode fazer com que um cursor de fluxo de alteração aberto feche e o cursor de fluxo de alteração fechado pode não ser totalmente retomável.

  • Você pode reiniciar um cluster com segurança durante um processo de remoção de fragmentos. Se você reiniciar um cluster durante um processo contínuo de drenagem, a drenagem continuará automaticamente após a reinicialização dos componentes do cluster. O MongoDB registra o status de drenagem do fragmento na coleção config.shards.

Para migrar com êxito os dados de um shard, o processo do balancer deve estar habilitado. Verifique o estado do balancer usando o auxiliar sh.getBalancerState() em mongosh. Para mais informações, consulte a seção sobre operações do balancer.

Para determinar o nome do shard, conecte a uma instância do mongos com mongosh e:

  • Utilize o comando listShards, como no seguinte:

    db.adminCommand( { listShards: 1 } )
  • Execute o método sh.status() ou db.printShardingStatus().

O campo shards._id lista o nome de cada shard.

A partir do banco de dados do admin, execute o comando removeShard. Isso começa a "drenar" chunks do shard que você está removendo para outros shards no cluster. Por exemplo, para um shard denominado mongodb0, execute:

db.adminCommand( { removeShard: "mongodb0" } )

mongos converte a write concern do comando removeShard para "majority".

Esta operação retorna com a seguinte resposta:

{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "mongodb0",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fiz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

O balanceador começa a migrar blocos do fragmento denominado mongodb0 para outros fragmentos no cluster. Essas migrações acontecem lentamente para evitar a colocação de carga indevida no cluster geral. Dependendo da capacidade da rede e da quantidade de dados, essa operação pode levar de alguns minutos a vários dias para ser concluída.

Observação

A saída inclui o campo dbsToMove indicando os bancos de dados, se houver, para os quais o fragmento é o primary shard. Depois que todos os chunks tiverem sido drenados do fragmento, você deverá movePrimary para o(s) banco(s) de dados ou, alternativamente, drop os bancos de dados (o que exclui os ficheiro de dados associados).

Para verificar o andamento da migração em qualquer estágio do processo, execute removeShard do banco de dados admin novamente. Por exemplo, para um fragmento denominado mongodb0, execute:

db.adminCommand( { removeShard: "mongodb0" } )

mongos converte a write concern do comando removeShard para "majority".

O comando gera uma saída semelhante ao seguinte:

{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(2),
"dbs" : NumberLong(2),
"jumboChunks" : NumberLong(0)
},
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575399086, 1655),
"$clusterTime" : {
"clusterTime" : Timestamp(1575399086, 1655),
"signature" : {
"hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

Na saída, o campo remaining inclui os seguintes campos:

Campo
Descrição
chunks
Número total de chunks restantes atualmente no shard.
dbs
Número total de bancos de dados cujo shard primário é o shard. Estes bancos de dados são especificados no campo de saída dbsToMove.
jumboChunks

Do número total de chunks, o número que é jumbo.

Se o jumboChunks for maior que 0, aguarde até que apenas o jumboChunks permaneça no fragmento. Quando restarem apenas os chunks jumbo, você deverá limpar manualmente a bandeira gigante antes que a drenando possa ser concluída. Consulte Limpar sinalizador jumbo .

Depois que a sinalização jumbo for limpa, o balanceador poderá migrar esses chunks. Para obter detalhes sobre o procedimento de migração, consulte Procedimento de migração de intervalo.

Continue verificando o status do comando removeShard até que o número de blocos restantes seja 0.

db.adminCommand( { removeShard: "mongodb0" } )

Se o fragmento for o fragmento primário para um ou mais bancos de dados no cluster, você deverá fazer com que esse banco de dados utilize um fragmento diferente como seu fragmento primário. O removeShard lista quaisquer bancos de dados que você precisa mover no campo dbsToMove na saída de comando. Se o fragmento não for o fragmento primário de qualquer banco de dados, pule para a próxima tarefa, Finalize a migração.

Para mover um banco de dados para outro shard, use o comando movePrimary.

Importante

Para garantir uma migração tranquila, consulte as considerações na documentação de comando do movePrimary antes de executar o movePrimary.

Para migrar o banco de dados do fizz do mongodb0 para mongodb1, emita o seguinte comando:

db.adminCommand( { movePrimary: "fizz", to: "mongodb1" })

mongos usa "majority" preocupação de escrita para movePrimary.

Este comando não retorna até que MongoDB conclua a transferência de todos os dados. A resposta deste comando será semelhante ao seguinte:

{
"ok" : 1,
"operationTime" : Timestamp(1575400369, 9),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400369, 9),
"signature" : {
"hash" : BinData(0,"2Nz8QCcVXB0LJLm1hsXfpTCaM0M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

Para limpar todas as informações de metadados e finalizar a remoção, execute o removeShard novamente. Por exemplo, para um shard denominado mongodb0, execute:

db.adminCommand( { removeShard: "mongodb0" } )

mongos converte a write concern do comando removeShard para "majority".

Uma mensagem de sucesso aparece na conclusão:

{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "mongodb0",
"ok" : 1,
"operationTime" : Timestamp(1575400370, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400370, 2),
"signature" : {
"hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

Quando o valor do campo state for "concluído", você poderá interromper com segurança as instâncias que compõem o fragmento mongodb0.

← Adicionar shards a um cluster