Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Menu Docs
Página inicial do Docs
/ /

Remover fragmentos de um cluster fragmentado

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.

  1. 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 do moveCollection para entender o comportamento do comando.

  2. Para remover um fragmento, primeiro conecte-se a uma das instâncias mongos do cluster usando mongosh.

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.

1

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.

2

Para localizar o nome do shard, execute o comando listShards :

db.adminCommand( { listShards: 1 } )

O campo shards._id contém o nome do fragmento.

3

Execute o comando para começar a mover blocos das coleções fragmentadas para os outros fragmentos no startShardDraining cluster:

db.adminCommand( { startShardDraining: "shard04" } )

Se você precisar remover vários shards, poderá iniciar os processos de drenagem para serem executados em paralelo.

4

Quando você cria uma coleção em mongos e não chama, essa coleção permanece não fragmentada e o MongoDB a armazena integralmente em um fragmento específico no cluster. Bancos de dados que usam o shard como primary também armazenam suas coleções no shardCollection shard.

Se o fragmento que você deseja remover contiver uma coleção não fragmentada ou um banco de dados primário, será necessário mover a coleção para outro fragmento.

Para identificar se o fragmento que você deseja remover contém essa coleção e para ver o status de drenagem , execute o comando e verifique a array para shardDrainingStatus o collectionsToMove campo de saída :

db.adminCommand( { shardDrainingStatus: "shard04" } )
{
msg: "draining ongoing",
state: "ongoing",
remaining: {
chunks: Long(2),
dbs: Long(2),
jumboChunks: Long(0),
collectionsToMove: Long(2)
},
shard: "shard04",
note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove",
dbsToMove: [
"accounts",
],
collectionsToMove: [
"accounts.us-east",
"accounts.us-west",
"locations.us",
],
ok: 1,
operationTime: Timestamp(1575399086, 1655),
$clusterTime: {
clusterTime: Timestamp(1575399086, 1655),
signature: {
hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="),
keyId: Long("6766255701040824328")
}
}
}

Qualquer collection encontrada no campo collectionsToMove é uma collection armazenada neste fragmento. Antes de remover o fragmento, você deve primeiro mover essas coleções para outro fragmento.

Para mover uma coleção para outro fragmento, use o moveCollection comando:

db.adminCommand( {
moveCollection: "accounts.us-east",
toShard: "shard05"
} )
5

Clusters fragmentados designam um shard específico para servir como o fragmento primário de um banco de dados. Se o fragmento que você deseja remover for primário, será necessário movê-lo para outro fragmento.

Para identificar os primários, execute o comando e verifique a array shardDrainingStatus no dbsToMove campo de saída.

db.adminCommand( { shardDrainingStatus: "shard04" } )
{
msg: "draining ongoing",
state: "ongoing",
remaining: {
chunks: Long(2),
dbs: Long(2),
jumboChunks: Long(0),
collectionsToMove: Long(2)
},
shard: "shard04",
note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove",
dbsToMove: [
"accounts",
],
collectionsToMove: [ ],
ok: 1,
operationTime: Timestamp(1575399086, 1655),
$clusterTime: {
clusterTime: Timestamp(1575399086, 1655),
signature: {
hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="),
keyId: Long("6766255701040824328")
}
}
}

Cada banco de dados mostrado no campo dbsToMove é um banco de dados que você precisa mover para um shard diferente.

Para mover o banco de dados, use o movePrimary comando:

db.adminCommand( {
movePrimary: "accounts",
to: "shard05"
})
6

Antes de remover o fragmento, verifique se a operação de drenagem foi concluída.

Para verificar o status da operação de drenagem , execute o shardDrainingStatus comando:

db.adminCommand( { shardDrainingStatus: "shard04" } )
{
"msg" : "draining completed successfully",
"state" : "drainingComplete",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1771839836, 139),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1771839836, 139)
}

Quando o campo state retornar drainingComplete para o shard que você deseja remover, o processo de drenagem estará concluído. Agora você pode remover o fragmento.

Para remover o shard, execute o commitShardRemoval comando:

db.adminCommand( { commitShardRemoval: "shard04" } )
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1771840037, 12),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1771840037, 12)
}

Se o shard não for completamente drenado, o comando retornará um erro.

Voltar

Adicione um nó a um shard

Nesta página