Definição
analyzeShardKeyNovidades na versão 7.0.
Calcula métricas para avaliar uma chave de fragmento para uma coleção fragmentada ou não fragmentada. As métricas são baseadas em queries de amostra. Você pode utilizar o
configureQueryAnalyzerpara configurar a amostragem de query em uma collection.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Observação
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
analyzeShardKey tem esta sintaxe:
db.collection.analyzeShardKey( <shardKey>, { keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
Campos de comando
Campo | Tipo | necessidade | Descrição |
|---|---|---|---|
| documento | Obrigatório | Chave de fragmento para analisar. Pode ser uma chave de fragmento candidata para uma coleção não fragmentada ou uma coleção fragmentada ou a chave de fragmento atual para uma coleção fragmentada. Não há valor padrão. |
| booleano | Opcional | Whether or not the metrics about the characteristics of the shard key are calculated. For details, see keyCharacteristics. Padrão é |
| booleano | Opcional | Whether or not the metrics about the read and write distribution are calculated. For details, see readWriteDistribution. Padrão é To return read and write distribution metrics for a collection using |
| double | Opcional | A proporção dos documentos na collection a serem amostradas ao calcular as métricas sobre as características da chave de shard. Se você definir Deve ser maior que Não há valor padrão. |
| inteiro | Opcional | O número de documentos a serem amostrados ao calcular as métricas sobre as características da chave de fragmento. Se você definir Se ele e |
Comportamento
analyzeShardKey o comando retorna métricas diferentes dependendo dos valores keyCharacteristic e readWriteDistribution especificados ao executar o método.
Métricas sobre as características da chave do fragmento
keyCharacteristic consiste nas métricas sobre cardinalidade, frequência e monotonicidade da chave de fragmento. Essas métricas são retornadas somente quando keyCharacteristics é verdadeiro.
The metrics are calculated when analyzeShardKey command is run based on documents sampled from the collection. The calculation requires the shard key to have a supporting index. If there is no supporting index, no metrics are returned.
Você pode configurar a amostragem com os campos sampleRate e sampleSize. Ambos são opcionais, mas apenas um pode ser especificado. Quando sampleRate e sampleSize não são especificados, o MongoDB usa o valor do parâmetro analyzeShardKeyCharacteristicsDefaultSampleSize, que tem um valor padrão de 10 milhões.
Para calcular métricas com base em todos os documentos da collection, defina o sampleRate como 1.
Métricas sobre a distribuição de leitura e gravação
readWriteDistribution contém métricas sobre os padrões de roteamento de query e a proximidade dos intervalos de chaves de fragmento. Essas métricas são baseadas em query de amostra.
Para configurar a amostragem de consulta para uma coleção, use o comando configureQueryAnalyzer. As métricas de distribuição de leitura e gravar são retornadas somente se readWriteDistribution for true. As métricas são calculadas quando o comando analyzeShardKey é executado, utilizando as queries de leitura e de gravar de amostra. Se não houver queries de amostra, as métricas de distribuição de leitura e gravar não são retornadas.
Se não houver amostras de query, o comando retornará
writeDistribution, mas omitiráreadDistribution.Se não houver amostras de query de gravação, o comando retornará
readDistribution, mas omitiráwriteDistribution.
To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).
keyCharacteristics Valor | readWriteDistribution Valor | Resultados retornados |
|---|---|---|
|
|
|
|
|
|
|
|
|
Comportamento não bloqueante
analyzeShardKey o comando não bloqueia leituras ou gravações na coleção.
Amostragem de query
A qualidade das métricas sobre a distribuição de leitura e gravação é determinada pela representatividade da carga de trabalho quando ocorre a amostragem de query. Para alguns aplicativos, o retorno de métricas representativas pode exigir a saída da amostragem de query por vários dias.
Índices de apoio
O índice de suporte exigido pelo comando analyzeShardKey é diferente do índice de suporte exigido pelo comando shardCollection.
Esta tabela mostra o índice de suporte para a mesma chave de shard com hash para o comando analyzeShardKey e shardCollection:
Comando | Chave de fragmento | Índices de apoio |
|---|---|---|
|
|
|
|
|
|
Isso permite que você analise uma chave de fragmento que pode ainda não ter um índice de suporte necessário para fragmentá-la.
Tanto o comando analyzeShardKey quanto shardCollection têm os seguintes requisitos de índice:
O índice tem um agrupamentosimples
O índice não é multichave
O índice não é escasso
O índice não é parcial
Para criar índices de suporte, utilize o método db.collection.createIndex() .
readPreference
Para minimizar o desempenho, execute o comando analyzeShardKey com a preferência de leitura secondary ou secondaryPreferred . Em um cluster sharded, o mongos define automaticamente a preferência de leitura para secondaryPreferred se não for especificado.
Limitações
You cannot run
analyzeShardKeycommand on Atlas flex clusters.Você não pode executar o comando
analyzeShardKeyem implantações autônomas.Você não pode executar o comando
analyzeShardKeydiretamente em um conjunto de réplicas--shardsvr. Ao executar em um cluster sharded, o comandoanalyzeShardKeydeve ser executado em ummongos.Você não pode executar o comando
analyzeShardKeyem coleção de séries temporais.Não é possível executar o comando
analyzeShardKeyem coleções com Queryable Encryption.
Controle de acesso
db.collection.analyzeShardKey o método requer uma destas funções:
enableShardingprivilégio ação contra a collection que está sendo analisada.clusterManagerfunção em relação ao cluster.
Saída
analyzeShardKey command returns information regarding keyCharacteristics and readWriteDistribution.
keyCharacteristicsfornece métricas sobre a cardinalidade, frequência e monotonicidade da chave de fragmento.readWriteDistributionfornece métricas sobre padrões de roteamento de query e a proximidade de intervalos de chaves de shard.
característicaschave
Esta é a estrutura do documento keyCharacteristics que é retornado quando keyCharacteristics é definido como 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 | Descrição | Uso |
|---|---|---|---|
| inteiro | O número de documentos na collection. | |
| inteiro | O número de documentos órfãos. | Os documentos órfãos não são excluídos do cálculo de métricas por motivos de desempenho. Se |
| inteiro | O tamanho médio dos documentos na collection, em bytes. | Se |
| inteiro | O número de documentos de amostra. | |
| inteiro | O número de valores de chave de fragmento distintos. | Escolha uma chave de fragmento com um |
| booleano | Indica se a chave de fragmento é exclusiva. Isso só é definido como | Se a chave de fragmento for exclusiva, o número de valores distintos será igual ao número de documentos. |
| matriz de documentos | Uma array de valor e | A frequência de um valor de chave de fragmento é o número mínimo de documento na parte que contém esse valor. Se a frequência for grande, a parte poderá se tornar um gargalo para armazenamento, leituras e gravações. Escolha uma chave de fragmento em que a frequência para cada valor mais comum seja baixa em relação a O número de valores da chave de fragmento mais comuns pode ser configurado definindo |
| documento | A chave de fragmento. | |
| inteiro | O número de documentos para uma determinada chave de shard. | Escolha uma chave de fragmento em que a frequência para cada valor mais comum seja baixa em relação a |
| double | Defina apenas se a monotonicidade for conhecida. | Isso é definido como
A verificação de monotonicidade pode retornar um resultado incorreto se a collection tiver passado por migrações de chunk. A migração de parte exclui documento do shard do doador e os reinsere no shard do destinatário. Não há garantia de que o pedido de inserção do cliente seja preservado. Você pode configurar o limite do coeficiente de correlação com analyzeShardKeyMonotonicity CorrelationCoeficienteThreshold. |
| string | Pode ser um dos seguintes:
| Evite uma chave de shard com o tipo Se uma collection for fragmentada em uma chave de shard que é monotonicamente crescente ou decrescente, novo documento será inserido no shard que possui a parte |
readWriteDistribution
Esta é a estrutura do documento que é retornada quando readWriteDistribution é definido como 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> } }
To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).
Campos de readDistribution
Campo | Tipo | Descrição | Uso |
|---|---|---|---|
| inteiro | Número total de queries de leitura amostradas. | |
| inteiro | Número total de queries | |
| inteiro | Número total de queries | |
| inteiro | Número total de queries | |
| inteiro | Número total de queries | |
| double | Porcentagem de leituras destinadas a um único fragmento, independentemente de como os dados são distribuídos. | |
| double | Porcentagem de leituras direcionadas a vários shards. | Essa categoria inclui as leituras que podem ter como alvo apenas um único shard se os dados forem distribuídos de forma que os valores visados pela leitura se enquadram em um único shard. Se as queries operarem em uma grande quantidade de dados, o direcionamento de vários shards em vez de um pode resultar em uma diminuição na latência devido à execução paralela da query. |
| double | Porcentagem de leituras que são de dispersão, independentemente de como os dados são distribuídos. | Evite uma chave de shard com alto valor para esta métrica. Embora as query de dispersão tenham baixo impacto nos fragmentos que não possuem os dados de destino, elas ainda têm algum impacto no desempenho. Em um cluster com um grande número de shards, as query de dispersão têm um desempenho significativamente pior do que as query que têm como alvo um único shard. |
| array de números inteiros | Array de números que representam o número de vezes que cada intervalo classificado de | Evite uma chave de shard em que a distribuição de Escolha uma chave de fragmento em que a soma de O número de faixas pode ser configurado usando o parâmetro |
Campos de distribuição de gravação
Campo | Tipo | Descrição | Uso |
|---|---|---|---|
| inteiro | Número total de queries de gravação amostradas. | |
| inteiro | Número total de queries | |
| inteiro | Número total de queries | |
| inteiro | Número total de queries | |
| double | Porcentagem de gravações que têm como alvo um único fragmento, independentemente de como os dados são distribuídos. | |
| double | Porcentagem de gravações que têm como alvo vários fragmentos. | Essa categoria inclui as gravações que podem ter como alvo apenas um único fragmento se os dados forem distribuídos de forma que os valores segmentados pela gravação se enquadram em um único fragmento. |
| double | Porcentagem de gravações que são dispersas, independentemente de como os dados são distribuídos. | Evite uma chave de fragmento com um valor alto para essa métrica porque geralmente tem mais desempenho para uma gravação direcionar um único fragmento. |
| array de números inteiros | Array de números que representam o número de vezes que cada intervalo classificado de | Evite uma chave de fragmento em que a distribuição de Escolha uma chave de fragmento em que a soma de O número de faixas pode ser configurado usando o parâmetro |
| double | Porcentagem de query de gravação que atualizam o valor da chave de shard de um document. | Evite uma chave de shard com um Atualmente, as atualizações só são suportadas como retryable writes ou em uma transação e têm um limite de tamanho de lote de |
| double | A porcentagem de query de gravação que são | Evite uma chave de shard com um valor alto para essa métrica. Executar esse tipo de gravação é caro porque pode envolver a execução de transação internas. |
| double | A porcentagem de query de gravação que são | Evite uma chave de shard com um valor alto para essa métrica. |
Exemplos
Considere uma versão simplificada de um aplicativo de mídia social. A coleção que estamos tentando fragmentar é a coleção post .
Os documentos na collection post têm o seguinte esquema:
{ userId: <uuid>, firstName: <string>, lastName: <string>, body: <string>, // the field that can be modified. date: <date>, // the field that can be modified. }
Informações básicas
O aplicativo tem 1500 usuários.
Existem 30 sobrenomes e 45 nomes, alguns mais comuns do que outros.
Existem três usuários renomeados.
Cada usuário segue exatamente cinco outros usuários e tem uma probabilidade muito alta de seguir pelo menos um usuário-celebridade.
Amostra de volume de trabalho
Cada usuário publica cerca de duas publicações por dia em horários aleatórios. Eles editam cada publicação uma vez, logo após ser publicada.
Cada usuário faz login a cada seis horas para ler seu próprio perfil e as publicações dos usuários que segue nas últimas 24 horas. Eles também respondem em uma postagem aleatória das últimas três horas.
Para cada usuário, o aplicativo remove publicações com mais de três dias à meia-noite.
Padrões de query de volume de trabalho
Essa carga de trabalho tem os seguintes padrões de query:
findcomando com filtro{ userId: , firstName: , lastName: }findcomando com filtro{ $or: [ { userId: , firstName: , lastName: , date: { $gte: } }, ... , { userId: , date: } ] }findAndModifycomando com filtro{ userId: , firstName: , lastName: , date: }para atualizar o corpo e o campo de data.updatecomando commulti: falsee filtro{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }para atualizar o corpo e o campo de data.deletecomando commulti: truee filtro{ userId: , firstName: , lastName: , date: { $lt: } }
Abaixo estão métricas de exemplo retornadas pelo comando analyzeShardKey para algumas chaves de shard candidatas, com amostras de queries coletadas de sete dias de volume de trabalho.
Observação
Before you run analyzeShardKey commands, read the Supporting Indexes section earlier on this page. If you require supporting indexes for the shard key you are analyzing, use the db.collection.createIndex() method to create the indexes.
{ _id: 1 } keyChaacteristics
Este exemplo utiliza o comando analyzeShardKey para fornecer métricas na chave de shard { _id: 1 } na collection social.post.
O seguinte bloco de código utiliza para ativar a amostragem de db.collection.configureQueryAnalyzer() query:
use social db.post.configureQueryAnalyzer( { mode: "full", samplesPerSecond: 5 } )
Após o db.collection.configureQueryAnalyzer() coletar amostras de query, o seguinte bloco de código utiliza o comando analyzeShardKey para amostrar documentos do 10,000 e calcular resultados:
use social db.post.analyzeShardKey( { _id: 1 }, { keyCharacteristics: true, readWriteDistribution: false, sampleSize: 10000 } )
{ lastName: 1 } keyChaacteristics
Este analyzeShardKey comando fornece métricas na { lastName: 1 } chave de shard na social.post collection :
use social db.post.analyzeShardKey( { lastName: 1 }, { keyCharacteristics: true, readWriteDistribution: false } )
A saída deste exemplo se assemelha ao seguinte:
{ "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 } keyChaacteristics
Este analyzeShardKey comando fornece métricas na { userId: 1 } chave de shard na social.post collection :
use social db.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: true, readWriteDistribution: false } )
A saída deste exemplo se assemelha ao seguinte:
{ "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 } readWriteDistribution
Este analyzeShardKey comando fornece métricas na { userId: 1 } chave de shard na social.post collection :
use social db.post.analyzeShardKey( { userId: 1 }, { keyCharacteristics: false, readWriteDistribution: true } )
A saída deste exemplo se assemelha ao seguinte:
{ "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 } }