Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

analyzeShardKey

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Campos de comando
  • Comportamento
  • Controle de acesso
  • Saída
  • Exemplos
  • Saiba mais
analyzeShardKey

Novidades 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 configureQueryAnalyzer para configurar a amostragem de query em uma collection.

Este comando está disponível em sistemas hospedados nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

Observação

Este comando é suportado em todos os clusters do MongoDB Atlas. Para obter informações sobre todos os comandos, consulte Comandos não suportados.

  • 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

analyzeShardKey tem esta sintaxe:

db.adminCommand(
{
analyzeShardKey: <string>,
key: <shardKey>,
keyCharacteristics: <bool>,
readWriteDistribution: <bool>,
sampleRate: <double>,
sampleSize: <int>
}
)
Campo
Tipo
necessidade
Descrição
analyzeShardKey
string
Obrigatório

Namespace da collection a ser analisada.

Não há valor padrão.

key
documento
Obrigatório

Chave de shard para analisar. Pode ser uma chave de shard candidata a uma collection não fragmentada ou uma collection fragmentada, ou a chave de shard atual para uma collection fragmentada.

Não há valor padrão.

keyCharacteristics
booleano
Opcional

Se as métricas sobre as características da chave de shard são calculadas ou não. Para obter detalhes, consulte keyChaacteristics.

Padrão é true.

readWriteDistribution
booleano
Opcional

Se as métricas sobre a distribuição de leitura e escrita são ou não calculadas. Para obter detalhes, consulte readWriteDistribution.

Padrão é true.

Para retornar métricas de distribuição de leitura e escrita para uma collection usando analyzeShardKey, você deve configurar o analisador de query para amostrar as queries executadas na collection. Caso contrário, analyzeShardKey retorna as métricas de distribuição de leitura e gravação como valores 0 . Para configurar o analisador de query, consulte configureQueryAnalyzer.

sampleRate
em dobro
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 sampleRate, não poderá definir sampleSize.

Deve ser maior que 0, até e inclusive 1.

Não há valor padrão.

sampleSize
inteiro
Opcional

O número de documentos a serem amostrados ao calcular as métricas sobre as características da chave de shard. Se você definir sampleSize, não poderá definir sampleRate.

Se não for especificado e sampleRate não for especificado, o tamanho da amostra assumirá como padrão o tamanho da amostra definido por analyzeShardKeyCharacteristicsDefaultSampleSize.

analyzeShardKey retorna métricas diferentes dependendo dos valores keyCharacteristic e readWriteDistribution especificados ao executar o método.

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.

As métricas são calculadas quando o analyzeShardKey é executado com base em documentos amostrados da collection. O cálculo exige que a chave de fragmento tenha um índice de suporte. Se não houver um índice de suporte, nenhuma métrica será retornada.

Você pode configurar a amostragem com os campos sampleRate e sampleSize . Ambos são opcionais e apenas um pode ser especificado. Se nenhum dos dois for especificado, o tamanho da amostra será definido como 10 . Configure este valor configurando analyzeShardKeyCharacteristicsDefaultSampleSize.

Para calcular métricas com base em todos os documentos da collection, defina o sampleRate como 1.

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 query para uma collection, utilize o comando configureQueryAnalyzer . As métricas de distribuição de leitura e gravação só são retornadas se readWriteDistribution for true. As métricas são calculadas quando o analyzeShardKey é executado e as métricas utilizam a query de leitura e escrita de amostra. Se não houver query de amostra, as métricas de distribuição de leitura e gravação não serã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.

Para retornar métricas de distribuição de leitura e escrita para uma collection usando analyzeShardKey, você deve configurar o analisador de query para amostrar as queries executadas na collection. Caso contrário, analyzeShardKey retorna as métricas de distribuição de leitura e gravação como valores 0 . Para configurar o analisador de query, consulte configureQueryAnalyzer.

keyCharacteristics Valor
readWriteDistribution Valor
Resultados retornados
true
false
false
true
analyzeShardKey retorna readWriteDistribution métricas e omite keyCharacteristics métricas.
true
true
  • analyzeShardKey retorna métricas readWriteDistribution e métricas keyCharacteristics .

  • Se a chave de shard não tiver um índice de suporte, analyzeShardKey retornará readWriteDistribution métricas e omitirá keyCharacteristics métricas.

analyzeShardKey não bloqueia leituras ou gravações na collection.

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.

O índice de suporte exigido pelo analyzeShardKey é diferente do índice de suporte exigido pelo comando shardCollection .

Esta tabela mostra os índices de suporte para a mesma chave de shard para analyzeShardKey e shardCollection:

Comando
Chave de fragmento
Índices de apoio

analyzeShardKey

{ a.x: 1, b: "hashed" }
  • { a.x: 1, b: 1, ... }

  • { a.x: "hashed", b: 1, ... }

  • { a.x: 1, b: "hashed", ... }

  • { a.x: "hashed", b: "hashed", ...}

