Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ /

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 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.

4
  1. 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"
    ]
    }
    }}
    ])
  2. 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 à etapa 1 para a próxima coleção.

  3. Retorne à etapa 1 para verificar se não há collections não fragmentadas restantes no shard de drenagem .

5

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>
}
)
6

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

chunks

Número de chunks atualmente restantes no shard

dbs

Número de bancos de dados cujo fragmento 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 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 drenagem 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: "<shardName>" } )
7

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 })
}

Voltar

Adicione um nó a um shard

Nesta página