Definición
reshardCollectionEl
reshardCollectionEl comando cambia la clave de fragmento de una colección y cambia la distribución de sus datos.Nota
Puede ejecutar el comando
reshardCollectionconforceRedistribution: truepara eliminar un fragmento con fragmentos gigantes. Dado que la re-fragmentación evita las limitaciones estrictas del balanceador, generalmente es el mejor método para eliminar un fragmento que contiene fragmentos gigantes. Alternativamente, puede usar el comandomoveChunkComandoforceJumbo: truecon. Sin embargo, al ser una operación sin conexión, podría causar tiempo de inactividad.Tip
mongoshEn, este comando también se puede ejecutar a través del métodosh.reshardCollection()auxiliar.Los métodos asistente son convenientes para usuarios de
mongosh, pero es posible que no proporcionen el mismo nivel de información que los comandos de base de datos. En los casos en que no se necesite la conveniencia o se requieran campos de retorno adicionales, utiliza el comando de base de datos.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El comando tiene la siguiente sintaxis:
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> } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| string | El espacio de nombres de la colección que se va a reparticionar. Tiene el | ||||||||
| Documento | El documento que especifica el nuevo campo o campos que se utilizarán como clave de fragmento.
Establezca los valores del campo en:
| ||||||||
| booleano | Opcional. Especifique si existe una restricción de unicidad en la clave de fragmento. Solo | ||||||||
| entero | Opcional. Especifica el número inicial de fragmentos a crear en todas las particiones del clúster al reshardeando una colección. El valor por defecto es Si ves el error “La clave de partición proporcionada no tiene suficiente cardinalidad para generar la cantidad requerida de fragmentos”, vuelva a hacer el sharding en la colección con un valor de A partir de MongoDB 8.2, las operaciones de re-fragmentación ignoran la configuración | ||||||||
| Documento | Opcional. Si la colección especificada en | ||||||||
| arreglo | Opcional. Especifica las zonas para la colección. Para mantener o agregar zonas, especifique las zonas para su colección en una matriz: | ||||||||
| booleano | Opcional. Si se establece en Nuevo en la versión 8.0. | ||||||||
| booleano | Opcional. Permite que las operaciones de repartición se completen rápidamente. Cuando se establece como verdadero, |
Considerations
Las creaciones de índices que ocurren durante el rehashing podrían fallar silenciosamente.
No cree índices durante el proceso de reorganización.
No inicie el proceso de re-segmentación si hay compilaciones de índices en curso.
Si la colección que está rehaciendo utiliza MongoDB Search, el índice de búsqueda deja de estar disponible al finalizar la rehaciendo. Debe reconstruir manualmente el índice de búsqueda una vez finalizada la rehaciendo.
Proceso de re-partición
En una operación de refragmentación de una colección, un fragmento puede ser:
donante, que actualmente almacena fragmentos para la colección fragmentada.
destinatario, que almacena nuevos fragmentos para la colección fragmentada en función de las claves y zonas del fragmento.
Un fragmento puede ser donante y receptor al mismo tiempo.
El servidor de configuración principal siempre es el coordinador de re-sharding e inicia cada fase de la operación de re-sharding.
Fase de inicialización
Durante la fase de inicialización, el coordinador de fragmentación determina la nueva distribución de datos para la colección fragmentada.
Fase de clonación
Durante la fase de clonación:
Cada fragmento receptor crea una colección temporal vacía con las mismas opciones que la colección donante. Esta nueva colección es el destino donde los fragmentos receptores escriben los nuevos datos. Los fragmentos receptores no crean ningún índice, excepto el índice
_id, hasta la fase de indexación.Cada fragmento receptor clona los datos de la recopilación del fragmento donante, incluidos todos los documentos que el fragmento receptor posee bajo la nueva clave de fragmento.
Fase de índice
Durante la fase de indexación, cada fragmento receptor crea los nuevos índices necesarios. Estos incluyen todos los índices existentes en la colección fragmentada y un índice compatible con el nuevo patrón de clave de fragmento, si dicho índice no existe ya en la colección fragmentada.
Fase de aplicación y recuperación
Cambiado en la versión 8.2.
Durante la fase de aplicación y recuperación:
Cada fragmento destinatario comienza a aplicar las entradas del registro de operaciones que se escribieron en el fragmento donante correspondiente después de que el destinatario clonara los datos.
Cuando la estimación del tiempo restante para completar la operación de refragmentación es inferior a ms, el fragmento donante bloquea las escrituras en la colección de 500 origen.
Nota
Si lo desea, puede forzar manualmente la finalización de la operación de refragmentación mediante el commitReshardCollection comando. Esto es útil si el tiempo estimado actual para completar la refragmentación es aceptable para que su colección bloquee las escrituras. El comando bloquea commitReshardCollection las escrituras anticipadamente y fuerza la finalización de la refragmentación. Durante el período en que se bloquean las escrituras, su aplicación experimenta un aumento de latencia.
Fase de compromiso
Durante la fase de confirmación:
El coordinador de refragmentación espera a que todos los fragmentos alcancen una consistencia estricta y luego confirma la operación de refragmentación.
El coordinador de repartición indica a cada fragmento principal, donante y receptor, de forma independiente, que cambien el nombre de la colección temporal fragmentada. Esta se convierte en la nueva colección repartida.
Cada fragmento donante elimina la antigua colección de fragmentos.
Nota
Una vez que el proceso de re-fragmentación llega a la fase de confirmación, el proceso no se puede finalizar abortReshardCollection con.
Ejemplos
Repartir una colección
El siguiente ejemplo vuelve a fragmentar la colección sales.orders con la nueva clave de fragmento { order_id: 1 }:
db.adminCommand({ reshardCollection: "sales.orders", key: { order_id: 1 } })
Salida:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }
Redistribuir datos a nuevos fragmentos
A partir de MongoDB 8.0, puede volver a fragmentar una colección en la misma clave, que puede usarse para redistribuir datos en nuevos fragmentos.
Después de agregar un fragmento al clúster, utilice el comando reshardCollection con la opción forceRedistribution para redistribuir los datos en el clúster:
db.adminCommand({ reshardCollection: "accounts.invoices", key: { store_id: "hashed" }, forceRedistribution: true })
Redistribuir datos a diferentes zonas
A partir de MongoDB 8.0, puede usar el comando reshardCollection para mover datos a nuevas zonas sin cambiar la clave del fragmento.
El siguiente comando redistribuye datos para la colección accounts.sales usando la misma clave de fragmento, moviendo datos a los fragmentos asociados con las zonas zone04 y zone05:
db.adminCommand({ reshardCollection: "accounts.sales", key: { region_id: "hashed" }, forceRedistribution: true, zones: [ { zone: "zone04", min: { region_id: MinKey() }, max: { region_id: 10 } }, { zone: "zone05", min: { region_id: 10 }, max: { region_id: MaxKey() } } ] })