Para eliminar un Fragmento: debe asegurarse de que sus datos se migren a los fragmentos restantes del clúster. Este procedimiento describe cómo migrar datos de forma segura y eliminar un fragmento.
Acerca de esta tarea
Crear, fragmentar o mover colecciones mientras se realiza este procedimiento puede causar interrupciones y generar resultados inesperados.
No utilice este procedimiento para migrar un clúster completo a un nuevo hardware. Para migrar, consulte Migrar un clúster fragmentado autoadministrado a un hardware diferente.
Cuando se elimina un fragmento en un clúster con una distribución de fragmentos desigual, el equilibrador primero elimina los fragmentos del fragmento de drenaje y luego equilibra la distribución de fragmentos desigual restante.
La eliminación de un fragmento puede provocar que un cursor de flujo de cambio abierto se cierre y que el cursor de flujo de cambio cerrado no pueda reanudarse por completo.
Puede reiniciar un clúster de forma segura durante un proceso de eliminación de fragmentos. Si reinicia un clúster durante un proceso de vaciado en curso, este continuará automáticamente después de que se reinicien los componentes del clúster. MongoDB registra el estado del vaciado de fragmentos en el archivo
config.shardsrecopilación.
Antes de comenzar
Este procedimiento utiliza el método para mover colecciones fuera del fragmento eliminado. Antes de comenzar, revise
sh.moveCollection()lasmoveCollectionconsideraciones y requisitos de para comprender el comportamiento del comando.Para eliminar un fragmento, primero conéctese a una de las instancias del clúster
mongosusandomongosh.
Nota
Al remover múltiples particiones, remuévelos simultáneamente en lugar de uno a la vez. Eliminar una partición a la vez provoca que el balanceador drene los datos a otras particiones restantes. Una partición solo puede participar en una migración de fragmentos a la vez, por lo que remover una partición limita el rendimiento de la migración de datos.
Pasos
Asegúrese de que el balanceador esté habilitado
Para migrar datos desde un fragmento, el proceso de balanceo debe estar habilitado. Para comprobar el estado del balanceo, utilice el sh.getBalancerState() método:
sh.getBalancerState()
Si la operación devuelve true, el balanceador está habilitado.
Si la operación false devuelve, consulte Habilitar el balanceador.
Determina el nombre de la partición a remover
Para encontrar el nombre del fragmento, ejecute el listShards comando:
db.adminCommand( { listShards: 1 } )
El campo shards._id contiene el nombre del fragmento.
Migrar datos de recopilación fragmentados con el balanceador
Ejecute el comando para el fragmento que desea removeShard eliminar:
db.adminCommand( { removeShard: "<shardName>" } )
Nota
mongos convierte la preocupación removeShard de escritura del "majority" comando a.
La operación removeShard devuelve:
{ "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") } } }
El fragmento entra en el estado draining y el balanceador comienza a migrar fragmentos del fragmento eliminado a otros fragmentos del clúster. Estas migraciones se realizan lentamente para evitar un impacto grave en el clúster general. Dependiendo de la capacidad de la red y la cantidad de datos, esta operación puede tardar desde unos minutos hasta varios días en completarse.
Tip
Mientras el fragmento esté en el draining estado, puede usar el comando reshardCollection para redistribuir datos fuera del fragmento eliminado.
Mover datos con reshardCollection puede ser más rápido que esperar a que el balanceador migre fragmentos. El clúster garantiza que los datos no se coloquen en fragmentos que se están agotando. No se pueden ejecutar operaciones moveCollection y reshardCollection simultáneamente.
Para conocer el procedimiento completo, consulte Refragmentación para agregar y eliminar fragmentos.
Mover colecciones sin particionar a otra partición
Determinar qué colecciones deben trasladarse
Para enumerar las colecciones no fragmentadas en el fragmento, utilice la etapa de agregación
$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" ] } }} ]) Mueva las colecciones una por una
Para mover la colección,
sh.moveCollection()ejecute:sh.moveCollection( "<database>.<collection>", "<ID of recipient shard>" ) Nota
moveCollectionEl comando falla si se ejecuta en un espacio de nombres fragmentado. Si recibe este mensaje de error, ignórelo y vuelva al paso1para la siguiente recopilación.Regrese al paso
1para verificar que no queden colecciones sin fragmentar en el fragmento de drenaje.
Cambiar el fragmento principal
Ejecute el db.printShardingStatus() método:
db.printShardingStatus()
En la sección databases de la salida del comando, verifique el campo database.primary. Si el campo primary corresponde al fragmento eliminado, debe mover la base de datos principal a otro fragmento.
Para cambiar el fragmento principal de una base de datos, ejecute el movePrimary comando.
Advertencia
When you run movePrimary, any collections that were not moved in the Move unsharded collections to another shard
step are unavailable during the movePrimary process.
db.adminCommand( { movePrimary: <dbName>, to: <shardName> } )
Comprobar el estado de la migración
Para comprobar el progreso de la migración, ejecute desde removeShard la admin base de datos nuevamente:
db.adminCommand( { removeShard: "<shardName>" } )
En la salida, el campo remaining incluye estos campos:
Campo | Descripción |
|---|---|
| Número de fragmentos que quedan actualmente en el fragmento |
| Número de bases de datos cuyo fragmento principal es el fragmento. Estas bases de datos se especifican en el |
| Del número total Si Una vez que se |
Continúe verificando el estado del comando removeShard hasta que el número de fragmentos restantes sea 0.
db.adminCommand( { removeShard: "<shardName>" } )
Finalizar la eliminación de fragmentos
Para finalizar el proceso de eliminación de fragmentos, vuelva a ejecutar el comando removeShard:
db.adminCommand( { removeShard: <shardName> } )
Nota
Operaciones de DDL
Si elimina un fragmento mientras su clúster ejecuta una operación DDL (una operación que modifica una colección como),reshardCollection la removeShard operación se ejecuta después de que finaliza la operación DDL simultánea.
Si se elimina el fragmento, la salida del comando se parece a la siguiente:
{ 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 }) }