Koleksi Mongo `Ukuran` lebih besar * dari` ukuran penyimpanan`?

9

Saya baru-baru ini memadatkan koleksi saya menggunakan perintah:

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

Dan sekarang ukuran koleksi saya tampaknya lebih besar dari ukuran pada disk!

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

}

Saya tidak mengerti bagaimana ini mungkin. Bukankah semua koleksi mongodb didukung oleh disk setiap saat?

Adakah yang bisa menjelaskan hasil ini?

Chris W.
sumber
Saya telah melihat statistik seperti itu sebelumnya, tetapi tidak memiliki penjelasan. Coba jalankan validate?
Eve Freeman

Jawaban:

6

storageSize adalah jumlah dari semua luasan untuk data itu, tidak termasuk indeks.

Sehingga koleksi membutuhkan 2 extents, masing-masing ~ 2GB, karenanya ~ 4GB. sizetermasuk indeks dan saya percaya beberapa hal lain yang meningkatkan jumlahnya. Tidak ada yang benar-benar mewakili ukuran pada disk yang tepat. Untuk ukuran disk, db.stats()memiliki bidang filesize yang lebih dekat dengan apa yang Anda inginkan. Saya pikir Anda sedang mencari.

Manual ini agak lebih baik dalam menguraikan arti berbagai bidang, lihat di sini untuk koleksi:

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

Dan di sini untuk statistik basis data:

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


Beberapa informasi lain yang berpotensi relevan:

Perintah ringkas tidak menyusutkan file data apa pun; itu hanya men-defrag ruang yang dihapus sehingga objek yang lebih besar dapat menggunakannya kembali. Perintah ringkas tidak akan pernah menghapus atau mengecilkan file database, dan secara umum membutuhkan ruang ekstra untuk melakukan tugasnya, biasanya minimal satu tingkat tambahan.

Jika Anda memperbaiki database itu pada dasarnya akan menulis ulang file data dari awal, yang akan menghapus padding dan menyimpannya di disk seefisien yang akan Anda dapatkan. Namun Anda harus memiliki ~ 2x ukuran pada disk untuk melakukannya (sebenarnya kurang, tapi ini panduan yang layak).

Satu hal lagi yang perlu diingat di sini - perbaikan dan padding pelepas yang kompak. Faktor padding bervariasi antara 1 (tidak ada gerakan dokumen yang disebabkan oleh pertumbuhan dokumen), hingga 2 (banyak gerakan yang disebabkan oleh pertumbuhan dokumen). Faktor padding ~ 1,67 Anda akan menunjukkan Anda tumbuh (dan karenanya menyebabkan gerakan) sedikit.

Saat Anda memadatkan atau memperbaiki basis data, Anda menghapus lapisan tersebut - pertumbuhan dokumen selanjutnya akan memicu lebih banyak gerakan dari sebelumnya. Karena gerakan adalah operasi yang relatif mahal, ini dapat berdampak serius pada kinerja Anda. Info lebih lanjut di sini:

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

Adam C
sumber
Terima kasih atas tanggapan Anda @Adam, saya agak terbiasa dengan faktor padding dan memadatkan, yang membingungkan saya dalam hal ini adalah, tidak peduli seberapa efektif pemadatan, kita seharusnya tidak pernah dapat menyimpan lebih banyak data dalam database daripada yang kita simpan di harddisk! yaitu, bagaimana Anda memasukkan 5,6GB data mongo dalam disk 4.2GB?
Chris W.
4.2GB disk hanyalah data, 5.6GB adalah data plus indeks, dan kemudian untuk ukuran disk sebenarnya Anda mungkin harus melihat statistik tingkat basis data sebagai gantinya
Adam C
Saya mengalami hal yang sama! Apa yang aneh adalah bahwa dalam dokumen mereka dikatakan ukuran tidak memperhitungkan indeks: "Selain itu ukuran tidak termasuk ukuran indeks yang terkait dengan koleksi, yang dilaporkan oleh totalIndexSize bidang."
MatijaSh
Alasannya mungkin karena ukuran menampilkan ukuran data yang tidak terkompresi, sementara ukuran penyimpanan mengambil kompresi ke dalam akun. Ini dijelaskan pada tingkat db di sini, tetapi tampaknya juga berlaku untuk pengumpulan: docs.mongodb.com/manual/reference/command/dbStats/…
MatijaSh
1

Untuk 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)

Untuk 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)

Untuk db.stats ()

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

Kami dapat menghapus ruang atau lubang yang tidak digunakan dengan ini

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

Setelah menjalankan perintah kompak atau perbaikan, kita bisa mendapatkan ukuran penyimpanan yang tepat dan perbedaan ukuran data.

Teknik Kompresi di mongodb wiredTiger:

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