A partir de MongoDB 8.0, puede mover una colección no fragmentada a un fragmento diferente usando el moveCollection dominio.
Acerca de esta tarea
moveCollectionSólo se puede ejecutar en clústeres fragmentados.moveCollectionSólo se pueden mover colecciones no fragmentadas.moveCollectionsolo puede mover una colección a la vez.moveCollectiontiene una duración mínima de 5 minutos.Los índices de búsqueda de MongoDB deben reconstruirse después de que se ejecuta
moveCollection.No se pueden realizar cambios en la topología, como agregar o eliminar fragmentos o realizar transiciones entre servidores de configuración integrados y dedicados, hasta que se complete
moveCollection.No se pueden ejecutar las siguientes operaciones contra la colección que se está moviendo mientras
moveCollectionestá en progreso:No se pueden ejecutar las siguientes operaciones contra el clúster mientras
moveCollectionesté en progreso:Las compilaciones de índices que ocurren mientras
moveCollectionestá en progreso pueden fallar silenciosamente.No cree índices mientras
moveCollectionesté en progreso.No llame a
moveCollectionsi hay compilaciones de índices en curso.
Control de acceso
Si su implementación tiene habilitado el control de acceso, el rol le otorga acceso para ejecutar enableSharding el moveCollection comando.
Antes de comenzar
Antes de trasladar su colección, asegúrese de cumplir los siguientes requisitos:
Su aplicación puede tolerar un periodo de dos segundos en el que la colección afectada bloquea las escrituras. Durante este periodo, la aplicación experimenta un aumento de latencia.
Su base de datos cumple estos requisitos de recursos:
Asegúrese de que el fragmento al que va a mover la colección tenga suficiente espacio de almacenamiento para la colección y sus índices. El fragmento de destino requiere al menos
( Collection storage size + Index Size ) * 2bytes disponibles.Asegúrese de que su capacidad de E/S esté por debajo del 50%.
Asegúrese de que la carga de su CPU esté por debajo del 80%.
Importante
La base de datos no exige estos requisitos. Si no se asignan suficientes recursos, pueden producirse las siguientes consecuencias:
La base de datos se está quedando sin espacio y se está apagando
disminución del rendimiento
La operación tardó más de lo esperado
Si su aplicación tiene períodos de tiempo con menos tráfico, realice esta operación en la colección durante ese tiempo si es posible.
Pasos
Mover la colección.
Para mover una colección no fragmentada llamada inventory en la base de datos app al fragmento shard02, ejecute moveCollection:
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
Para obtener una lista de los ID de fragmentos disponibles,sh.status() ejecute. Para más detalles, consulte la salida de sh.status().
Supervisar el progreso de la operación moveCollection.
Monitorizar el tiempo restante.
Para monitorear el tiempo restante para la
moveCollectionoperación, utilice la$currentOpetapa de canalización.Este ejemplo muestra cómo comprobar 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 valores actualizados, debe ejecutar continuamente el proceso anterior.
El pipeline
$currentOpgenera:totalOperationTimeElapsedSecs: tiempo de operación transcurrido en segundosremainingOperationTimeEstimatedSecs: tiempo restante estimado en segundos para la operaciónmoveCollectionactual. Se devuelve como-1al iniciar una nueva operaciónmoveCollection.
Nota
remainingOperationTimeEstimatedSecsse establece en una estimación de tiempo pesimista:- La estimación del tiempo de la fase de recuperación se establece en el tiempo de la fase de clonación, que
- es un tiempo relativamente largo
- En la práctica, si solo hay unas pocas operaciones de escritura pendientes, el
- El tiempo real de la fase de recuperación es relativamente corto.
Esta etapa del pipeline tiene un resultado similar al 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>, ... }, ... ] Supervisar el número de bytes transferidos.
Para monitorear la cantidad de bytes transferidos, use y compárelo con la cantidad de bytes en la
shardingStatistics.resharding.active.bytesCopiedcolección.
Confirme que la colección se ha movido.
Para confirmar que la colección se ha movido al fragmento esperado, utilice la etapa de $collStats canalización.
Este ejemplo muestra cómo confirmar que la colección app.inventory existe en el fragmento esperado:
db.inventory.aggregate( [ { $collStats: {} }, { $project: { "shard": 1 } } ] )
Esta etapa del pipeline tiene un resultado similar al siguiente:
[ { shard: 'shard02' } ]