Acerca de esta tarea
Puedes usar la redistribución de fragmentos para distribuir tus colecciones fragmentadas a nuevos fragmentos. También puedes usarla para eliminar fragmentos más rápido que las migraciones de fragmentos.
La operación de refragmentación realiza estas fases en orden:
La fase de clonación duplica los datos de la recopilación actual.
La fase de creación de índices crea índices en la colección fragmentada nuevamente.
La fase de recuperación aplica cualquier operación de escritura pendiente a la colección fragmentada nuevamente.
La fase de confirmación cambia el nombre de la colección temporal y elimina la colección anterior para realizar una transición.
Antes de comenzar
Antes de volver a fragmentar, debe calcular su clúster Requisitos de almacenamiento, requisitos de latencia y cualquier requisito de recursos adicionales.
Requisitos de almacenamiento
Calcule el espacio de almacenamiento necesario para la operación de refragmentación sumando el tamaño de su colección y el tamaño del índice, asumiendo una ventana de registro de operaciones mínima de 24 horas mediante esta fórmula:
Available storage required on each shard = [(collection size + index size) *2 ] / number of shards the collection will be distributed across.
Por ejemplo, una colección de 2TB y 400GB de índices distribuidos en 4 fragmentos necesitarán un mínimo de 1.2TB de almacenamiento disponible por fragmento:
[ (2 TB + 400GB) * 2 ] / 4 shards = 1.2 TB / shard
Debes confirmar que tienes espacio de almacenamiento disponible en tu clúster.
Si no hay suficiente espacio o margen de E/S disponible, debe aumentar el tamaño del almacenamiento. Si no hay suficiente margen de CPU, debe escalar el clúster seleccionando un tamaño de instancia mayor.
Tip
Si su clúster MongoDB está alojado en Atlas, puede usar la interfaz de usuario de Atlas para revisar las métricas de almacenamiento, CPU y espacio libre de E/S.
Requisitos de latencia
Debe asegurarse de que su aplicación pueda tolerar dos segundos en los que la colección que se está repartiendo bloquee las escrituras. Cuando se bloquean las escrituras, la aplicación experimenta un aumento de latencia. Si su carga de trabajo no puede soportar este requisito, utilice migraciones de fragmentos para equilibrar el clúster.
Requisitos de recursos adicionales
Su clúster debe cumplir estos requisitos adicionales:
Una ventana de registro de operaciones mínima de 24 horas.
Capacidad de I/O inferior a 50%.
Carga de CPU por debajo del 80%.
Pasos
Agregue o elimine fragmentos de su clúster.
Para agregar fragmentos a su clúster, consulte Agregar fragmentos a un clúster. Para eliminar fragmentos de su clúster, consulte Eliminar fragmentos de un clúster fragmentado.
Refragmente las colecciones fragmentadas una a la vez con la misma clave de fragmento.
Uso el reshardCollection comando con la opción forceRedistribution para redistribuir datos en todo el clúster.
db.adminCommand( { reshardCollection: "<db>.<collection>", key: { "<shardkey>" }, forceRedistribution: true } )
La repartición con forceRedistribution: true reescribe los datos en todos los fragmentos del clúster que no estén en estado de vaciado. De forma predeterminada, la repartición usa numInitialChunks: 90. La repartición crea al menos numInitialChunks - 1 fragmentos en un clúster. Si tiene más de 90 fragmentos, especifique un número mayor de numInitialChunks en el comando reshardCollection.
Nota
A partir de MongoDB 8.2, las operaciones de re-fragmentación ignoran la configuración numInitialChunks cuando la clave de fragmento contiene un prefijo hash. En su lugar, MongoDB divide de forma determinista el espacio de la clave hash entre los destinatarios, utilizando el mismo enfoque que la creación inicial de fragmentos para colecciones hash vacías.
Supervisar la operación de refragmentación.
Para supervisar la operación de re-segmentación, puede utilizar la $currentOp etapa de canalización:
db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "<database>.<collection>" } } ] )
Nota
Para ver valores actualizados, debe ejecutar el pipeline continuamente.
El pipeline $currentOp genera:
totalOperationTimeElapsedSecs: tiempo de operación transcurrido en segundosremainingOperationTimeEstimatedSecs: Tiempo restante estimado en segundos para la operación de re-fragmentación actual. Se devuelve como-1al iniciar una nueva operación de re-fragmentación.A partir de MongoDB 7.0,
remainingOperationTimeEstimatedSecstambién está disponible en el coordinador durante una operación de reorganización.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 tiempo real de la fase de recuperación es relativamente corto.
[ { 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>, ... }, ... ]
La redistribución con forceRedistribution: true reescribe los datos de la colección en todos los fragmentos relevantes y elimina la colección anterior. Es el método más rápido para migrar datos en un clúster.