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 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.
Comece a drenagem o shard.
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.
Mover coleções.
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" } )
Mover primários.
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" })
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 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.