Remover fragmentos de um cluster compartilhado existente
Nesta página
Para remover umfragmento , 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 autogerenciado 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.
Considerações
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
.
Certifique-se de que o processo balancer esteja habilitado
Para migrar com êxito os dados de um fragmento, o processo do balanceador deve estar habilitado. Verifique o estado do balanceador usando o auxiliar sh.getBalancerState()
em mongosh
. Para mais informações, consulte a seção sobre operações do balanceador.
Determine o nome do shard a ser removido
Para determinar o nome do fragmento, 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()
oudb.printShardingStatus()
.
O campo shards._id
lista o nome de cada shard.
Remova chunks do fragmento
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).
Verificar o status da migração
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 |
---|---|
| 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 |
Continue verificando o status do comando removeShard
até que o número de blocos restantes seja 0
.
db.adminCommand( { removeShard: "mongodb0" } )
Mova bancos de dados para outro primary shard
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") } } }
Finalize a migração
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
.