shardCollection
{ a.x: 1, b: "hashed" }
{ a.x: 1, b: “hashed”, ... }

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 analyzeShardKey quanto shardCollection têm os seguintes requisitos de índice:

Para criar índices de suporte, utilize o método db.collection.createIndex() .

Para minimizar o desempenho, execute analyzeShardKey com a preferência de leitura secondary ou secondaryPreferred . Em um cluster fragmentado, o mongos define automaticamente a preferência de leitura para secondaryPreferred se não for especificado.

  • Você não pode executar analyzeShardKey nas configurações de vários inquilinos do Atlas.

  • Você não pode executar analyzeShardKey em sistemas autônomo.

  • Você não pode executar o analyzeShardKey diretamente em um conjunto de réplicas do --shardsvr . Ao executar em um cluster fragmentado, o analyzeShardKey deve ser executado em um mongos.

  • Você não pode executar analyzeShardKey em collection de time-series .

  • Não é possível executar analyzeShardKey em collection com Queryable Encryption.

analyzeShardKey requer uma destas funções:

analyzeShardKey retorna informações sobre keyCharacteristics e readWriteDistribution.

  • keyCharacteristics fornece métricas sobre a cardinalidade, frequência e monotonicidade da chave de fragmento.

  • readWriteDistribution fornece métricas sobre padrões de roteamento de query e a proximidade de intervalos de chaves de shard.

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
numDocsTotal
inteiro
O número de documentos na collection.
numOrphanDocs
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 numOrphanDocs for grande em relação a numDocsTotal, considere esperar até que o número de documentos órfãos seja muito pequeno em comparação com o número total de documentos na collection para executar o comando.
avgDocSizeBytes
inteiro
O tamanho médio dos documentos na collection, em bytes.
Se numDocsTotal for comparável a numDocsSampled, você poderá estimar o tamanho das maiores partes multiplicando o frequency de cada mostCommonValues por avgDocSizeBytes.
numDocsSampled
inteiro
O número de documentos de amostra.
numDistinctValues
inteiro
O número de valores de chave de fragmento distintos.
Escolha uma chave de fragmento com um numDistinctValues grande, pois o número de valores de chave de fragmento distintos é o número máximo de partes que o balanceador pode criar.
isUnique
booleano
Indica se a chave de fragmento é exclusiva. Isso só é definido como true se houver um índice exclusivo para a chave de fragmento.
Se a chave de fragmento for exclusiva, o número de valores distintos será igual ao número de documentos.
mostCommonValues
matriz de documentos
Uma array de valor e frequency (número de documentos) dos valores de chave de shard mais comuns.

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 numDocsSampled.

O número de valores da chave de fragmento mais comuns pode ser configurado definindo analyzeShardKeyNumMostCommonValues , que é padronizado como 5. Para evitar exceder o limite de tamanho BSON de 16 MB para a resposta, cada valor será definido como "truncado" se seu tamanho exceder 15 MB / analyzeShardKey NumMostCommonValues.

mostCommonValues[n].value
documento
A chave de fragmento.
mostCommonValues[n].frequency
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 numDocsSampled.
monotonicity. recordIdCorrelationCoefficient
em dobro
Defina apenas se a monotonicidade for conhecida.

Isso é definido como "unknown" quando uma das seguintes afirmações é verdadeira:

  • A chave de shard não tem um índice de suporte por definição shardCollection .

  • A collection está clusterizada.

  • A chave de shard é uma chave de shard composta hasheada onde o campo hasheado não é o primeiro campo.

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.

monotoncity.type
string

Pode ser um dos seguintes:

"monotonic", "not monotonic" , "unknown"

Evite uma chave de shard com o tipo "monotonic" , a menos que você não espere inserir novos documentos com frequência.

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 MaxKey ou MinKey . Esse fragmento pode se tornar o gargalo para as inserções e os dados provavelmente ficarão desequilibrados na maior parte do tempo, pois o balanceador precisará competir com as inserções que chegam.

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>
}
}

Para retornar métricas de distribuição de leitura e escrita para uma collection usando analyzeShardKey, você deve configurar o analisador de query para amostrar as queries executadas na collection. Caso contrário, analyzeShardKey retorna as métricas de distribuição de leitura e gravação como valores 0 . Para configurar o analisador de query, consulte configureQueryAnalyzer.

Campo
Tipo
Descrição
Uso
sampleSize.total
inteiro
Número total de queries de leitura amostradas.
sampleSize.find
inteiro
Número total de queries find amostradas.
sampleSize.aggregate
inteiro
Número total de queries aggregate amostradas.
sampleSize.count
inteiro
Número total de queries count amostradas.
sampleSize.distinct
inteiro
Número total de queries distinct amostradas.
percentageOfSingleShardReads
em dobro
Porcentagem de leituras destinadas a um único fragmento, independentemente de como os dados são distribuídos.
percentageOfMultiShardReads
em dobro
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.

