Docs Menu
Docs Home
/ /

Mover una colección

A partir de MongoDB 8.0, puede mover una colección no fragmentada a un fragmento diferente usando el moveCollection dominio.

Si su implementación tiene habilitado el control de acceso, el rol le otorga acceso para ejecutar enableSharding el moveCollection comando.

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 ) * 2 bytes 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.

1

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().

2
  1. Monitorizar el tiempo restante.

    Para monitorear el tiempo restante para la moveCollection operación, utilice la $currentOp etapa de canalización.

    Este ejemplo muestra cómo comprobar el progreso de moveCollection en la colección app.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 $currentOp genera:

    • totalOperationTimeElapsedSecs: tiempo de operación transcurrido en segundos

    • remainingOperationTimeEstimatedSecs: tiempo restante estimado en segundos para la operación moveCollection actual. Se devuelve como -1 al iniciar una nueva operación moveCollection.

    Nota

    remainingOperationTimeEstimatedSecs se 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>,
    ...
    },
    ...
    ]
  2. 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.bytesCopied colección.

3

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' } ]

Volver

Colecciones móviles

En esta página