Acerca de esta tarea
La repartición con la misma clave de fragmento permite usar la repartición como mecanismo de transferencia de datos. Esto permite:
Uso el Técnica defragmentación a fragmentación para fragmentar una colección y distribuir sus datos entre todos los fragmentos relevantes
Añadir nuevos fragmentos más rápido
Eliminar fragmentos más rápido
Reescribe colecciones para recuperar espacio en disco.
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
Repartir la colección.
db.adminCommand( { reshardCollection: "<database>.<collection>", key: { "<shardkey>" }, unique: <boolean>, numInitialChunks: <integer>, collation: { locale: "simple" }, zones: [ { min: { "<document with same shape as shardkey>" }, max: { "<document with same shape as shardkey>" }, zone: <string> | null }, ], forceRedistribution: <bool> } )
Por ejemplo, este comando vuelve a fragmentar la colección info.productsInformation en su clave de fragmento actual { product_SKU : 1 }:
db.adminCommand( { reshardCollection: "info.productsInformation", key: { product_SKU : 1 }, forceRedistribution: true } )
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>, ... }, ... ]