Para eliminar un Partición debe asegurarse de que los datos de la partición se migren a las particiones restantes en el clúster. Este procedimiento describe cómo migrar datos de forma segura y remover una partición.
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 una partición en un clúster con una distribución desigual de fragmentos, el balanceador primero elimina los fragmentos de la partición en proceso de drenaje y luego equilibra la distribución desigual de fragmentos 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 de manera segura un clúster durante un proceso de eliminación de particiones. Si reinicias un clúster durante un proceso de vaciado en curso, vaciado continúa automáticamente después de que los componentes del clúster se reinicien. MongoDB registra el estado de drenaje de particiones en el
config.shardscolección.
Antes de comenzar
Este procedimiento utiliza el método
sh.moveCollection()para mover colecciones fuera de la partición eliminada. Antes de comenzar este procedimiento, revise lasmoveCollectionconsideraciones y los requisitos para comprender el comportamiento del comando.Para remover una partición, primero conéctese a una de las instancias
mongosdel clúster usandomongosh.
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 de la partición, ejecuta el comando listShards:
db.adminCommand( { listShards: 1 } )
El campo shards._id contiene el nombre de la partición.
Migra datos de la colección particionada con el balanceador
Ejecuta el comando removeShard para la partición que deseas remover:
db.adminCommand( { removeShard: "<shardName>" } )
Nota
mongos convierte el nivel de confirmación de escritura (write concern) del comando removeShard en "majority".
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") } } }
La partición entra en el estado draining y el balanceador comienza a migrar fragmentos de la partición eliminada a otras particiones del clúster. Estas migraciones ocurren lentamente para evitar un impacto severo en el clúster general. Dependiendo de la capacidad de la red y de la cantidad de datos, esta operación puede tardar desde unos minutos hasta varios días en completarse.
Tip
Mientras la partición está en el estado draining, puedes usar el comando reshardCollection para redistribuir los datos fuera de la partición eliminada.
Mover datos con reshardCollection puede ser más rápido que esperar a que el balanceador migre los fragmentos. El clúster garantiza que no se almacenen datos en ninguna partición en drenaje. No puedes ejecutar las operaciones de 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 ser movidas
Para listar las colecciones no particionadas en la partición, utiliza 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, ejecuta
sh.moveCollection():sh.moveCollection( "<database>.<collection>", "<ID of recipient shard>" ) Nota
moveCollectionfalla si ejecutas el comando en un espacio de nombres que está particionado. Si recibes este mensaje de error, ignóralo y vuelve al paso1para la próxima colección.Vuelve al paso
1para comprobar que no queden colecciones sin particionar en la partición de drenaje.
Cambiar partición primaria
Ejecuta el método db.printShardingStatus():
db.printShardingStatus()
En la sección databases de la salida del comando, verifica el campo database.primary. Si el campo primary es la partición removida, debe mover el primario de esa base de datos a otra partición.
Para cambiar la partición primaria de una base de datos, ejecuta el comando movePrimary.
Advertencia
Cuando se ejecuta movePrimary, cualquier colección que no se haya movido en el Move unsharded collections to another shard
el paso no está disponible durante el proceso movePrimary.
db.adminCommand( { movePrimary: <dbName>, to: <shardName> } )
Comprobar el estado de la migración
Para comprobar el progreso de la migración, ejecuta removeShard de la base de datos admin nuevamente:
db.adminCommand( { removeShard: "<shardName>" } )
En el output, el campo remaining incluye estos campos:
Campo | Descripción |
|---|---|
| Número de fragmentos actualmente restantes en la partición |
| Número de bases de datos cuya partición primaria es la partición. Estas bases de datos se especifican en el campo de salida |
| Del número total de Si Después de que la bandera |
Sigue comprobando 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 particiones, 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 }) }