Колекція Mongo `Розмір 'на * більше *, ніж" storageSize "?


9

Я нещодавно ущільнив свою колекцію за допомогою команди:

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

І тепер мій розмір колекції здається більшим за розмір на диску!

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

}

Я не розумію, як це можливо. Чи не всі колекції mongodb постійно підкріплені на диску?

Хтось може пояснити ці результати?


Я бачив подібні статистичні дані раніше, але не маю пояснень. Спробуйте запустити validate?
Єва Фріман

Відповіді:


6

storageSize - це сума всіх розширень для цих даних, за винятком індексів.

Таким чином, ця колекція займає 2 розширення, вони ~ 2 ГБ кожен, отже, ~ 4 ГБ. sizeвключає індекси, і я вважаю, що ще кілька речей, які збільшують число. Жоден із справді не відображає належного розміру диска. Що стосується розміру диска, db.stats()є поле розміру файлів, яке ближче до того, що ви хочете, я думаю, що ви шукаєте.

Посібник дещо краще окреслити, що означають різні поля, дивіться тут для колекцій:

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

І ось тут для статистики бази даних:

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


Дещо інша потенційно відповідна інформація:

Компактна команда не зменшує жодних файлів даних; він лише дефрагментує видалений простір, щоб більші об'єкти могли його повторно використовувати. Компактна команда ніколи не видаляє і не скорочує файли баз даних, і взагалі потрібен додатковий простір для виконання своєї роботи, як правило, як мінімум один додатковий обсяг.

Якщо ви відремонтуєте базу даних, вона по суті перезаписує файли даних з нуля, що видалить прокладки та збереже їх на диску так само ефективно, як ви збираєтеся отримати. Однак для цього вам потрібно мати ~ 2x розмір на диску (насправді менше, але це гідне керівництво).

Тут слід пам’ятати ще одне - ремонтувати та компактно знімати накладки. Коефіцієнт прокладки коливається від 1 (відсутність переміщень документів, викликаних зростаючими документами), до 2 (безліч рухів, викликаних зростаючими документами). Коефіцієнт забивання ~ 1,67 вказує на те, що ти зростаєш (а отже, спричиняєш рухи) зовсім небагато

Коли ви компактуєте або ремонтуєте базу даних, ви видаляєте цю підкладку - тому подальший ріст документа викличе ще більше кроків, ніж раніше. Оскільки рухи є відносно дорогими операціями, це може серйозно вплинути на вашу продуктивність. Більше інформації тут:

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


Дякую за вашу відповідь @Adam, я дещо знайомий з факторами прокладки та ущільнення, що мене бентежить в цьому випадку, це те, що, як би не було ефективне ущільнення, ми ніколи не зможемо зберігати більше даних у базі даних, ніж ми зберігаємо жорсткий диск! тобто як вам розмістити 5,6 ГБ даних монго в 4,2 ГБ диска?
Кріс В.

4,2 Гб диска - це лише дані, 5,6 ГБ - це дані плюс індекси, і тоді для фактичного розміру диска вам, мабуть, доведеться шукати замість статистики рівня баз даних
Адам C

Я наткнувся на те саме! Що дивно, що в їх документі він говорить, що розмір не враховує індекси: "Додатково розмір не включає розмір будь-яких індексів, пов'язаних із колекцією, про які повідомляє поле totalIndexSize."
MatijaSh

Причина може полягати в тому, що розмір відображає нестиснений розмір даних, тоді як розмір пам’яті вимагає стиснення в обліковому записі. Він описаний на рівні db тут, але, здається, застосовний і для колекції: docs.mongodb.com/manual/reference/command/dbStats/…
MatijaSh

1

Для 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)

Для db.getCollection ('ім'я'). 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)

Для db.stats ()

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

Цим ми можемо видалити невикористаний простір або отвір

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

Запустивши компактну або команду відновлення, ми можемо отримати точний розмір пам’яті та різницю розміру даних.

Техніка стиснення в mongodb wiredTiger:

- snappy : good compression, low overhead
- zlib: better compression, more CPU
- none (we can disable compression, by default its enable in WT)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.