La fragmentación hash utiliza un índice hash de campo único o un índice hash compuesto como clave de fragmento para particionar datos en su clúster fragmentado.
- Particionado en un índice hash de campo único
La fragmentación hash proporciona una distribución de datos más uniforme en el clúster fragmentado, a costa de reducir las operaciones dirigidas frente a las operaciones de difusión. Tras el hash, es poco probable que los documentos con valores de clave de fragmento "similares" se encuentren en el mismo fragmento o fragmento.
mongosEs más probable que realice operaciones de difusión para cumplir con una consulta de rango determinada.mongospuede orientar consultas con coincidencias de igualdad a un solo fragmento.Los índices hash calculan el valor hash de un solo campo como valor de índice; este valor se utiliza como su clave de fragmento. []1
- Fragmentación en un índice hash compuesto
MongoDB permite crear índices compuestos con un único campo hash. Para crear un índice compuesto hash, especifique
hashedcomo valor de cualquier clave de índice al crear el índice.El índice hash compuesto calcula el valor hash de un solo campo en el índice compuesto; este valor se utiliza junto con los otros campos en el índice como su clave de fragmento.
La partición compuesta encriptada soporta funcionalidades como particionado por zona, donde el prefijo (es decir, primeros) campo(s) no hash admiten rangos de zona mientras que el campo encriptada admite una distribución más uniforme de los datos particionados. La partición con hash compuesto también admite claves de partición con un prefijo de hash para resolver problemas de distribución de datos relacionados con campos monotonamente crecientes.
Tip
MongoDB calcula automáticamente los hashes al resolver los query utilizando índices encriptados. Las aplicaciones no necesitan calcular hashes.
Advertencia
Los índices de MongoDB hashed truncan los números de punto flotante a enteros de 64 bits antes del hashing. Por ejemplo, un índice hashed almacenaría el mismo valor para un campo que tuviera un valor de 2.3, 2.2 y 2.9. Para evitar colisiones, no uses un índice hashed para números flotantes que no puedan convertirse de manera fiable a enteros de 64 bits (y luego volver a números flotantes). Los índices de MongoDB hashed no admiten valores de coma flotante superiores a 2 53.
Para ver cuál sería el valor hash de una clave,convertShardKeyToHashed() consulte.
| [1] | mongosh proporciona el método. Este método utiliza la misma función hash que el índice hash y permite determinar cuál sería el valor hash de una convertShardKeyToHashed() clave. |
Clave de partición de particionado encriptada
El campo que elija como clave de fragmento con hash debe tener una buena cardinalidad o un gran número de valores diferentes. Las claves con hash son ideales para claves de fragmento con campos que cambian monótonamente, como valores de ObjectId o marcas de tiempo. Un buen ejemplo de esto es el _id campo predeterminado, asumiendo que solo contiene valores de ObjectId.
Para fragmentar una colección utilizando una clave de fragmento con hash, consulte Fragmentar una colección.
Particionado encriptado frente a particionado clasificado por rango
Dada una colección que utiliza un valor monótonamente creciente X como clave de fragmento, el uso de fragmentación por rango da como resultado una distribución de inserciones entrantes similar a la siguiente:
Dado que el valor de X siempre aumenta, el fragmento con un límite superior de MaxKey recibe la mayoría de las escrituras entrantes. Esto restringe las operaciones de inserción al fragmento que contiene este fragmento, lo que reduce o elimina la ventaja de las escrituras distribuidas en un clúster fragmentado.
Al utilizar un índice hash en X, la distribución de inserciones es similar a la siguiente:
Como ahora los datos se distribuyen de manera más uniforme, las inserciones se distribuyen de manera eficiente en todo el clúster.
Fragmentar la colección
Utilice el método, especificando el espacio de nombres sh.shardCollection() completo de la colección y el índice hash de destino para usar como clave de fragmento.
sh.shardCollection( "database.collection", { <field> : "hashed" } )
Para fragmentar una colección en un índice hash compuesto, especifique el espacio de nombres completo de la colección y el índice hash compuesto de destino que se utilizará como clave de fragmentación:
sh.shardCollection( "database.collection", { "fieldA" : 1, "fieldB" : 1, "fieldC" : "hashed" } )
Importante
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.
Fragmentar una colección poblada
Si fragmenta una colección poblada utilizando una clave de fragmento con hash:
La operación de fragmentación crea un fragmento inicial para cubrir todos los valores de clave de fragmentación.
Después de la creación del fragmento inicial, el equilibrador mueve rangos del fragmento inicial cuando necesita equilibrar datos.
Fragmentar una colección vacía
La operación de recopilación de fragmentos puede crear y distribuir fragmentos inicialmente para colecciones vacías o inexistentes si se han definido zonas y rangos de zonas para la colección. La creación y distribución inicial de fragmentos permite una configuración más rápida de la fragmentación por zonas. Tras la distribución inicial, el balanceador gestiona la distribución de fragmentos de forma habitual.
- Particionado de una colección vacía en una clave de partición con hash por un solo campo
Sin zonas ni rangos de zonas especificados para la colección vacía o inexistente:
La operación de fragmentación crea un fragmento vacío que cubre todo el rango de valores de clave de fragmento. A partir de la versión 8.0, la operación crea 1 fragmentos por fragmento de forma predeterminada y migra por todo el clúster. 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.
Con zonas y rangos de zonas especificados 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.
- Fragmentación de una colección vacía en una clave de fragmento con hash compuesto con prefijo de campo con hash
Si la clave de fragmento compuesta con hash tiene el campo con hash como prefijo (el campo con hash es el primer campo en la clave de fragmento):
Sin zonas ni rangos de zonas especificados para la colección vacía o inexistente:
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. El valor de todos los campos sin hash es en cada punto de división. A partir de
MinKeyla 8.0 versión, la operación crea 1 fragmentos por fragmento de forma predeterminada y migra por todo el clúster. 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.
Con una única zona con un rango de
MinKeyaMaxKeyespecificado para la colección vacía o inexistente y lapresplitHashedZonesopción especificadash.shardCollection()en:La operación de fragmentación crea fragmentos vacíos para el rango de zona definido, así como fragmentos adicionales para cubrir todo el rango de valores de clave de fragmentación, y realiza una distribución inicial de fragmentos según los rangos de zona. Esta creación y distribución inicial de fragmentos permite una configuración más rápida de la fragmentación por zonas.
Después de la distribución inicial, el balanceador gestiona la distribución de fragmento en adelante.
- Fragmentación de una colección vacía en una clave de fragmento con hash compuesto y un prefijo sin hash
Si la clave de fragmento compuesta con hash tiene uno o más campos no hash como prefijo (es decir, el campo hash no es el primer campo en la clave de fragmento):
Si no se especifican zonas ni rangos de zonas para la colección vacía o inexistente y preSplitHashedZones es
falseo se omite, MongoDB no realiza ninguna creación o distribución de fragmentos inicial al fragmentar la colección.Si no se especifican zonas ni rangos de zonas para la colección vacía o inexistente y preSplitHashedZones,
sh.shardCollection()/ devuelve unshardCollectionerror.Con zonas y rangos de zonas especificados para la colección vacía o inexistente y la opción preSplitHashedZones especificada
sh.shardCollection()en:La operación de fragmentación crea fragmentos vacíos para los rangos de zona definidos, así como fragmentos adicionales para cubrir todo el rango de valores de clave de fragmentación.
La operación de fragmentación subdivide aún más el fragmento inicial para cada rango, de modo que a cada fragmento de la zona se le asigna una cantidad igual de fragmentos.
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.
Los rangos definidos para cada zona deben cumplir ciertos requisitos. Para una descripción de los requisitos y un ejemplo completo, consulta Predefinir Zonas y Rangos de Zona para una Colección Vacía o Inexistente.
Descartar un índice de clave de partición con hash
A partir de MongoDB 7.0.3 (y 6.0.12 y 5.0.22), puedes descartar el índice de una clave de fragmentación encriptada.
Esto puede acelerar la inserción de datos para colecciones particionadas con una clave de partición con hash.
Para obtener más información, consulta Descartar un índice de clave de fragmentación encriptada.
Tip
Para aprender a implementar un clúster fragmentado e implementar la fragmentación hash, consulte Implementar un clúster fragmentado autoadministrado.