A partir de MongoDB 8.0, puedes mover una colección no particionada a una partición diferente usando el moveCollection .
Acerca de esta tarea
moveCollectionsolo se puede ejecutar en clústeres segmentados.moveCollectionsolo puede mover colecciones que no estén fragmentadas.moveCollectionsolo puede mover una colección a la vez.moveCollectiontiene una duración mínima de 5 minutos.Si la colección que se está moviendo utiliza MongoDB Search, sus índices de búsqueda se vuelven inaccesibles después de que
moveCollectionse complete. Debe reconstruir manualmente los índices de búsqueda.No puedes realizar cambios de topología, como agregar o remover particiones o pasar de servidores de configuración integrados a dedicados, hasta que
moveCollectioneste completado.No puedes ejecutar las siguientes operaciones en la colección que se está moviendo mientras
moveCollectionesté en curso:No puede ejecutar las siguientes operaciones en el clúster mientras
moveCollectionestá en progreso:Las creaciones de índices que ocurran mientras
moveCollectionesté en curso podrían fallar silenciosamente.No crear índices mientras
moveCollectionesté en curso.No llame a
moveCollectionsi hay creaciones de índices en curso.
Control de acceso
Si tu implementación tiene control de acceso habilitado, el rol enableSharding te otorga acceso para ejecutar el comando moveCollection.
Antes de comenzar
Antes de trasladar tu colección, asegúrate de cumplir los siguientes requisitos:
Su aplicación puede tolerar un período de dos segundos en el que la colección afectada bloquea los guardados. Durante el periodo en el que las écritas están bloqueadas, tu aplicación experimenta un aumento en la latencia.
Su base de datos cumple con estos requisitos de recursos:
Asegúrate de que la partición a la que mueves la colección tenga suficiente espacio de almacenamiento para la colección y sus índices. La partición de destino requiere al menos
( Collection storage size + Index Size ) * 2bytes disponibles.Asegúrate de que tu capacidad de E/S esté por debajo de 50%.
Asegúrate de que la carga de tu CPU esté por debajo del 80%.
Importante
Estos requisitos no son exigidos por la base de datos. Una falta de asignación de suficientes recursos puede provocar:
la base de datos se queda sin espacio y se apaga
rendimiento reducido
la operación tarda más de lo esperado
Si tu aplicación tiene periodos de menor tráfico, realiza esta operación en la colección durante ese tiempo si es posible.
Pasos
Mover la colección.
Para mover una colección no particionada llamada inventory en la base de datos app a la partición shard02, ejecuta moveCollection:
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
Para obtener una lista de los ID de partición disponibles, ejecute sh.status(). Para más detalles, vea sh.status() Output.
Supervisa el progreso de la operación moveCollection.
Supervisa el tiempo restante.
Para supervisar el tiempo restante para la operación
moveCollection, utiliza la etapa de pipeline$currentOp.Este ejemplo muestra cómo verificar el progreso de
moveCollectionen la colecciónapp.inventory:db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "app.inventory" } } ] ) Nota
Para ver los valores actualizados, es necesario ejecutar continuamente la pipeline anterior.
La
$currentOpsalida de la pipeline:totalOperationTimeElapsedSecs: elapsed operation time en segundosremainingOperationTimeEstimatedSecsTiempo estimado restante en segundos para la operación actual demoveCollection. Se devuelve como-1cuando empieza una nueva operaciónmoveCollection.
Nota
remainingOperationTimeEstimatedSecsse establece en una estimación de tiempo pesimista:- La estimación del tiempo de la fase de actualización se establece en el tiempo de la fase de clonación, lo que
- es un tiempo relativamente largo.
- En la práctica, si sólo hay unas pocas operaciones de guardar pendientes, el
- el tiempo real de la fase de actualización es relativamente corto.
Esta etapa del pipeline tiene una salida similar a la siguiente:
[ { shard: '<shard>', type: 'op', desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>', op: 'command', ns: '<database>.<collection>', originatingCommand: { reshardCollection: '<database>.<collection>', key: <shardkey>, unique: <boolean>, collation: { locale: 'simple' } }, totalOperationTimeElapsedSecs: <number>, remainingOperationTimeEstimatedSecs: <number>, ... }, ... ] Supervise el número de bytes transferidos.
Para supervisar la cantidad de bytes transferidos, utiliza
shardingStatistics.resharding.active.bytesCopiedy compara con la cantidad de bytes en la colección.
Confirme que la colección se haya movido.
Para confirmar que la colección se ha movido a la partición esperada, utilize la etapa de $collStats pipeline.
Este ejemplo muestra cómo confirmar que la colección app.inventory existe en la partición esperada:
db.inventory.aggregate( [ { $collStats: {} }, { $project: { "shard": 1 } } ] )
Esta etapa del pipeline tiene una salida similar a la siguiente:
[ { shard: 'shard02' } ]