analyzeShardKey
Nesta página
Definição
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.
Compatibilidade
Esse comando está disponível em implantações hospedadas 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 sem suporte.
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.adminCommand( { analyzeShardKey: <string>, key: <shardKey>, keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
Campos de comando
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 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. |
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 é |
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 é Para retornar métricas de distribuição de leitura e escrita para uma collection usando |
sampleRate | 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. |
sampleSize | 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
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.
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
.
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 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 |
|
Comportamento não bloqueante
analyzeShardKey
não bloqueia leituras ou gravações na collection.
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 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 |
---|---|---|
| { a.x: 1, 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:
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 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.
Limitações
Você não pode executar o
analyzeShardKey
em clusters compartilhados do Atlas e instâncias sem servidor.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, oanalyzeShardKey
deve ser executado em ummongos
.Você não pode executar
analyzeShardKey
em collection de time-series .Não é possível executar
analyzeShardKey
em collection com Queryable Encryption.
Controle de acesso
analyzeShardKey
requer uma destas funções:
enableSharding
privilégio ação contra a collection que está sendo analisada.clusterManager
função em relação ao cluster.
Saída
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.
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 |
---|---|---|---|
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 O número de valores da chave de fragmento mais comuns pode ser configurado definindo |
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 | 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. |
monotoncity.type | 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> } }
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.
Campos de readDistribution
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 | double | Porcentagem de leituras destinadas a um único fragmento, independentemente de como os dados são distribuídos. | |
percentageOfMultiShardReads | 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. |
percentageOfScatterGatherReads | 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. |
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 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 |
---|---|---|---|
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 | double | Porcentagem de gravações que têm como alvo um único fragmento, independentemente de como os dados são distribuídos. | |
percentageOfMultiShardWrites | 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. |
percentageOfScatterGatherWrites | 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. |
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 Escolha uma chave de fragmento em que a soma de O número de faixas pode ser configurado usando o parâmetro |
percentageOfShardKeyUpdates | 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 |
percentageOfSingleWritesWithoutShardKey | double | 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 | double | 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. |
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:
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 commulti: false
e filtro{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }
para atualizar o corpo e o campo de data.delete
comando commulti: 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.
{ lastName: 1 } keyChaacteristics
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" }, } }
{ userId: 1 } keyChaacteristics
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" }, } }
{ userId: 1 } readWriteDistribution
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 } }