Definición
analyzeShardKeyNuevo en la versión 7.0.
Calcula métricas para evaluar una clave de partición para una colección no particionada o particionada. Las métricas se basan en consultas de muestra. Puedes usar
configureQueryAnalyzerpara configurar el muestreo de consultas en una colección.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
analyzeShardKey tiene esta sintaxis:
db.collection.analyzeShardKey( <shardKey>, { keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
Campos de comandos
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| Documento | Requerido | Clave de partición a analizar. Esto puede ser una clave candidata de partición para una colección no particionada o particionada, o la clave actual de partición para una colección particionada. No hay ningún valor por defecto. |
| booleano | Opcional | Si se calculan o no las métricas sobre las características de la clave de partición. Para obtener detalles, consulta keyCharacteristics. Se establece por defecto en |
| booleano | Opcional | Si se calculan o no las métricas sobre la distribución de lecturas y guardados. Para más detalles, consulta readWriteDistribution. Se establece por defecto en Para devolver las métricas de distribución de lectura y guardar de una colección utilizando |
| doble | Opcional | La proporción de documentos de la colección que se muestrea al calcular las métricas sobre las características de la clave de fragmento. Si se establece Debe ser mayor que No hay ningún valor por defecto. |
| entero | Opcional | El número de documentos que se muestrearán al calcular las métricas sobre las características de la clave de fragmento. Si se establece Si no se especifica y |
Comportamiento
analyzeShardKey devuelve diferentes métricas dependiendo de los valores keyCharacteristic y readWriteDistribution que especifiques al ejecutar el método.
Métricas sobre las características de la clave de partición
keyCharacteristic Consiste en las métricas sobre la cardinalidad, frecuencia y monotonía de la clave del fragmento. Estas métricas solo se devuelven cuando keyCharacteristics es verdadero.
Las métricas se calculan cuando se ejecuta analyzeShardKey en función de los documentos muestreados de la colección. El cálculo requiere que la clave de partición tenga un índice de soporte. Si no hay un índice de apoyo, no se devuelven métricas.
Puedes configurar el muestreo con los campos sampleRate y sampleSize. Ambos son opcionales, pero solo se puede especificar uno. Cuando ni sampleRate ni sampleSize están especificados, MongoDB utiliza el valor del parámetro analyzeShardKeyCharacteristicsDefaultSampleSize, que tiene un valor por defecto de 10 millones.
Para calcular métricas basadas en todos los documentos de la colección, establece el sampleRate en 1.
Métricas sobre la distribución de lectura y escritura
readWriteDistribution contiene métricas sobre los patrones de enrutamiento de consultas y la popularidad de los rangos de claves de fragmentos. Estas métricas se basan en consultas de muestra.
Para configurar el muestreo de query para una colección, usa el comando configureQueryAnalyzer. Las métricas de distribución de lectura y guardado solo se devuelven si readWriteDistribution es true. Las métricas se calculan cuando analyzeShardKey se ejecuta y las métricas usan las consultas de lectura y escritura seleccionadas. Si no hay queries muestreadas, no se devuelven las métricas de distribución de lectura y escritura.
Si no hay consultas de lectura muestreadas, el comando devuelve
writeDistributionpero omitereadDistribution.Si no hay queries de guardar muestreadas, el comando devuelve
readDistributionpero omitewriteDistribution.
Para devolver métricas de distribución de lectura y guardado para una colección usando analyzeShardKey, debes configurar el analizador de querys para muestrear las querys ejecutadas en la colección. De lo contrario, analyzeShardKey devuelve las métricas de distribución de lectura y escritura como valores 0. Para configurar el analizador de consultas, consulta configureQueryAnalyzer (comando de base de datos).
keyCharacteristics Valor | readWriteDistribution Valor | Resultados devueltos |
|---|---|---|
|
|
|
|
|
|
|
|
|
Comportamiento sin bloqueo
analyzeShardKey no bloquea lecturas ni escrituras en la colección.
Muestreo de query
La calidad de las métricas sobre la distribución de lectura y escritura se determina por cuán representativo es la carga de trabajo cuando ocurre el muestreo de consultas. Para algunas aplicaciones, devolver métricas representativas puede requerir mantener el muestreo de query activado durante varios días.
Índices de soporte
El índice de soporte requerido por analyzeShardKey es diferente del índice de soporte requerido por el shardCollection comando.
Esta tabla muestra los índices de soporte para la misma clave de fragmento tanto para analyzeShardKey como para shardCollection:
Comando | clave de partición | Índices de soporte |
|---|---|---|
|
|
|
|
|
|
Esto permite analizar una clave de partición que puede que aún no tenga un índice compatible necesario para particionarla.
Tanto analyzeShardKey como shardCollection tienen los siguientes requisitos de índice:
El índice tiene una intercalaciónsencilla
El índice no es multiclave
El índice no es parcial
El índice no es parcial
Para crear índices de apoyo, utilice el db.collection.createIndex() método.
preferencia de lectura
Para minimizar el rendimiento, ejecuta analyzeShardKey con la preferencia de lectura secondary o secondaryPreferred. En un clúster fragmentado, mongos establece automáticamente la preferencia de lectura en secondaryPreferred si no se especifica.
Limitaciones
No puedes ejecutar
analyzeShardKeyen Atlas clústeres flexibles.No se puede ejecutar
analyzeShardKeyen implementaciones autónomas.No puedes ejecutar
analyzeShardKeydirectamente contra un--shardsvrset de réplicas. Al ejecutarse en un clúster fragmentado,analyzeShardKeydebe ejecutarse contra unmongos.No se puede ejecutar
analyzeShardKeyen colecciones de series temporales.No se puede ejecutar
analyzeShardKeyen colecciones con Queryable Encryption.
Control de acceso
analyzeShardKey requiere uno de estos roles:
enableShardingacción de privilegio contra la colección que se está analizando.clusterManagerrol contra el clúster.
Salida
analyzeShardKey devuelve información sobre keyCharacteristics y readWriteDistribution.
keyCharacteristicsproporciona métricas sobre la cardinalidad, la frecuencia y la monotonicidad de la clave de partición.readWriteDistributionproporciona métricas sobre los patrones de enrutamiento de query y el nivel de actividad de los rangos de claves de particiones.
keyCharacteristics
Esta es la estructura del documento keyCharacteristics que se devuelve cuando se establece keyCharacteristics en true:
{ keyCharacteristics: { numDocsTotal: <integer>, numOrphanDocs: <integer>, avgDocSizeBytes: <integer>, numDocsSampled: <integer>, isUnique: <bool>, numDistinctValues: <integer>, mostCommonValues: [ { value: <shardkeyValue>, frequency: <integer> }, ... ], monotonicity: { recordIdCorrelationCoefficient: <double>, type: "monotonic"|"not monotonic"|"unknown", } } }
Campo | Tipo | Descripción | Uso |
|---|---|---|---|
| entero | El número de documentos en la colección. | |
| entero | El número de documentos huérfanos. | Los documentos huérfanos no se excluyen del cálculo de métricas por motivos de rendimiento. Si |
| entero | El tamaño promedio de los documentos en la colección, en bytes. | Si |
| entero | El número de documentos muestreados. | |
| entero | El número de valores distintos de clave shard. | Elige una clave de partición con un gran |
| booleano | Indica si la clave de partición es única. Esto solo se configura en | Si la clave de partición es única, entonces el número de valores distintos es igual al número de documentos. |
| arreglo de documentos | Un arreglo de valor y | La frecuencia de un valor de la clave de partición es el número mínimo de documentos en el fragmento que contiene ese valor. Si la frecuencia es grande, entonces el fragmento puede convertirse en un cuello de botella para el almacenamiento, las lecturas y las escrituras. Elija una clave de partición donde la frecuencia de cada valor más común sea baja en relación con El número de los valores de la clave de partición más comunes se puede configurar mediante ajuste de |
| Documento | La clave de partición. | |
| entero | El número de documentos para una clave de partición determinada. | Elija una clave de partición donde la frecuencia de cada valor más común sea baja en relación con |
| doble | Solo se establece si se conoce la monotonía. | Esto se establece en
La verificación de monotonía puede devolver un resultado incorrecto si la colección ha pasado por migraciones de fragmentos. La migración de fragmentos elimina los documentos de la partición donante y los vuelve a insertar en la partición receptora. No existe ninguna garantía de que se preserve el orden de inserción del cliente. Puedes configurar el umbral para el coeficiente de correlación con analyzeShardKeyMonotonicity CorrelationCoefficientThreshold. |
| string | Puede ser una de:
| Evita una clave de partición (shard key) del tipo Si una colección está particionada en una clave de partición que aumenta o disminuye de manera monótona, los nuevos documentos se insertarán en la partición que posea el fragmento |
readWriteDistribution
Esta es la estructura del documento que se devuelve cuando readWriteDistribution está configurado en true:
{ readDistribution: { sampleSize: { total: <integer>, find: <integer>, aggregate: <integer>, count: <integer>, distinct: <integer> }, percentageOfSingleShardReads: <double>, percentageOfMultiShardReads: <double>, percentageOfScatterGatherReads: <double>, numReadsByRange: [ <integer>, ... ] }, writeDistribution: { sampleSize: { total: <integer>, update: <integer>, delete: <integer>, findAndModify: <integer> }, percentageOfSingleShardWrites: <double>, percentageOfMultiShardWrites: <double>, percentageOfScatterGatherWrites: <double>, numWritesByRange: [ <integer>, ... ], percentageOfShardKeyUpdates: <double>, percentageOfSingleWritesWithoutShardKey: <double>, percentageOfMultiWritesWithoutShardKey: <double> } }
Para devolver métricas de distribución de lectura y guardado para una colección usando analyzeShardKey, debes configurar el analizador de querys para muestrear las querys ejecutadas en la colección. De lo contrario, analyzeShardKey devuelve las métricas de distribución de lectura y escritura como valores 0. Para configurar el analizador de consultas, consulta configureQueryAnalyzer (comando de base de datos).
Campos de distribución de lecturas
Campo | Tipo | Descripción | Uso |
|---|---|---|---|
| entero | La cantidad total de queries de lectura muestreados. | |
| entero | Número total de consultas muestreadas | |
| entero | Número total de consultas muestreadas | |
| entero | Número total de consultas muestreadas | |
| entero | Número total de consultas muestreadas | |
| doble | Porcentaje de lecturas que apuntan a un solo fragmento, independientemente de cómo se distribuyan los datos. | |
| doble | Porcentaje de lecturas que se dirigen a varias particiones. | Esta categoría incluye las lecturas que pueden tener como objetivo solo un fragmento si los datos se distribuyen de tal manera que los valores a los que apunta la lectura caen bajo un solo fragmento. Si las consultas operan en una gran cantidad de datos, entonces apuntar a múltiples fragmentos en lugar de uno puede resultar en una disminución en la latencia debido a la ejecución de consultas en paralelo. |
| doble | Porcentaje de lecturas que son scatter-gather, independientemente de cómo se distribuyan los datos. | Evita una clave de partición con un valor elevado para esta métrica. Si bien las consultas de dispersión-recolección tienen un bajo impacto en las particiones que no contienen los datos de destino, todavía tienen algún impacto en el rendimiento. En un clúster con una gran cantidad de particiones, las queries scatter-gather tienen un rendimiento significativamente peor que las queries que se dirigen a una única partición. |
| arreglo de enteros | Arreglo de números que representan el número de veces que se ataca cada rango ordenado de | Evita una clave de partición donde la distribución de Elija una clave de fragmento donde la suma de El número de rangos se puede configurar usando el parámetro |
Campos de escritura de distribución
Campo | Tipo | Descripción | Uso |
|---|---|---|---|
| entero | La cantidad total de queries de escritura muestreados. | |
| entero | Número total de consultas muestreadas | |
| entero | Número total de consultas muestreadas | |
| entero | Número total de consultas muestreadas | |
| doble | Porcentaje de escrituras que tienen como objetivo un solo fragmento, independientemente de cómo se distribuyan los datos. | |
| doble | Porcentaje de escrituras que tienen como objetivo varias particiones. | Esta categoría incluye las escrituras que pueden dirigirse solo a una sola partición si los datos están distribuidos de tal manera que los valores a los que se dirige la escritura caen en una sola partición. |
| doble | Porcentaje de escrituras que son scatter-gather, independientemente de cómo se distribuya la información. | Evita una clave de partición con un valor alto para esta métrica, ya que generalmente es más eficiente que un guardado se dirija a una única partición. |
| arreglo de enteros | Arreglo de números que representan el número de veces que se ataca cada rango ordenado de | Evita una clave de partición donde la distribución de Elija una clave de fragmento donde la suma de El número de rangos se puede configurar usando el parámetro |
| doble | Porcentaje de consultas de escritura que actualizan el valor de la clave de partición de un documento. | Evite usar una clave de fragmento con un valor alto de. Actualizar el Actualmente, las actualizaciones solo se admiten como escrituras reintentables o en una transacción, y tienen un límite de tamaño de lote de |
| doble | El porcentaje de consultas de escritura que son | Evita una clave de partición con un valor alto para esta métrica. Realizar este tipo de guardado es costoso porque puede implicar la ejecución de transacciones internas. |
| doble | El porcentaje de consultas de escritura que son | Evita una clave de partición con un valor alto para esta métrica. |
Ejemplos
Considere una versión simplificada de una aplicación de redes sociales. La colección que intentamos fragmentar es la colección post.
Los documentos en la colección post tienen el siguiente esquema:
{ userId: <uuid>, firstName: <string>, lastName: <string>, body: <string>, // the field that can be modified. date: <date>, // the field that can be modified. }
Información de segundo plano
La aplicación tiene 1500 usuarios.
Hay 30 apellidos y 45 nombres, algunos más comunes que otros.
Hay tres usuarios famosos.
Cada usuario sigue exactamente a cinco usuarios más y tiene una probabilidad muy alta de seguir al menos a un usuario famoso.
Carga de trabajo de muestra
Cada usuario publica alrededor de dos publicaciones al día en horarios aleatorios. Editan cada publicación una vez, justo después de que se haya publicado.
Cada usuario inicia sesión cada seis horas para leer su propio perfil y las publicaciones de los usuarios que sigue de las últimas 24 horas. También responden bajo una publicación aleatoria de las últimas tres horas.
Para cada usuario, la aplicación remueve las publicaciones que tienen más de tres días a la medianoche.
Patrones de consulta de carga de trabajo
Esta carga de trabajo tiene los siguientes patrones de query:
findcomando con filtro{ userId: , firstName: , lastName: }findcomando con filtro{ $or: [ { userId: , firstName: , lastName: , date: { $gte: } }, ... , { userId: , date: } ] }findAndModifycomando con filtro{ userId: , firstName: , lastName: , date: }para actualizar el cuerpo y la fecha del campo.updatecomando conmulti: falsey filtro{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }para actualizar el cuerpo y el campo de fecha.deletecomando conmulti: truey filtro{ userId: , firstName: , lastName: , date: { $lt: } }
A continuación se muestran métricas de ejemplo devueltas por el comando analyzeShardKey para algunas claves de fragmentos candidatas, con consultas de muestra recopiladas durante siete días de carga de trabajo.
Nota
Antes de ejecutar los comandos analyzeShardKey, lee la sección Índices de soporte que aparece antes en esta página. Si necesitas índices de soporte para la clave de partición que estás analizando, utiliza el método db.collection.createIndex() para crear los índices.
{ _id: 1 } keyCharacteristics
Este ejemplo utiliza el comando analyzeShardKey para proporcionar métricas sobre la clave de partición { _id: 1 } en la colección social.post.
El siguiente bloque de código utiliza para activar el muestreo de db.collection.configureQueryAnalyzer() consultas:
use social db.post.configureQueryAnalyzer( { mode: "full", samplesPerSecond: 5 } )
Después de que db.collection.configureQueryAnalyzer() recopila muestras de consultas, el siguiente bloque de código usa el comando analyzeShardKey para muestrear documentos 10,000 y calcular resultados:
use social db.post.analyzeShardKey( { _id: 1 }, { keyCharacteristics: true, readWriteDistribution: false, sampleSize: 10000 } )
{ lastName: 1 } keyCharacteristics
Este comando analyzeShardKey proporciona métricas sobre la clave de partición { lastName: 1 } de la colección social.post:
use social db.post.analyzeShardKey( { lastName: 1 }, { keyCharacteristics: true, readWriteDistribution: false } )
La salida para este ejemplo se asemeja a lo siguiente:
{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 153, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 30, "mostCommonValues" : [ { "value" : { "lastName" : "Smith" }, "frequency" : 1013 }, { "value" : { "lastName" : "Johnson" }, "frequency" : 984 }, { "value" : { "lastName" : "Jones" }, "frequency" : 962 }, { "value" : { "lastName" : "Brown" }, "frequency" : 925 }, { "value" : { "lastName" : "Davies" }, "frequency" : 852 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : 0.0771959161, "type" : "not monotonic" }, } }
{ userId: 1 } keyCharacteristics
Este comando analyzeShardKey proporciona métricas sobre la clave de partición { userId: 1 } de la colección social.post:
use social db.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: true, readWriteDistribution: false } )
La salida para este ejemplo se asemeja a lo siguiente:
{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 162, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 1495, "mostCommonValues" : [ { "value" : { "userId" : UUID("aadc3943-9402-4072-aae6-ad551359c596") }, "frequency" : 15 }, { "value" : { "userId" : UUID("681abd2b-7a27-490c-b712-e544346f8d07") }, "frequency" : 14 }, { "value" : { "userId" : UUID("714cb722-aa27-420a-8d63-0d5db962390d") }, "frequency" : 14 }, { "value" : { "userId" : UUID("019a4118-b0d3-41d5-9c0a-764338b7e9d1") }, "frequency" : 14 }, { "value" : { "userId" : UUID("b9c9fbea-3c12-41aa-bc69-eb316047a790") }, "frequency" : 14 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : -0.0032039729, "type" : "not monotonic" }, } }
{ userId: 1 } lecturaEscribirDistribución
Este comando analyzeShardKey proporciona métricas sobre la clave de partición { userId: 1 } de la colección social.post:
use social db.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: false, readWriteDistribution: true } )
La salida para este ejemplo se asemeja a lo siguiente:
{ "readDistribution" : { "sampleSize" : { "total" : 61363, "find" : 61363, "aggregate" : 0, "count" : 0, "distinct" : 0 }, "percentageOfSingleShardReads" : 50.0008148233, "percentageOfMultiShardReads" : 49.9991851768, "percentageOfScatterGatherReads" : 0, "numReadsByRange" : [ 688, 775, 737, 776, 652, 671, 1332, 1407, 535, 428, 985, 573, 1496, ... ], }, "writeDistribution" : { "sampleSize" : { "total" : 49638, "update" : 30680, "delete" : 7500, "findAndModify" : 11458 }, "percentageOfSingleShardWrites" : 100, "percentageOfMultiShardWrites" : 0, "percentageOfScatterGatherWrites" : 0, "numWritesByRange" : [ 389, 601, 430, 454, 462, 421, 668, 833, 493, 300, 683, 460, ... ], "percentageOfShardKeyUpdates" : 0, "percentageOfSingleWritesWithoutShardKey" : 0, "percentageOfMultiWritesWithoutShardKey" : 0 } }