percentageOfScatterGatherReads
em dobro
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.

numReadsByRange
array de números inteiros
Array de números que representam o número de vezes que cada intervalo classificado de MinKey a MaxKey é segmentado.

Evite uma chave de shard em que a distribuição de numReadsByRange seja muito enviesada, pois isso implica que é provável que haja um ou mais shards quentes para leituras.

Escolha uma chave de fragmento em que a soma de numReadsByRange seja semelhante a sampleSize.total.

O número de faixas pode ser configurado usando o parâmetro analyzeShardKeyNumRanges que é padronizado para 100. O valor é 100 porque o objetivo é encontrar uma chave de shard que seja dimensionada para até 100 shards.

Campo
Tipo
Descrição
Uso
sampleSize.total
inteiro
Número total de queries de gravação amostradas.
sampleSize.update
inteiro
Número total de queries update amostradas.
sampleSize.delete
inteiro
Número total de queries delete amostradas.
sampleSize.findAndModify
inteiro
Número total de queries findAndModify amostradas.
percentageOfSingleShardWrites
em dobro
Porcentagem de gravações que têm como alvo um único fragmento, independentemente de como os dados são distribuídos.
percentageOfMultiShardWrites
em dobro
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.
percentageOfScatterGatherWrites
em dobro
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.
numWritesByRange
array de números inteiros
Array de números que representam o número de vezes que cada intervalo classificado de MinKey a MaxKey é segmentado.

Evite uma chave de fragmento em que a distribuição de numWritesByRange seja muito enviesada, pois isso implica que é provável que haja um ou mais fragmentos quentes para gravações.

Escolha uma chave de fragmento em que a soma de numWritesByRange seja semelhante a sampleSize.total.

O número de faixas pode ser configurado usando o parâmetro analyzeShardKeyNumRanges que é padronizado para 100. O valor é 100 porque o objetivo é encontrar uma chave de shard que seja dimensionada para até 100 shards.

percentageOfShardKeyUpdates
em dobro
Porcentagem de query de gravação que atualizam o valor da chave de shard de um document.

Evite uma chave de shard com um percentageOfShardKeyUpdates alto. As atualizações no valor da chave do fragmento de um documento podem fazer com que o documento seja movido para um fragmento diferente, o que requer a execução de uma transação interna no fragmento que a query tem como alvo. Para obter detalhes sobre como alterar o valor da chave de shard de um documento, consulte Alterar uma chave de shard.

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 1.

percentageOfSingleWritesWithoutShardKey
em dobro
A porcentagem de query de gravação que são multi=false e não podem ser direcionadas para um único shard.

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.

percentageOfMultiWritesWithoutShardKey
em dobro
A porcentagem de query de gravação que são multi=true e não podem ser direcionadas para um único shard.
Evite uma chave de shard com um valor alto para essa métrica.

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.
}
  • 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.

  • 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.

Essa carga de trabalho tem os seguintes padrões de query:

  • find comando com filtro { userId: , firstName: , lastName: }

  • find comando com filtro { $or: [{ userId: , firstName: , lastName:, date: { $gte: }, ] }

  • findAndModify comando com filtro { userId: , firstName: , lastName: , date: } para atualizar o corpo e o campo de data.

  • update comando com multi: false e filtro { userId: , firstName: , lastName: , date: { $gte: , $lt: } } para atualizar o corpo e o campo de data.

  • delete comando com multi: true e filtro { userId: , firstName: , lastName: , date: { $lt: } }

Abaixo estão exemplos de métricas retornadas por analyzeShardKey para algumas chaves de shard candidatas, com amostras de query coletadas em sete dias de volume de trabalho.

Observação

Antes de executar comandos analyzeShardKey , leia a seção Índices de suporte anteriormente nesta página. Se você precisar de índices de suporte para a chave de shard que está analisando, use o método db.collection.createIndex() para criar os índices.

Este analyzeShardKey comando fornece métricas na { lastName: 1 } chave de shard na social.post collection :

db.adminCommand(
{
analyzeShardKey: "social.post",
key: { lastName: 1 },
keyCharacteristics: true,
readWriteDistribution: false
}
)

A saída deste comando é semelhante 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"
},
}
}

Este analyzeShardKey comando fornece métricas na { userId: 1 } chave de shard na social.post collection :

db.adminCommand(
{
analyzeShardKey: "social.post",
key: { userId: 1 },
keyCharacteristics: true,
readWriteDistribution: false
}
)

A saída deste comando é semelhante 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"
},
}
}

Este analyzeShardKey comando fornece métricas na { userId: 1 } chave de shard na social.post collection :

db.adminCommand(
{
analyzeShardKey: "social.post",
key: { userId: 1 },
keyCharacteristics: false,
readWriteDistribution: true
}
)

A saída deste comando é semelhante 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
}
}
← addShardToZone