A coleção Mongo `Size` é * maior * que` storageSize`?

9

Compactei recentemente minha coleção usando o comando:

 db.<collectionName>.runCommand( "compact" )

E agora o tamanho da minha coleção parece ser maior que o tamanho do disco!

SECONDARY> db.<collectionName>.stats()
{
"ns" : "<databaseName>.<collectionName>",
"count" : 2937359,
"size" : 5681676492,                   # 5.6 GB
"avgObjSize" : 1934.2805874256433,
"storageSize" : 4292853728,            # 4.2 GB
"numExtents" : 2,
"nindexes" : 2,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1.669999999836597,
"flags" : 1,
"totalIndexSize" : 220735648,
"indexSizes" : {
    "_id_" : 162326304,
    "e_1_" : 58409344
},
"ok" : 1

}

Não entendo como isso é possível. Todas as coleções do mongodb não são sempre backup por disco?

Alguém pode explicar esses resultados?

Chris W.
fonte
Já vi estatísticas assim antes, mas não tenho uma explicação. Tente executar um validate?
21412 Eve Freeman

Respostas:

6

storageSize é a soma de todas as extensões para esses dados, excluindo índices.

Para que a coleção ocupe 2 extensões, elas são ~ 2 GB cada, portanto, ~ 4 GB. sizeinclui índices e acredito que outras coisas aumentam o número. Nenhum dos dois realmente representa o tamanho adequado no disco. Para o tamanho do disco, db.stats()possui um campo de tamanho de arquivo mais próximo do que você deseja, acho que está procurando.

O manual é um pouco melhor para descrever o que os vários campos significam, veja aqui as coleções:

http://docs.mongodb.org/manual/reference/collection-statistics/

E aqui para estatísticas do banco de dados:

http://docs.mongodb.org/manual/reference/database-statistics/


Algumas outras informações potencialmente relevantes:

O comando compact não encolhe nenhum arquivo de dados; desfragmenta apenas o espaço excluído para que objetos maiores possam reutilizá-lo. O comando compact nunca excluirá ou reduzirá os arquivos do banco de dados e, em geral, requer espaço extra para realizar seu trabalho, geralmente no mínimo uma extensão extra.

Se você reparar o banco de dados, ele essencialmente reescreverá os arquivos de dados do zero, o que removerá o preenchimento e os armazenará no disco da maneira mais eficiente possível. No entanto, você precisará ter aproximadamente o dobro do tamanho do disco para fazê-lo (na verdade menos, mas é um guia decente).

Outra coisa a ter em mente aqui - conserte e remova o preenchimento compacto. O fator de preenchimento varia entre 1 (nenhuma movimentação de documentos causada pelo aumento de documentos) e 2 (muitas movimentações causadas pelo aumento de documentos). Seu fator de preenchimento de ~ 1,67 indica que você está crescendo (e, portanto, causando movimentos) bastante.

Ao compactar ou reparar um banco de dados, você remove esse preenchimento - o crescimento subsequente de documentos desencadeia ainda mais movimentos do que antes. Como as movimentações são operações relativamente caras, isso pode ter um sério impacto no seu desempenho. Mais informações aqui:

http://www.mongodb.org/display/DOCS/Padding+Factor

Adam C
fonte
Obrigado pela sua resposta @Adam, eu estou um pouco familiarizado com os fatores de preenchimento e compactação, o que me confunde nesse caso é que, não importa quão eficaz seja a compactação, nunca poderemos armazenar mais dados no banco de dados do que estamos armazenando no disco rígido! ou seja, como você encaixa 5,6 GB de dados mongo em 4,2 GB de disco?
22412 Chris W.
4.2GB de disco é apenas os dados, 5.6GB são os dados mais índices e, em seguida, para o tamanho do disco real que você provavelmente vai ter de olhar para as estatísticas de nível de banco de dados em vez
Adam C
Eu encontrei a mesma coisa! O que é estranho é que, no documento, ele diz que size não conta com índices: "Além disso, size não inclui o tamanho de nenhum índice associado à coleção, relatado pelo campo totalIndexSize".
MatiasSh
O motivo pode ser que o tamanho exibe o tamanho dos dados não compactados, enquanto o tamanho do armazenamento leva a compactação para a conta. É descrito no nível do banco de dados aqui, mas também parece ser aplicável à coleção: docs.mongodb.com/manual/reference/command/dbStats/…
MatijaSh 11/17
1

Para mongodb> 3.x

For MMAPv1: 
datasize < storageSize

but For wiredTiger
datasize > storageSize (most cases due to compression but may be
                        storageSize greater, it varies on condition like
                        compression technique, whether compact/repair 
                        command run or not)

Para db.getCollection ('name'). Stats ()

size = total size in memory of all records in a collection + padding (excluded index size + record header which is 16 byte per header, header means  = field name)        
avgObjSize = avg size of obj + padding
storageSize =  total amount of storage allocated to this collection for document storage. (totalIndex size excluded)
totalIndexSize : totalIndexSize (compressed in case of wiredTiger)

Para db.stats ()

dataSize = document + padding
storageSize = document + padding + deleted space
fileSize = document + padding extents +  index extents + yet-unused space

Podemos excluir espaço ou furo não utilizado dessa

db.getCollection('name').runCommand( "compact" )

Após executar o comando compact ou repair, podemos obter o tamanho exato do armazenamento e a diferença de tamanho dos dados.

Técnica de compressão em mongodb com fio

- snappy : good compression, low overhead
- zlib: better compression, more CPU
- none (we can disable compression, by default its enable in WT)
Kamal Kumar
fonte