Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.

Remover fragmentos de um cluster fragmentado

Para remover um fragmento , 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.

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

  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 startShardDraining para começar a mover partes das coleções fragmentadas para os outros fragmentos no cluster:

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

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

4

Quando você cria uma coleção em mongos e não chama shardCollection, 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 fragmento como primário também armazenam suas coleções no fragmento.

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 shardDrainingStatus e verifique a array para o campo de saída collectionsToMove:

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 coleção encontrada no campo collectionsToMove é uma coleção 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 comando moveCollection:

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

Clusters designam um fragmento 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 shardDrainingStatus e verifique a array no campo de saída dbsToMove.

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

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

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 comando shardDrainingStatus:

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 fragmento que você deseja remover, o processo de drenagem estará concluído. Agora você pode remover o fragmento.

Para remover o fragmento, executar o comando commitShardRemoval:

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 fragmento não for completamente drenado, o comando retornará um erro.