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.
Remover fragmentos de la partición
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 drop or movePrimary these databases", "dbsToMove" : [ "db1", "db2" ], "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.
Listar espaciados de nombres de colecciones fragmentadas
Para devolver una lista de namespaces de colecciones fragmentadas, utilice la etapa $shardedDataDistribution y proyecte el campo ns:
use admin db.aggregate( [ { $shardedDataDistribution: { } }, { $project: { ns: 1 } } ] )
Registra la salida para consultarla más adelante en este tutorial.
Mover colecciones fuera de la partición
Para cada base de datos del clúster, excluyendo admin y config, realiza estos pasos:
Enumere las colecciones de bases de datos
Enumere las colecciones en la base de datos, omitiendo los siguientes tipos de colecciones:
Colecciones internas que admiten CSFLE
Colecciones del sistema
Colecciones de series temporales
Vistas
use <databaseName> db.getCollectionInfos( { $and: [ { type: { $nin: [ "view", "timeseries" ] } }, { name: { $not: { $regex: "^system\." } } }, { name: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" } } } ] }, { nameOnly: true } ) Mover colecciones necesarias
Para cada colección devuelta por
getCollectionInfos(), realizar los siguientes pasos.Nota
Solo una operación
moveCollectionpuede estar en progreso al mismo tiempo. Completa todos los subpasos antes de pasar a la siguiente colección.Determine si la colección necesita ser trasladada.
Ejecute la etapa de agregación
$collStatsy proyecte los camposnsyshard:db.<collName>.aggregate( [ { $collStats: { } }, { $project: { ns: 1, shard: 1 } } ] ) Si se cumple alguno de los siguientes criterios, omita la colección y vuelva al paso
ipara la siguiente colección en la base de datos:El campo
nsestá presente en la salida$shardedDataDistributiondel paso 4.El campo
shardno es el fragmento que se está eliminando.
Si no se cumple ninguno de los criterios anteriores, continúe con el paso
iipara la colección actual.Mover la colección.
Para mover la colección, ejecute
sh.moveCollection()en la colección:sh.moveCollection( "<namespace>.<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 pasoipara la próxima colección.Vuelve al paso
ipara cada colección de la base de datos.
Repite el procedimiento para otras bases de datos
Repita el paso 6, Move collections off of the shard (y subpasos) para cada base de datos del clúster.
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 ejecuta movePrimary, cualquier colección que no se haya movido en el paso Move unsharded collections to another shard no estará 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 }) }