Definición
analyzeShardKeyNuevo en la versión 7.0.
Calcula métricas para evaluar una clave de fragmento para una colección fragmentada o no fragmentada. Las métricas se basan en consultas muestreadas. Puede 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 fragmento para analizar. Puede ser una clave de fragmento candidata para una colección fragmentada o no fragmentada, o la clave de fragmento actual para una colección fragmentada. No hay ningún valor predeterminado. |
| 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 lectura y escritura. Para más detalles, consulte readWriteDistribution. Se establece por defecto en Para devolver las métricas de distribución de lectura y |
| 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 predeterminado. |
| 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 según los valores keyCharacteristic y readWriteDistribution que especifique cuando ejecute el método.
Métricas sobre las características de la clave de fragmento
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 al analyzeShardKey ejecutar, basándose en los documentos muestreados de la colección. El cálculo requiere que la clave de fragmento tenga un índice de apoyo. Si no hay índice de apoyo, no se devuelven métricas.
Puede configurar el muestreo con los sampleRate sampleSize campos y. Ambos son opcionales, pero solo se puede especificar uno. Si sampleRate no sampleSize se especifican ni, MongoDB usa el valor del parámetro, cuyo valor predeterminado analyzeShardKeyCharacteristicsDefaultSampleSize es 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 relevancia de los rangos de claves de fragmentos. Estas métricas se basan en consultas muestreadas.
Para configurar el muestreo de consultas para una colección, use el comando configureQueryAnalyzer. Las métricas de distribución de lectura y escritura solo se devuelven si readWriteDistribution es true. Las métricas se calculan al ejecutar analyzeShardKey y utilizan las consultas de lectura y escritura muestreadas. Si no hay consultas 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 consultas de escritura muestreadas, el comando devuelve
readDistributionpero omitewriteDistribution.
Para devolver las métricas de distribución de lectura y analyzeShardKey escritura de una colección mediante, debe configurar el analizador de consultas para que muestree las consultas ejecutadas en la colección. De lo contrario, analyzeShardKey devuelve las métricas de distribución de lectura y escritura como 0 valores. Para configurar el analizador de consultas, consulte 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 la representatividad de la carga de trabajo al realizar el muestreo de consultas. En algunas aplicaciones, obtener métricas representativas puede requerir mantener el muestreo de consultas activado durante varios días.
Índices de apoyo
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 fragmento | Índices de apoyo |
|---|---|---|
|
|
|
|
|
|
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ón sencilla
El índice no es multiclave
El índice no es disperso
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 se puede ejecutar
analyzeShardKeyen clústeres flexibles de Atlas.No se puede ejecutar
analyzeShardKeyen implementaciones independientes.No se puede ejecutar
analyzeShardKeydirectamente en un--shardsvrconjunto de réplicas. Al ejecutarse en un clúster fragmentado,analyzeShardKeydebe ejecutarse enmongosun.No se puede ejecutar
analyzeShardKeycontra colecciones de series de tiempo.No se puede ejecutar
analyzeShardKeyen colecciones con cifrado consultable.
Control de acceso
analyzeShardKey requiere uno de estos roles:
enableShardingacción privilegiada contra la colección que se está analizando.clusterManagerpapel contra el cluster.
Salida
analyzeShardKey devuelve información sobre keyCharacteristics y readWriteDistribution.
keyCharacteristicsProporciona métricas sobre la cardinalidad, frecuencia y monotonía de la clave del fragmento.readWriteDistributionProporciona métricas sobre patrones de enrutamiento de consultas y el interés de los rangos de claves de fragmentos.
Características clave
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 de clave de fragmento distintos. | Elija una clave de fragmento con un |
| booleano | Indica si la clave de fragmento es única. Solo se establece en | Si la clave del fragmento es única, entonces la cantidad de valores distintos es igual a la cantidad de documentos. |
| conjunto de documentos | Una matriz de valores y | La frecuencia de un valor de clave de fragmento es el número mínimo de documentos en el fragmento que contiene ese valor. Si la frecuencia es alta, el fragmento puede convertirse en un cuello de botella para el almacenamiento, la lectura y la escritura. Elija una clave de fragmento cuya frecuencia para cada valor más común sea baja en relación con El número de valores de clave de fragmento más comunes se puede configurar |
| Documento | La clave del fragmento. | |
| entero | La cantidad de documentos para una clave de fragmento determinada. | Elija una clave de fragmento donde la frecuencia de cada valor más común sea baja en relación con |
| doble | Sólo se establece si se conoce la monotonía. | Esto se establece en
La comprobació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 documentos del fragmento donante y los reinserta en el fragmento receptor. No se garantiza que se conserve el orden de inserción del cliente. Puede configurar el umbral para el coeficiente de correlación con analyseShardKeyMonotonicity CorrelationCoefficientThreshold. |
| string | Puede ser uno de:
| Evita una clave de partición (shard key) del tipo Si una colección se fragmenta con una clave de fragmento que aumenta o disminuye monótonamente, se insertarán nuevos documentos en el fragmento que posee el fragmento |
distribución de lectura y escritura
Esta es la estructura del documento que se devuelve cuando readWriteDistribution se establece 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 las métricas de distribución de lectura y analyzeShardKey escritura de una colección mediante, debe configurar el analizador de consultas para que muestree las consultas ejecutadas en la colección. De lo contrario, analyzeShardKey devuelve las métricas de distribución de lectura y escritura como 0 valores. Para configurar el analizador de consultas, consulte configureQueryAnalyzer (comando de base de datos).
Campos de distribución de lectura
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 apuntan a múltiples fragmentos. | 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 se dispersan y se reúnen, independientemente de cómo se distribuyen los datos. | Evite una clave de fragmento con un valor alto para esta métrica. Si bien las consultas de dispersión y recopilación tienen poco impacto en los fragmentos que no contienen los datos de destino, sí tienen cierto impacto en el rendimiento. En un clúster con una gran cantidad de fragmentos, las consultas de dispersión y recopilación tienen un rendimiento significativamente peor que las consultas dirigidas a un solo fragmento. |
| matriz de números enteros | Matriz de números que representa la cantidad de veces que se selecciona cada rango ordenado de | Evite una clave de fragmento donde la distribución de Elija una clave de fragmento donde la suma de El número de rangos se puede configurar mediante 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 apuntan a múltiples fragmentos. | Esta categoría incluye las escrituras que pueden tener como objetivo solo un fragmento si los datos se distribuyen de tal manera que los valores a los que apunta la escritura caen bajo un solo fragmento. |
| doble | Porcentaje de escrituras que se dispersan y recopilan, independientemente de cómo se distribuyen los datos. | 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. |
| matriz de números enteros | Matriz de números que representa la cantidad de veces que se selecciona cada rango ordenado de | Evite una clave de fragmento donde la distribución de Elija una clave de fragmento donde la suma de El número de rangos se puede configurar mediante el parámetro |
| doble | Porcentaje de consultas de escritura que actualizan el valor de la clave de fragmento 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 | Evite una clave de fragmento con un valor alto para esta métrica. Realizar este tipo de escritura es costoso porque puede implicar la ejecución de transacciones internas. |
| doble | El porcentaje de consultas de escritura que son | Evite una clave de fragmento 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 de 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. }
Antecedentes
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 unas dos entradas al día en horarios aleatorios. Edita cada entrada una vez, justo después de su publicación.
Cada usuario inicia sesión cada seis horas para leer su perfil y las publicaciones de los usuarios que sigue en las últimas 24 horas. También responde en una publicación aleatoria de las últimas tres horas.
Para cada usuario, la aplicación elimina las publicaciones que tengan más de tres días de antigüedad a medianoche.
Patrones de consulta de carga de trabajo
Esta carga de trabajo tiene los siguientes patrones de consulta:
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 el campo de fecha.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 muestreadas recopiladas a partir de siete días de carga de trabajo.
Nota
Antes de ejecutar analyzeShardKey los comandos, lea la sección "Índices de soporte" que aparece anteriormente en esta página. Si necesita índices de soporte para la clave de fragmento que está analizando, utilice el db.collection.createIndex() método para crearlos.
{ _id: 1 } Características clave
Este ejemplo utiliza el comando analyzeShardKey para proporcionar métricas en la clave de fragmento { _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 } )
{ apellido: 1 } Características clave
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 de este ejemplo se parece a la 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 } Características clave
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 de este ejemplo se parece a la 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 de este ejemplo se parece a la 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 } }