В общем, если вам не нужно сжимать ваши файлы данных, вы не должны сжимать их вообще.Это связано с тем, что «наращивание» ваших файлов данных на диске является довольно дорогой операцией, и чем больше MongoDB выделяет в файлах данных, тем меньше у вас фрагментации.
Итак, вам следует попытаться выделить как можно больше дискового пространства.насколько это возможно для базы данных.
Однако если вам необходимо уменьшить базу данных, вы должны иметь в виду две вещи.
MongoDB увеличивает свои файлы данныхудваивая таким образом, файлы данных могут иметь размер 64 МБ, затем 128 МБ и т. д. до 2 ГБ (после чего он перестает удваиваться, чтобы сохранить файлы до 2 ГБ.)
Как и в большинстве других баз данных ...для выполнения таких операций, как сжатие, вам нужно запланировать отдельную работу, в MongoDB нет «автоусадки».На самом деле из основных баз данных noSQL (ненавижу это имя) только Riak будет автоматически сжиматься.Итак, вам нужно будет создать задание, используя планировщик вашей ОС для запуска сжатия.Вы можете использовать bash-скрипт, или запустить работу php-скрипта и т. Д.
Javascript на стороне сервера
Вы можете использовать Javascript на стороне серверачтобы сжимать и запускать этот JS через оболочку Монго на регулярной основе через задание (например, cron или службу планирования Windows) ...
Предполагая, что коллекция называется foo , которую вы хотите сохранитьjavascript ниже в файл с именем bar.js и запустите ...
$ mongo foo bar.js
Файл javascript будет выглядеть примерно так ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();
print('Storage Size: ' + tojson(storage));
print('TotalSize: ' + tojson(total));
print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');
// Run repair
db.repairDatabase()
// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();
print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));
Thisбудет запускаться и возвращать что-то вроде ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Запустите это по расписанию (в часы без пиковых нагрузок), и все готово.
Ограниченные коллекции
Однако есть еще один вариант, ограниченные коллекции .
Закрытые коллекции - это коллекции фиксированного размера, обладающие очень высокой производительной функцией автоматического истечения срока действия FIFO (срок действия зависит от порядка вставки).Они немного похожи на концепцию «RRD», если вы с ней знакомы.
Кроме того, закрытые коллекции автоматически, с высокой производительностью, поддерживают порядок вставки объектов в коллекции;это очень полезно для определенных случаев использования, таких как ведение журнала.
По сути, вы можете ограничить размер (или количество документов) в коллекции, скажем .. 20 ГБ, и как только этот предел будет достигнут, MongoDB будетначинайте выбрасывать самые старые записи и заменять их новыми записями по мере их поступления.
Это отличный способ сохранить большой объем данных, отбросить более старые данные с течением времени и сохранить тот же объемиспользуемого дискового пространства.