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 domoveCollectionpara entender o comportamento do comando.Para remover um fragmento, primeiro conecte-se a uma das instâncias
mongosdo 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
Certifique-se de que o balanceador esteja 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 fragmento 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.
Comece a drenagem o fragmento.
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.
Mover coleções.
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" } )
Mova os primários.
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" })
Remova o fragmento.
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.