Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/

particionado

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.

Existen dos métodos para abordar el crecimiento del sistema: el escalado vertical y el escalado horizontal.

El escalado vertical aumenta la capacidad de un único servidor mediante el uso de una CPU más potente, la adición de más RAM o la ampliación del almacenamiento. La tecnología disponible y las configuraciones de hardware de los proveedores de la nube imponen un límite práctico para el escalado vertical.

El escalado horizontal consiste en dividir el conjunto de datos y la carga del sistema entre varios servidores, añadiendo más servidores para aumentar la capacidad según sea necesario. Cada máquina gestiona un subconjunto de la carga de trabajo total, lo que puede resultar más económico que adquirir hardware de gama alta para una sola máquina. La contrapartida 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.

Nota

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: El mongos actúa como un enrutador de queries, proporcionando una interfaz entre las aplicaciones del cliente y el clúster.

  • 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:

Diagrama de un clúster de muestra para fines de producción. Contiene exactamente 3 servidores de configuración, 2 o más enrutadores de query ``mongos`` y al menos 2 particiones. Las particiones son sets de réplicas.

MongoDB fragmenta los datos a nivel de colección, distribuyendo los datos de la colección entre los fragmentos del clúster.

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 documents en colecciones particionadas pueden carecer de los campos clave de partición. Los campos faltantes de la clave de partición se tratan como valores nulos al distribuir los documentos en los shards, pero no al enrutar consultas. Para obtener más información, consulta Establecer los campos de clave de partición que faltan.

Se selecciona la clave de fragmentación al fragmentar una colección.

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.

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.

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.

Tip

MongoDB divide los datos fragmentados en fragmentos. Cada fragmento tiene un rango inferior inclusivo y superior exclusivo basado en la clave de fragmentación.

Para lograr una distribución uniforme de los datos en todos los fragmentos del clúster, un equilibrador se ejecuta en segundo plano para migrar los rangos entre los fragmentos.

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.

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.

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.

Los requisitos y la complejidad de la infraestructura de clústeres fragmentados requieren una planificación, una ejecución y un mantenimiento cuidadosos.

Si bien puedes redistribuir tu colección más adelante, elige cuidadosamente la clave de fragmentació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.

Cuando se ejecuta el método sh.shardCollection(), el balanceador comienza a distribuir los datos de la colección a otras particiones del clúster. Una sola partición solo puede participar en una migración de fragmento a la vez. Cuando MongoDB copia un rango de datos de una partición a otra correctamente, el rango en la partición donante se marca para su eliminación por el eliminador de rangos. Este proceso es lento y requiere muchos recursos.

A partir de MongoDB 8.0, si la implementación cumple los requisitos de recursos, se recomienda usar el método sh.shardAndDistributeCollection() para particionar la colección. Este método encapsula los comandos shardCollection y reshardCollection para particionar la colección y redistribuirla de inmediato con la misma clave. Esto hace que MongoDB vuelva a equilibrar los datos entre las particiones sin esperar al balanceador.

Para obtener más información, se puede consultar Redistribuir con la misma clave de partición.

Una base de datos puede tener una combinación de colecciones particionadas y no particionadas. Las colecciones particionadas son particionadas y distribuidas entre las particiones en el clúster. Las colecciones no particionadas pueden ubicarse en cualquier partición, pero no pueden distribuirse entre varias particiones.

Diagrama de un fragmento primario. Un fragmento primario contiene colecciones no fragmentadas, así como fragmentos de documentos de colecciones fragmentadas. La partición A es el fragmento primario.

Para interactuar con cualquier colección en el clúster fragmentado, debe conectarse a un enrutador de mongos. Esto incluye colecciones fragmentadas y no fragmentadas. Los clientes nunca deben conectarse a una única partición para realizar operaciones de lectura o escritura.

A partir de MongoDB 8.3, solo puedes ejecutar operaciones DDL y applyOps en un mongos para todos los clústeres fragmentados. Estas operaciones pueden estar temporalmente no disponibles durante la transición de un set de réplicas a un clúster.

Diagrama de aplicaciones o controladores que emiten los query a mongos para una colección no fragmentada, así como para una colección fragmentada. Los servidores de configuración no se muestran.

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.

Nota

A partir de MongoDB 8.0, solo puedes ejecutar ciertos comandos en nodos de clústeres fragmentados. Si intentas conectarte directamente a un nodo y ejecutar un comando no compatible, MongoDB devuelve un error:

"You are connecting to a sharded cluster improperly by connecting directly
to a shard. Please connect to the cluster via a router (mongos)."

Para ejecutar un comando de base de datos no compatible directamente contra un nodo en un clúster fragmentado, debes conectarte a mongos o tener el rol de solo mantenimiento directShardOperations.

MongoDB admite dos estrategias de fragmentación para distribuir datos en clústeres compartidos.

El método Hashed Sharding calcula un hash del valor del campo de clave de fragmento. A cada fragmento se le asigna un rango basado en los valores de la clave de fragmento hash.

Tip

MongoDB calcula automáticamente los hashes al resolver los query utilizando índices encriptados. Las aplicaciones no necesitan calcular hashes.

Diagrama de la segmentación basada encriptada.

Es improbable que los valores hash compartan el mismo fragmento, lo que proporciona una distribución de datos más uniforme, especialmente para las claves de fragmentación que cambian de forma monótona.

Sin embargo, la distribución mediante hash implica que las consultas basadas en rangos sobre la clave de fragmentación tienen menos probabilidades de dirigirse a una sola fragmentación, lo que da como resultado más operaciones de difusión en todo el clúster.

Consulta la fragmentación encriptada para obtener más información.

La fragmentación por rangos divide los datos en rangos según los valores de la clave de fragmentación, asignando a cada fragmento uno de esos rangos.

Diagrama del espacio del valor de la clave de partición segmentado en rangos o fragmentos más pequeños.

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.

Las zonas mejoran la localización de los datos en clústeres fragmentados 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.

Diagrama de distribución de datos basado en zonas en un clúster particionado
haga clic para ampliar

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.

Al elegir una clave de fragmentación, tenga en cuenta el posible uso futuro de la zona.

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.

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" }

Al crear nuevas colecciones con una intercalación, asegúrese de que se cumplen 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.

Los flujos de cambios están disponibles para sets de réplicas y clústeres particionados. Los flujos de cambios permiten a las aplicaciones acceder a los cambios de datos en tiempo real sin la complejidad ni el riesgo de seguir el oplog.

Las transacciones distribuidas admiten transacciones de múltiples documentos 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.

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.

Volver

base de datos local

Obtén una insignia de habilidad

¡Domina "Estrategias de partición" gratis!

Más información

En esta página