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 remover um fragmento.
Sobre esta tarefa
Criar, fragmentar ou mover coleções durante a execução desse procedimento pode causar interrupções e levar a resultados inesperados.
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.
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.
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.
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
.
Antes de começar
Este procedimento utiliza o método
sh.moveCollection()
para mover as collections para fora do shard removido. Antes de iniciar este procedimento, revise as considerações e requisitos domoveCollection
para entender o comportamento do comando.Para remover um fragmento, primeiro conecte-se a uma das instâncias
mongos
do cluster usandomongosh
.
Observação
Ao remover vários fragmentos, remova-os simultaneamente em vez de um de cada vez. Remover um fragmento de cada vez faz com que o balanceador dre dados para outros fragmentos restantes. Um fragmento só pode participar da migração de um fragmento por vez, portanto, a remoção de um fragmento limita a taxa de transferência da migração de dados.
Passos
Verifique se o balanceador está habilitado
Para migrar dados de um shard, o processo do balanceador deve estar habilitado. Para verificar o estado do balanceador , use o método sh.getBalancerState()
:
sh.getBalancerState()
Se a operação retornar true
, o balanceador estará habilitado.
Se a operação retornar false
, consulte Habilitar o Balancer.
Determine o nome do shard a ser removido
Para localizar o nome do shard, execute o comando listShards
:
db.adminCommand( { listShards: 1 } )
O campo shards._id
contém o nome do fragmento.
Migre dados de collection fragmentados com o balanceador
Execute o comando removeShard
para o shard que você deseja remover:
db.adminCommand( { removeShard: "<shardName>" } )
Observação
mongos
converte a write concern do comando removeShard
para "majority"
.
A operação removeShard
retorna:
{ "msg" : "draining started successfully", "state" : "started", "shard" : "<shardName>", "note" : "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", "dbsToMove" : [ "db1", "db2" ], collectionsToMove: ["db1.collA"] "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : Long("6766255701040824328") } }
O fragmento entra no estado draining
e o balanceador começa a migrar blocos do fragmento removido para outros fragmentos no cluster. Essas migrações ocorrem lentamente para evitar um impacto grave 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.
Dica
Enquanto o shard estiver no estado draining
, você pode utilizar o comando reshardCollection para redistribuir dados fora do shard removido.
Mover dados com reshardCollection
pode ser mais rápido do que esperar que o balanceador migre os blocos. O cluster garante que os dados não sejam colocados em nenhum shard de drenagem . Não é possível executar as operações moveCollection
e reshardCollection
simultaneamente.
Para o procedimento completo, consulte Refragmentação para adicionar e remover fragmentos.
Mover coleções não fragmentadas para outro shard
Determine quais coleções precisam ser movidas
Para listar as collections não fragmentadas no fragmento, use o estágio de agregação
$listClusterCatalog
:use admin db.aggregate([ { $listClusterCatalog: { shards: true } }, { $match: { $and: [ { sharded: false }, { shards: '<shard_to_remove>' }, { type: { $nin: ["timeseries","view"] } }, { ns: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" }}}, { $or: [{ns: {$not: { $regex: "\.system\." }}}, {ns: {$regex: "\.system\.buckets\."}}]}, { db: { $ne: 'config' } }, { db: { $ne: 'admin' } } ]}}, { $project: { _id: 0, ns: { $cond: [ "$options.timeseries", { $replaceAll: { input: "$ns", find: ".system.buckets", replacement: "" } }, "$ns" ] } }} ]) Mova as collections uma a uma
Para mover a coleção, execute
sh.moveCollection()
:sh.moveCollection( "<database>.<collection>", "<ID of recipient shard>" ) Observação
moveCollection
falhará se você executar o comando em um namespace fragmentado. Se você receber esta mensagem de erro, ignore-a e retorne à etapa1
para a próxima coleção.Retorne à etapa
1
para verificar se não há collections não fragmentadas restantes no shard de drenagem .
Alterar fragmento primário
Execute o método db.printShardingStatus()
:
db.printShardingStatus()
Na seção databases
da saída de comando, marque o campo database.primary
. Se o campo primary
for o fragmento removido, você deverá mover o primário desse banco de dados para um fragmento diferente.
Para alterar o fragmento primário de um banco de dados, execute o comando movePrimary
.
Aviso
Quando você executa movePrimary
, todas as coleções que não foram movidas na etapa Move collections off of the shard ficarão indisponíveis durante o processo movePrimary
.
db.adminCommand( { movePrimary: <dbName>, to: <shardName> } )
Verificar o status da migração
Para verificar o progresso da migração, execute removeShard
do banco de banco de dados admin
novamente:
db.adminCommand( { removeShard: "<shardName>" } )
Na saída, o campo remaining
inclui estes campos:
Campo | Descrição |
---|---|
| Número de chunks atualmente restantes no shard |
| Número de bancos de dados cujo fragmento primário é o shard. Estes bancos de dados são especificados no campo de saída |
| Do número total de Se 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: "<shardName>" } )
Finalize a remoção de fragmentos
Para finalizar o processo de remoção de shard, execute novamente o comando removeShard
:
db.adminCommand( { removeShard: <shardName> } )
Observação
Operações de DDL
Se você remover um fragmento enquanto o cluster executa uma operação DDL (uma operação que modifica uma collection como reshardCollection
), a operação removeShard
será executada após a conclusão da operação DDL simultânea.
Se o fragmento for removido, a saída do comando será semelhante ao seguinte:
{ msg: 'removeshard completed successfully', state: 'completed', shard: '<shardName>', ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1721941519, i: 7 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1721941519, i: 7 }) }