El particionado por hash utiliza ya sea un índice hash de campo único o un índice hash compuesto como clave de partición para particionar los datos en tu clúster.
- Particionado en un índice hash de campo único
El uso de particionamiento hash permite una distribución de datos más uniforme en el clúster particionado a costa de reducir las Operaciones apuntadas frente a operaciones de transmisión. Después del hash, es poco probable que documentos con valores de la clave de partición "cercanos" estén en el mismo fragmento o partición - el
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 el valor del índice; este valor se utiliza como tu clave de partición. [1]
- Fragmentación en un índice hash compuesto
MongoDB incluye soporte para la creación de índices compuestos con un solo campo encriptado. Para crear un índice compuesto hasheado, se debe especificar
hashedcomo el valor de cualquier clave de índice individual al crear el índice.El índice compuesto con hash calcula el valor hash de un solo campo en el índice compuesto; este valor se utiliza junto con los otros campos del índice como tu clave de partición.
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 encriptada para una clave, consulta convertShardKeyToHashed().
| [1] | mongosh proporciona el método convertShardKeyToHashed(). Este método utiliza la misma función encriptada que el índice encriptada y puede utilizarse para ver cuál sería el valor encriptada para una clave. |
Clave de partición de particionado encriptada
El campo que elijas como tu clave de partición con hash debe tener una buena cardinalidad, o un gran número de valores diferentes. Las claves hash son ideales para claves de partición con campos que cambian monótonamente como los valores ObjectId o las marcas de tiempo. Un buen ejemplo de ello es el campo _id por defecto, asumiendo que solo contiene valores ObjectId.
Para fragmentar una colección utilizando una clave de partición con hash, consulte Fragmentar una colección.
Particionado encriptado frente a particionado clasificado por rango
Dada una colección que utiliza un valor X monótonamente creciente como la clave de partición, el uso de particionado clasificado 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 usar un índice encriptado en X, la distribución de inserciones es similar a la siguiente:
Dado que los datos ahora están distribuidos de manera más uniforme, las inserciones se distribuyen de manera eficiente en todo el clúster.
Fragmenta 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.
Crear particiones en una colección poblada
Si particionas una colección poblada mediante una clave de partición hasheada:
La operación de particionado crea un fragmento inicial para cubrir todos los valores de la clave de partición.
Tras la creación inicial del fragmento, el equilibrador mueve rangos del fragmento inicial cuando necesita equilibrar los datos.
Particionar 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 particionado crea un fragmento vacío para cubrir el rango total de valores de la clave de partición. A partir de la versión 8.0, la operación crea 1 fragmento por partición por defecto y los migra por todo el clúster. Esta creación inicial y distribución de fragmentos permite una configuración más rápida del particionado.
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 fragmentada encriptada compuesta tiene el campo encriptado como prefijo (el campo encriptado es el primer campo en la clave fragmentada):
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.
- Particionado de una colección vacía en una clave de particionamiento compuesta hasheada con un prefijo no hasheado
Si la clave de partición compuesta encriptada tiene uno o más campos no encriptadas como prefijo (es decir, el campo encriptada no es el primer campo en la clave de partición):
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.Sin zonas ni rangos de zonas especificados para la colección vacía o inexistente y preSplitHashedZones,
sh.shardCollection()/shardCollectiondevuelve un error.Con las zonas y los rangos de zona especificados para la colección vacía o inexistente y la opción preSplitHashedZones especificada en
sh.shardCollection():La operación de particionado crea fragmentos vacíos para los rangos de zona definidos, así como cualquier fragmento adicional para cubrir todo el rango de los valores de la clave de partición.
La operación de particionado subdivide aún más el fragmento inicial para cada rango, de modo que a cada partición en la zona se le asigna un número 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 cómo implementar un clúster y implementar particionado encriptada, consulta Implementar un Clúster autogestionado.