Definição
removeShard
Remove um shard de um cluster fragmentado. Quando você executa
removeShard
, o MongoDB drena o fragmento usando o balanceador para mover os fragmentos do fragmento para outros fragmentos no cluster.Se o shard tiver collections não fragmentadas, você deverá drenar todas as collections não fragmentadas do shard. A partir do MongoDB 8.0, você pode usar
sh.moveCollection()
para mover collection não fragmentadas. Para obter detalhes sobre o procedimento de drenagem de um shard, consulte Remover fragmentos de um cluster fragmentado.Depois que o fragmento é drenado, o MongoDB remove o fragmento do cluster.
Observação
Se quiser adicionar novamente um fragmento removido ao cluster fragmentado, você deverá limpar o
storage.dbPath
de todos os nós do fragmento para remover os arquivos do fragmento antes de poder adicioná-lo novamente.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Observação
Este comando não é suportado no MongoDB Atlas. Consulte Modificar seu Atlas Cluster Sharded para adicionar ou remover shards do seu Atlas cluster.
Sintaxe
O comando tem a seguinte sintaxe:
db.adminCommand( { removeShard : <shardToRemove> } )
Comportamento
Nenhum backup de cluster durante a remoção de fragmentos
Você não pode fazer backup dos dados do cluster durante a remoção de fragmentos.
removeShard
Operações simultâneas
Você pode ter mais de uma operação removeShard
em andamento.
Requisitos de acesso
Se você tiver authorization
habilitado, deverá ter a função clusterManager
ou qualquer função que inclua a ação removeShard
.
Requisitos de migração de reconhecimento de data center
Cada banco de dados de dados em um cluster fragmentado tem um fragmento primário. Se o fragmento que você deseja remover também for o principal de um dos bancos de dados do cluster, você deverá mover manualmente os bancos de dados para um novo fragmento após migrar todos os dados do fragmento. Consulte o comando movePrimary
e Remover fragmentos de um cluster fragmentado para obter mais informações.
Balanceamento de partes
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.
Escreva preocupação
mongos
converte a write concern do comando removeShard
para "majority"
.
Fluxos de alterações
A remoção de um shard 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.
Operações de DDL
Se você executar o removeShard
enquanto o cluster executa uma operação DDL (operação que modifica uma collection como reshardCollection
), o removeShard
somente executará após a conclusão da operação DDL simultânea.
Exemplo
A partir mongosh
, a operação removeShard
é semelhante ao seguinte:
db.adminCommand( { removeShard : "bristol01" } )
Substitua bristol01
pelo nome do shard a ser removido. Ao executar removeShard
, o comando retorna com uma mensagem semelhante à seguinte:
{ "msg" : "draining started successfully", "state" : "started", "shard" : "bristol01", "note" : "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", "dbsToMove" : [ "fizz", "buzz" ], "collectionsToMove" : [ "fizz.coll1", "buzz.coll1" ], "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : Long("6766255701040824328") } } }
O balanceador começa a migrar ("drenar") blocos do fragmento denominado bristol01
para outros fragmentos no cluster. Essas migrações acontecem lentamente para evitar a colocação de carga inadequada no cluster.
Se você executar o comando novamente, removeShard
retornará o status atual do processo. Por exemplo, se a operação estiver em um estado ongoing
, o comando retornará uma saída semelhante à seguinte:
{ "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : Long(2), "dbs" : Long(2), "jumboChunks" : Long(0), "collectionsToMove": Long(2) }, "note" : "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", "dbsToMove" : [ "fizz", "buzz" ], "collectionsToMove" : [ "fizz.coll1", "buzz.coll1" ], "ok" : 1, "operationTime" : Timestamp(1575399086, 1655), "$clusterTime" : { "clusterTime" : Timestamp(1575399086, 1655), "signature" : { "hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), "keyId" : Long("6766255701040824328") } } }
Na saída, o campo remaining
inclui os seguintes campos:
Campo | Descrição |
---|---|
| Número total de chunks restantes atualmente no shard. |
| 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 |
| Do número total de Se o Depois que a sinalização |
| Número total de collections não fragmentadas que você precisa mover do shard. |
Continue verificando o status do comando removeShard
(ou seja, execute novamente o comando) até que o número de chunks restantes seja 0
.
{ "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : Long(0), // All chunks have moved "dbs" : Long(2), "jumboChunks" : Long(0), "collectionsToMove": Long(2) }, "note" : "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", "dbsToMove" : [ "fizz", "buzz" ], "collectionsToMove" : [ "fizz.coll1", "buzz.coll1" ], "ok" : 1, "operationTime" : Timestamp(1575400343, 1), "$clusterTime" : { "clusterTime" : Timestamp(1575400343, 1), "signature" : { "hash" : BinData(0,"9plu5B/hw4uWAgEmjjBP3syw1Zk="), "keyId" : Long("6766255701040824328") } } }
Depois que o balanceador drenar todos os fragmentos do fragmento, talvez seja necessário mover manualmente suas coleções e bancos de dados para fora do fragmento drenado.
Se a saída removeShard
contiver collections no campo collectionsToMove
, use moveCollection
para mover essas collections para um shard diferente do shard de drenagem ou descartar as collections (o que exclui os arquivos de dados associados).
Se a saída removeShard
contiver bancos de dados no campo dbsToMove
, use movePrimary
para esses bancos de dados ou solte os bancos de dados (o que exclui os arquivos de dados associados).
Observação
Para obter o melhor desempenho, mova suas coleções antes de mover seus bancos de dados.
Depois que o balanceador concluir a transferência de todos os chunks para fora do shard e você tiver lidado com dbsToMove
e collectionsToMove
, removeShard
poderá ser concluído. A execução de removeShard
novamente retorna uma saída semelhante à seguinte:
{ "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "bristol01", "ok" : 1, "operationTime" : Timestamp(1575400370, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575400370, 2), "signature" : { "hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="), "keyId" : Long("6766255701040824328") } } }