La elección de la clave de fragmento afecta la creación y Distribución de fragmentos entre los fragmentos disponibles. La distribución de datos afecta la eficiencia y el rendimiento de las operaciones dentro del clúster fragmentado.
La clave de partición ideal permite a MongoDB distribuir los documentos uniformemente por todo el clúster, a la vez que facilita patrones de queries comunes.
Cuando se elija la clave de partición, se debe considerar:
el cardinalidad de la clave del fragmento
la frecuencia con la que se producen los valores de la clave de partición
si una posible clave de partición crece de forma monótona
Nota
A partir de MongoDB,5.0 puede cambiar su clave de fragmento y redistribuir sus datos utilizando la
reshardCollectiondominio.Puedes utilizar el comando
refineCollectionShardKeypara refinar la clave de partición de una colección. El comandorefineCollectionShardKeyañade un campo o campos de sufijo a la clave existente para crear la nueva clave de partición.Puede actualizarse el valor de clave de partición de un documento a menos que el campo de clave de partición sea el campo
_idinmutable.
Importante
Si se cambia regularmente el valor de la clave de partición de un documento para que el valor esté en un rango de clave de partición propiedad de otra partición, se puede tener un impacto en el rendimiento del clúster debido a los recursos adicionales que implica migrar el documento entre particiones. Para más detalles, se puede consultar Particionamiento de datos con fragmentos y db.colección.updateOne().
Cardinalidad de la clave de partición
La cardinalidad de una clave de partición determina la cantidad máxima de fragmentos que el balanceador puede crear. Siempre que sea posible, se debe elegir una clave de partición con alta cardinalidad. Una clave de partición con baja cardinalidad reduce la eficacia del escalado horizontal en el clúster.
Cada valor de la clave de partición único puede existir en no más de un fragmento en cualquier momento dado. Se debe considerar un conjunto de datos que contenga datos de usuario con un campo continent. Si se elige particionar en continent, la clave de partición tendría una cardinalidad de 7. Una cardinalidad de 7 significa que no puede haber más de 7 fragmentos dentro del clúster, cada uno de los cuales almacena un valor de la clave de partición único. Esto limita el número de particiones efectivas en el clúster a 7 también; añadir más de siete fragmentos no aportaría ningún beneficio.
La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si X tiene una cardinalidad baja, la distribución de las inserciones puede ser similar a la siguiente:
Si un modelo de datos requiere el particionado en una clave que tenga baja cardinalidad, se debe considerar usar un compuesto indexado de campos para aumentar la cardinalidad.
Una clave de partición con alta cardinalidad no garantiza por sí sola una distribución uniforme de los datos en el clúster. La frecuencia de la clave de partición y la posibilidad de que los valores de la clave de partición cambien monotónicamente también contribuyen a la distribución de los datos.
Frecuencia de clave de partición
La frequency del valor de la clave de partición indica con qué frecuencia aparece un valor de la clave de partición en los datos. Si la mayoría de los documentos contienen solo un subconjunto de los posibles valores de la clave de partición, entonces los fragmentos que almacenan esos documentos pueden convertirse en un cuello de botella dentro del clúster. Además, a medida que esos fragmentos crecen, pueden convertirse en fragmentos indivisibles ya que no se pueden dividir más. Esto reduce la efectividad del escalado horizontal dentro del clúster.
La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si un subconjunto de valores para X ocurre con alta frecuencia, la distribución de las inserciones puede ser similar a la siguiente:
Si un modelo de datos requiere particionado en una clave que tiene valores de alta frecuencia, se debe considerar usar un índice compuesto utilizando un valor único o de baja frecuencia.
Una clave de partición con baja frecuencia no garantiza por sí sola una distribución uniforme de los datos a través del clúster. La cardinalidad de la clave de partición y la posibilidad de que los valores de la clave de partición cambien monotónicamente también contribuyen a la distribución de los datos.
Claves de partición que cambian monótonamente
Una clave de partición basada en un valor que aumenta o disminuye de manera monótona tiene más probabilidades de distribuir las inserciones en un único fragmento dentro del clúster.
Esto ocurre porque cada clúster tiene un fragmento que captura un rango con un límite superior de MaxKey. maxKey siempre se compara como mayor que todos los demás valores. De manera similar, hay un fragmento que captura un rango con un límite inferior de MinKey. minKey siempre te comparas por debajo de todos los demás valores.
Si el valor de la clave de partición está siempre aumentando, todos los nuevos insertos se enrutan al fragmento con maxKey como cota superior. Si el valor de la clave de partición siempre disminuye, todos los nuevos insertos se enrutan al fragmento con minKey como cota inferior. La partición que contiene ese fragmento se convierte en el cuello de botella para las operaciones de guardar.
Para optimizar la distribución de datos, los fragmentos que contienen el maxKey (o minKey) global no permanecen en la misma partición. Cuando se produce una división de un fragmento, el nuevo fragmento con el maxKey (o minKey) se encuentra en otra partición.
La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si los valores de X aumentan monótonamente, la distribución de las inserciones puede ser similar a la siguiente:
Si el valor de la clave de partición disminuyera monótonamente, todas las inserciones se dirigirían a Chunk A .
Una clave de partición que no cambia de forma monótona no garantiza por sí sola una distribución uniforme de los datos a través del clúster. La cardinalidad y la frecuencia de la clave de partición también contribuyen a la distribución de los datos.
Patrones de queries de particionado
La clave de partición ideal distribuye los datos de manera uniforme en el clúster, al tiempo que facilita los patrones de queries comunes. Cuando se elija una clave de partición, se deben considerar los patrones de queries más comunes y si una determinada clave de partición los cubre.
En un clúster particionado, la mongos dirige las queries solo a las particiones que contienen los datos relevantes si las queries contienen la clave de partición. Cuando las consultas no contienen la clave de partición, las consultas se transmiten a todas las particiones para su evaluación. Este tipo de consultas se denominan consultas de recopilación dispersa. Las consultas que implican varias particiones para cada solicitud son menos eficaces y no escalan linealmente a medida que se añaden más particiones al clúster.
Esto no se aplica a las queries de agregación que operan en una gran cantidad de datos. En estos casos, la dispersión-recopilación puede ser un enfoque útil que permite que la query se ejecute en paralelo en todas las particiones.
Usa el analizador de clave de partición en 7.0 para encontrar tu clave de partición
A partir de la versión 7.0, MongoDB facilita la elección de la clave de partición. Se puede usar analyzeShardKey que calcula las métricas para evaluar una clave de fragmentación para una colección no particionada o particionada. Las métricas se basan en queries muestreadas, lo que permite tomar una decisión basada en datos para la clave de partición.
Habilitar el muestreo de query
Para analizar una clave de fragmentación, debes habilitar el muestreo de query en la colección de destino. Para obtener más información, consulta:
configureQueryAnalyzercomando de base de datosdb.collection.configureQueryAnalyzer()método del shell
Para supervisar el proceso de muestreo de query, utiliza la etapa $currentOp. Para un ejemplo, consulte queries de muestra.
Comandos de análisis de claves de partición
Para analizar una clave de fragmentación, consulte:
analyzeShardKeycomando de base de datosdb.collection.analyzeShardKey()método del shell
analyzeShardKey Devuelve métricas sobre las características clave de una clave de fragmentación y su distribución de lectura y guardado. Las métricas se basan en queries de muestra.
El campo
keyCharacteristicscontiene métricas sobre la cardinalidad, la frecuencia y la monotonicidad de la clave de partición.El campo
readWriteDistributioncontiene métricas sobre los patrones de enrutamiento de las queries y la distribución de la carga de los rangos de clave de partición.