Depois de fazer todas as coisas certas - escolher uma chave de fragmento apropriada, dimensionar horizontalmente, distribuir meus dados em vários fragmentos, acho que agora não tenho uma maneira real de determinar o quão bem equilibrados estão os dados em termos de contagem de documentos e tamanho dos dados. O sh.status()
comando me dirá como os pedaços são distribuídos em termos de contagem, mas não o que compõe esses pedaços.
Existem muitas maneiras de inferir essas coisas - mas todas elas têm um lado negativo. Os caprichos de como o tamanho do banco de dados é calculado significa que, se houver exclusões significativas em um banco de dados, as estatísticas podem não ser um reflexo preciso da distribuição de dados. Se eu observar o tráfego que atinge cada fragmento, isso pode me dar alguma pista, mas apenas se meu tráfego for bom e previsível.
Então, como determino a distribuição de documentos em cada bloco, os tamanhos relativos de cada bloco e (claro) onde esses blocos residem atualmente?
Atualmente, não há uma maneira integrada de fazer isso, portanto, uma pequena função é necessária. Para os fins desta resposta, criei um cluster de 2 estilhaços com aproximadamente 1 milhão de documentos de acordo com estas instruções . Em seguida, usei esta função para examinar esses documentos:
É bastante básico no momento, mas faz o trabalho. Eu também adicionei no github e posso expandi-lo ainda mais lá. Por enquanto, porém, ele fará o que for necessário. No conjunto de dados de teste descrito no início, a saída se parece com isso (alguns dados foram removidos para brevidade):
Para explicar os argumentos passados para a função:
O primeiro argumento é o namespace a ser examinado (uma string) e o segundo (um booleano) é se deve ou não usar a opção de estimativa ou não. Para qualquer ambiente de produção é recomendável usar
estimate:true
- se não for usado, todos os dados precisarão ser examinados, e isso significa puxá-los para a memória, o que será caro.Embora a
estimate:true
versão não seja gratuita (ela usa contagens e tamanhos médios de objetos), é pelo menos razoável executá-la mesmo em um grande conjunto de dados. A versão estimada também pode estar um pouco errada se o tamanho do objeto estiver distorcido em alguns fragmentos e, portanto, o tamanho médio não for representativo (isso geralmente é bastante raro).Esse é um comando muito bom que uso frequentemente para coisas como esta. Ele mostrará o total de blocos, o tamanho médio do bloco, a contagem de documentos, tudo por fragmento. Ele não fornece os dados de cada bloco como a resposta acima, mas é bastante rápido e fornece uma boa visão geral do que você está procurando.