MongoDB utiliza el Clave de fragmento asociada a la colección para particionar los datos en fragmentos. Un fragmento consiste en un subconjunto de datos fragmentados. Cada fragmento tiene un rango inferior inclusivo y un rango superior exclusivo según la clave de fragmento.
MongoDB divide los fragmentos cuando superan el tamaño configurado. Tanto las inserciones como las actualizaciones pueden provocar una división.
El rango más pequeño que un fragmento puede representar es un único valor de clave de fragmento. Un fragmento que solo contiene documentos con un único valor de clave de fragmento no se puede dividir.
Fragmentos iniciales
Colección completada
La operación de fragmentación crea los fragmentos iniciales para cubrir todo el rango de valores de la clave de fragmentación. El número de fragmentos creados depende del tamaño del fragmento configurado.
Después de la creación del fragmento inicial, el balanceador migra estos fragmentos iniciales a través de los fragmentos según corresponda y también administra la distribución de los fragmentos en el futuro.
Colección vacía
Si se tienen zonas y rangos de zonas definidos para una colección vacía o inexistente.
La operación de particionado crea fragmentos vacíos para los rangos de zona definidos, así como fragmentos adicionales para cubrir todo el rango de los valores de la clave de partición y realiza una distribución inicial de fragmentos basada en los rangos de zona. Esta creación y distribución inicial de fragmentos permite configurar más rápidamente el particionado de zona.
Después de la distribución inicial, el balanceador gestiona la distribución de fragmento en adelante.
Si no tiene zonas ni rangos de zonas definidos para una colección vacía o inexistente:
Para el particionado encriptado:
La operación de fragmentación crea fragmentos vacíos para cubrir todo el rango de valores de clave de fragmento y realiza una distribución inicial de fragmentos. De forma predeterminada, la operación crea 2 fragmentos por fragmento y migra por todo el clúster. Puede usar
numInitialChunksOpción para especificar un número diferente de fragmentos iniciales. Esta creación y distribución inicial de fragmentos permite una configuración más rápida de la fragmentación.Después de la distribución inicial, el balanceador gestiona la distribución de fragmento en adelante.
Para el particionado clasificado por rango:
La operación de particionado crea un único fragmento vacío para cubrir todo el rango de valores de la clave de partición.
Tras la creación inicial del fragmento, el balanceador migra el fragmento inicial a través de las particiones según convenga, además de gestionar la distribución de fragmentos en adelante.
Tamaño del trozo
El tamaño predeterminado de un fragmento en MongoDB es de 64 megabytes. Puede aumentarlo o reducirlo. Considere las implicaciones de cambiar el tamaño predeterminado de un fragmento:
Los fragmentos pequeños permiten una distribución más uniforme de los datos, a costa de migraciones más frecuentes. Esto genera un gasto en la capa de enrutamiento de consultas ().
mongosLos fragmentos grandes resultan en menos migraciones. Esto es más eficiente tanto desde la perspectiva de la red como en términos de sobrecarga interna en la capa de enrutamiento de consultas. Sin embargo, estas eficiencias se obtienen a expensas de una distribución de datos potencialmente desigual.
El tamaño del fragmento afecta el Número máximo de documentos por fragmento a migrar.
El tamaño del fragmento afecta el tamaño máximo de la colección al fragmentar una colección existente. Tras la fragmentación, el tamaño del fragmento no limita el tamaño de la colección.
Para muchas implementaciones, tiene sentido evitar migraciones frecuentes y potencialmente erróneas a costa de un conjunto de datos un poco menos uniforme.
Limitaciones
Cambiar el tamaño de los fragmentos afecta el momento en que se dividen los fragmentos, pero existen algunas limitaciones en sus efectos.
La división automática solo ocurre durante inserciones o actualizaciones. Si reduce el tamaño del fragmento, puede que todos los fragmentos tarden un tiempo en dividirse al nuevo tamaño.
Las divisiones no se pueden deshacer. Si se aumenta el tamaño del fragmento, los fragmentos existentes deben crecer mediante inserciones o actualizaciones hasta alcanzar el nuevo tamaño.
Divisiones de trozos
La división es un proceso que evita que los fragmentos crezcan demasiado. Cuando un fragmento supera un tamaño especificado, o si la cantidad de documentos excede el Número Máximo de Documentos por Fragmento a Migrar, MongoDB lo divide según los valores de clave de fragmento que representa. Un fragmento puede dividirse en varios fragmentos cuando sea necesario. Las inserciones y actualizaciones pueden desencadenar divisiones. Las divisiones son un cambio eficiente en los metadatos. Para crear divisiones, MongoDB no migra ningún dato ni afecta a los fragmentos.
Las divisiones pueden provocar una distribución desigual de los fragmentos de una colección entre los fragmentos. En estos casos, el balanceador redistribuye los fragmentos entre ellos. Consulte el Balanceador de Clústeres para obtener más información sobre el balanceo de fragmentos entre los fragmentos.
Migración de fragmentos
MongoDB migra fragmentos en un clúster fragmentado para distribuirlos uniformemente entre los fragmentos. Las migraciones pueden ser:
Manual. Solo se usa la migración manual en casos limitados, por ejemplo, para distribuir datos durante las inserciones masivas. Ver Migración manual de fragmentos para obtener más detalles.
Automático. El proceso de balanceo migra automáticamente los fragmentos cuando la distribución de los fragmentos de una colección fragmentada es desigual. Consulte Umbrales de migración para obtener más información.
Para obtener más información sobre el balanceador del clúster particionado, se puede consultar Balanceador de clúster particionado.
Balanceo
El balanceador es un proceso en segundo plano que gestiona la migración de fragmentos. Si la diferencia en el número de fragmentos entre el fragmento más grande y el más pequeño supera los umbrales de migración, el balanceador comienza a migrar fragmentos en todo el clúster para garantizar una distribución uniforme de los datos.
Puede administrar ciertos aspectos del balanceador. Este también respeta las zonas creadas durante la configuración de zonas en un clúster fragmentado.
Ver Balanceador del Clúster Particionado para obtener más información sobre el balanceador.
Fragmentos indivisibles/fragmento jumbo
En algunos casos, los fragmentos pueden superar el tamaño especificado, pero no pueden dividirse. El escenario más común es cuando un fragmento representa un único valor de clave de fragmento. Dado que el fragmento no puede dividirse, continúa creciendo más allá del tamaño del fragmento, convirtiéndose en un fragmento gigante. Estos fragmentos gigantes pueden convertirse en un cuello de botella para el rendimiento a medida que crecen, especialmente si el valor de clave de fragmento se produce con alta frecuencia.
A partir de MongoDB 5.0, puedes refragmentar una colección al cambiar la clave de fragmentación de un documento.
MongoDB proporciona el comando refineCollectionShardKey. Refinar la clave de partición de una colección permite una distribución de datos más precisa y puede abordar situaciones en las que la insuficiente cardinalidad de la clave existente conduce a fragmentos jumbo.
Para aprender si se debe redistribuir la colección o refinar la clave de partición, se puede consultar Cambiar la clave de partición.
Para obtener más información, consulte:
moveChunk directorio
En MongoDB 2.6 y MongoDB,3.0 sharding.archiveMovedChunks está habilitado por defecto. Todas las demás versiones de MongoDB lo tienen deshabilitado por defecto. Con habilitado, el fragmento de origen archiva los documentos de los fragmentos migrados en un directorio con el nombre del espacio de nombres de la colección, dentro sharding.archiveMovedChunks del moveChunk directorio storage.dbPath en.
Si ocurre algún error durante una migración, estos archivos pueden ser útiles para recuperar los documentos afectados durante la migración.
Una vez que la migración se haya completado correctamente y no sea necesario recuperar documentos de estos archivos, puede eliminarlos de forma segura. O bien, si tiene una copia de seguridad de la base de datos que pueda usar para la recuperación, también puede eliminarlos después de la migración.
Para determinar si se completaron todas las migraciones, ejecute sh.isBalancerRunning() mientras esté conectado a una mongos instancia.