Fragmentación es un método para distribuir datos entre múltiples máquinas. MongoDB utiliza la fragmentación para brindar soporte a las implementaciones con conjuntos de datos muy grandes y operaciones de alto rendimiento.
Los sistemas de bases de datos con grandes conjuntos de datos o aplicaciones de alto rendimiento pueden ser un desafío para la capacidad de un solo servidor. Por ejemplo, las altas tasas de los query pueden agotar la capacidad de la CPU del servidor. Los tamaños de los conjuntos de trabajo que superan la RAM del sistema sobrecargan la capacidad de E/S de las unidades de disco.
Dos métodos abordan el crecimiento del sistema: el escalado vertical y el escalado horizontal.
El escalado vertical aumenta la capacidad de un solo servidor al utilizar una CPU más potente, añadir más RAM o expandir el almacenamiento. La tecnología disponible y las configuraciones de hardware de los proveedores de cloud imponen un máximo práctico para el escalado vertical.
Escalado horizontal implica dividir el conjunto de datos y la carga del sistema entre varios servidores, agregando más servidores para aumentar la capacidad según sea necesario. Cada máquina maneja un subconjunto de la carga de trabajo general, lo que puede costar menos que el hardware de gama alta para una sola máquina. La contraprestación es una mayor complejidad en la infraestructura y el mantenimiento.
Puede clústeres de partición en la Interfaz de Usuario para implementaciones alojadas en MongoDB Atlas.
Clúster fragmentado
Un clúster particionado de MongoDB incluye los siguientes componentes:
partición: cada fragmento contiene un subconjunto de los datos particionados. Cada partición debe implementarse como un set de réplicas.
Enrutamiento con
mongos: Elmongosactúa como un enrutador de consultas, proporcionando una interfaz entre las aplicaciones cliente y el clúster.mongospuede soportar lecturas protegidas para minimizar las latencias.servidores de configuración: los servidores de configuración almacenan metadatos y configuraciones para el clúster. Los servidores de configuración deben implementarse como un set de réplicas (CSRS).
El siguiente gráfico describe la interacción de los componentes dentro de un clúster compartido:
MongoDB fragmenta los datos a nivel de colección, distribuyendo los datos de la colección entre los fragmentos del clúster.
Claves de partición
MongoDB utiliza la clave de fragmentación para distribuir los documentos de la colección entre fragmentos. La clave de fragmentación consiste en uno o varios campos dentro de los documentos.
Los documentos en colecciones particionadas pueden no tener los campos de clave de partición. Los campos de clave de partición faltantes se tratan como si tuvieran valores nulos al distribuir los documentos entre las particiones, pero no al enrutar los query. Para obtener más información, consulta Campos de clave de partición faltantes.
Se selecciona la clave de fragmentación al fragmentar una colección.
A partir de MongoDB 5.0, puedes redistribuir una colección cambiando la clave de partición de una colección.
Para ajustar una clave de fragmentación, agrega un campo o campos de sufijo a la clave de fragmentación existente.
El valor de la clave de partición de un documento determina su distribución entre las particiones. Puede actualizar el valor de la clave de partición de un documento a menos que su campo de valor de la clave de partición sea el campo _id inmutable. Para obtener más información, consulte Cambiar el valor de la clave de partición de un documento.
Índice de clave de fragmentación
Para fragmentar una colección poblada, la colección debe tener un índice que comience con la clave de fragmentación. Al fragmentar una colección vacía, MongoDB crea el índice de soporte si la colección aún no tiene un índice adecuado para la clave de fragmentación especificada. Consulta los índices de clave de fragmentación.
Estrategia de clave de fragmentación
La elección de la clave de partición y su índice de respaldo también puede afectar la estrategia de particionado que el clúster puede utilizar.
Fragmentos
MongoDB divide los datos fragmentados en fragmentos. Cada fragmento tiene un rango inferior inclusivo y superior exclusivo basado en la clave de fragmentación.
Balanceador y distribución uniforme de datos
Para lograr una distribución uniforme de los datos en todos los fragmentos del clúster, un balanceador se ejecuta en segundo plano para migrar los rangos entre las particiones.
Ventajas de la fragmentación
Lecturas/escritura
MongoDB distribuye la carga de trabajo de lectura y escritura a través de los fragmentos en el clúster fragmentado, permitiendo que cada fragmento procese un subconjunto de operaciones del clúster. Tanto las cargas de trabajo de lectura como de escritura se pueden escalar horizontalmente en el clúster agregando más fragmentos.
Para los query que incluyen la clave de fragmentación o el prefijo de una clave de fragmentación compuesta, mongos puede dirigir la consulta a un fragmento específico o a un conjunto de particiones. Estas operaciones dirigidas son generalmente más eficientes que la difusión a cada partición en el clúster.
mongos puede brindar soporte para lecturas protegidas para minimizar las latencias.
Capacidad de almacenamiento
La fragmentación distribuye los datos a través de las particiones en el clúster para que cada fragmento contenga un subconjunto de los datos totales del clúster. A medida que el conjunto de datos crece, las particiones adicionales incrementan la capacidad de almacenamiento del clúster.
Alta disponibilidad
La implementación de servidores de configuración y particiones como sets de réplicas proporciona una mayor disponibilidad.
Incluso si uno o más sets de réplicas de particiones se vuelven completamente inaccesibles, el clúster puede continuar realizando lecturas y escrituras parciales. Es decir, aunque no se pueda acceder a los datos en las particiones no disponibles, las lecturas o las escrituras dirigidas a los fragmentos disponibles aún pueden realizarse con éxito.
Consideraciones antes de la fragmentación
Los requisitos y la complejidad de la infraestructura de clústeres fragmentados requieren una planificación, una ejecución y un mantenimiento cuidadosos.
Una vez que una colección ha sido particionada, MongoDB no proporciona ningún método para desfragmentar una colección particionada.
Si bien puede reasignar fragmentos de su colección más adelante, considere cuidadosamente su elección de clave de partición para evitar problemas de escalabilidad y rendimiento.
Para entender los requisitos operativos y las restricciones para la fragmentación de la colección, se debe consultar Restricciones operativas en clústeres particionados.
Si los query no incluyen la clave de fragmentación o el prefijo de una clave de fragmentación compuesta, mongos realiza una operación de difusión, consultando todas las particiones en el clúster fragmentado. Estos query de dispersión/recopilación pueden ser operaciones de larga duración.
A partir de MongoDB 5.1, al iniciar, reiniciar o añadir un servidor de particiones con sh.addShard() se debe establecer el nivel de confirmación de escritura (write concern) a nivel de clúster (CWWC).
Si el CWWC no está establecido y el fragmento está configurado de tal manera que el nivel de confirmación de escritura por defecto es { w : 1 }, el servidor de fragmentos no se iniciará o no se añadirá y devolverá un error.
Consulta los cálculos del nivel de confirmación de escritura (write concern) por defecto para obtener más información sobre cómo se calcula el nivel de confirmación de escritura por defecto.
Nota
Si hay un contrato de soporte activo con MongoDB, se debe considerar contactar al representante de cuenta para recibir ayuda con la planificación e implementación de clústeres particionados.
Colecciones fragmentadas y no fragmentadas
Una base de datos puede tener una mezcla de colecciones particionadas y no particionadas. Las colecciones fragmentadas se particionan y distribuyen entre las particiones del clúster. Las colecciones sin particiones se almacenan en una partición primaria. Cada base de datos tiene su propia partición primaria.
Conexión a un clúster fragmentado
Debe conectarse a un mongos router para interactuar con cualquier colección en el clúster fragmentado. Esto incluye colecciones fragmentadas y no fragmentadas. Los clientes no deben conectarse a una sola partición para realizar operaciones de lectura o guardado.
Es posible realizar la conexión a un mongos de la misma manera que se hace la conexión a un mongod usando el mongosh o un driver de MongoDB.
Estrategia de fragmentación
MongoDB admite dos estrategias de fragmentación para distribuir datos en clústeres compartidos.
Particionamiento encriptado
El particionado por hash calcula un hash del valor del campo del clave de partición. A cada fragmento se le asigna un rango basado en los valores de la clave de partición con hash.
Tip
MongoDB calcula automáticamente los hashes al resolver los query utilizando índices encriptados. Las aplicaciones no necesitan calcular hashes.
Es poco probable que los valores encriptados compartan el mismo fragmento, lo que proporciona una distribución de datos más uniforme, especialmente para las claves de partición que cambian monotónicamente.
Sin embargo, la distribución encriptada significa que las consultas basadas en rangos sobre la clave de fragmento tienen menos probabilidades de dirigirse a un único fragmento, lo que resulta en más operaciones de difusiónen todo el clúster.
Consulta la fragmentación encriptada para obtener más información.
Particionamiento clasificado por rango
El particionado clasificado por rango divide los datos en rangos basados en los valores de la clave de partición, asignando a cada fragmento uno de estos rangos.
Es más probable que un rango de claves de fragmentación cuyos valores son "cercanos" residan en el mismo fragmento. Esto permite operaciones dirigidas, ya que un mongos puede dirigir las operaciones únicamente a las particiones que contienen los datos necesarios.
La eficiencia de la fragmentación clasificada por rango depende de la clave de fragmentación seleccionada. Las claves de fragmentación mal diseñadas pueden provocar una distribución desigual de los datos, lo que puede anular algunos beneficios de la fragmentación o causar cuellos de botella en el rendimiento. Ve selección de clave de fragmentación para fragmentación basada en rango.
Consulta Fragmentación clasificada por rango para obtener más información.
Zonas en clústeres compartidos
Las zonas mejoran la localización de los datos para clústeres particionados que abarcan varios centros de datos.
En clústeres particionados, puedes crear zonas de datos particionados basadas en la clave de partición. Puedes asociar cada zona con una o más particiones en el clúster. Una partición puede asociarse con cualquier cantidad de zonas. En un clúster equilibrado, MongoDB migra fragmentos cubiertos por una zona solo a aquellas particiones asociadas con la zona.
Cada zona cubre uno o más rangos de valores de clave de fragmentación. Cada rango que cubre una zona siempre incluye su límite inferior y excluye su límite superior.
Debes usar los campos contenidos en la clave de fragmentación al definir un nuevo rango para que una zona lo cubra. Si utilizas una clave de fragmentación compuesta, el rango debe incluir el prefijo de la clave de fragmentación. Consulta claves de fragmentación en zonas para más información.
Considere el posible uso futuro de zonas al elegir una clave de partición.
Tip
Configurar zonas y rangos de zonas antes de particionar una colección vacía o inexistente permite una configuración más rápida de la partición zonificada.
Consulta las zonas para obtener más información.
Intercalaciones en la fragmentación
Utiliza el comando shardCollection con la opción collation :
{ locale : "simple" } para fragmentar una colección que tenga una intercalación por defecto. Para que la fragmentación sea exitosa, se requiere que:
La colección debe tener un índice cuyo prefijo sea la clave de fragmentación
El índice debe tener la intercalación
{ locale: "simple" }
Cuando se creen nuevas colecciones con una intercalación, se deben cumplir estas condiciones antes de fragmentar la colección.
Nota
Los query en la colección fragmentada continúan utilizando la intercalación por defecto configurada para la colección. Para usar la intercalación del índice de clave de fragmentación simple, especifique {locale : "simple"} en el documento de intercalación del query.
Consulta shardCollection para obtener más información sobre la fragmentación y la intercalación.
Flujos de cambio
A partir de MongoDB 3.6, change streams están disponibles para sets de réplicas y clústeres. Las corrientes de cambio permiten a las aplicaciones acceder a cambios de datos en tiempo real sin la complejidad ni el riesgo de rastrear el oplog. Las aplicaciones pueden usar flujos de cambios para suscribirse a todos los cambios en los datos de una colección o colecciones.
Transacciones
Las transacciones distribuidas admiten transacciones multidocumento en clústeres fragmentados.
Hasta que se produzca la confirmación de una transacción, los cambios de datos realizados en la transacción no son visibles fuera de la transacción.
Sin embargo, cuando una transacción se guarda en múltiples fragmentos, no todas las operaciones de lectura externas necesitan esperar a que el resultado de la transacción confirmada sea visible en todos los fragmentos. Por ejemplo, si se confirma una transacción y la escritura 1 es visible en el fragmento A, pero la escritura 2 aún no es visible en el fragmento B, una lectura externa con el nivel de consistencia de lectura "local" puede leer los resultados de la escritura 1 sin ver la escritura 2.
Obtén más información
E-Book práctico de agregaciones de MongoDB
Para obtener más información sobre cómo funciona el particionado con agregaciones, lee el capítulo sobre particionado en Agregaciones prácticas en MongoDB e-book.