En general, si no necesita reducir sus archivos de datos, no debe reducirlos en absoluto. Esto se debe a que "hacer crecer" sus archivos de datos en el disco es una operación bastante costosa y cuanto más espacio pueda asignar MongoDB en los archivos de datos, menos fragmentación tendrá.
Por lo tanto, debe intentar proporcionar la mayor cantidad de espacio de disco posible para la base de datos.
Sin embargo, si debe reducir la base de datos, debe tener en cuenta dos cosas.
MongoDB crece es archivos de datos por duplicando así los archivos de datos pueden ser 64 MB, a continuación, 128MB, etc hasta 2 GB (en cuyo punto se deja doblar a mantener los archivos de hasta 2 GB.)
Al igual que con la mayoría de las bases de datos ... a hacer operaciones como contraer necesita programar un trabajo por separado a , no hay "autoshrink" en MongoDB. De hecho, de las principales bases de datos noSQL (odio ese nombre), solo Riak se reescribirá automáticamente. Por lo tanto, necesitará crear un trabajo utilizando el planificador de su sistema operativo para ejecutar un encogimiento. Se podría utilizar un script bash, o tener un trabajo ejecutar un script php, etc.
Serverside Javascript
Puede utilizar el servidor Javascript para hacer el encogimiento y ejecutar de que JS a través de la concha de mongo en una base regular a través de un trabajo (como cron o el servicio de programación de windows) ...
Suponiendo una colección llamada foo que se ahorraría el Javascript a continuación en un archivo llamado bar.js y correr ...
$ mongo foo bar.js
el archivo JavaScript sería algo como ...
// 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));
Esto ejecutará y devolver algo así como ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Ejecutar este en un horario (en ninguno de pico horas) y eres bueno para ir.
con límite máximo Colecciones
Sin embargo hay otra opción, capped collections.
colecciones con límite máximo se fija un tamaño colecciones que tienen una característica muy alta edad de salida de auto-FIFO rendimiento (edad a cabo se basa en orden de inserción). Son un poco como el concepto "RRD" si está familiarizado con eso.
Además, colecciones capsulado automáticamente, con alto rendimiento, mantener el orden de inserción para el objetos de la colección; esto es muy potente para ciertos casos de uso , como el registro.
Básicamente se puede limitar el tamaño de (o número de documentos en) una colección decir .. 20 GB y una vez que se alcanza el límite de MongoDB comenzará a expulsar a los registros más antiguos y reemplazarlos con nuevas entradas como se entra.
Esta es una gran manera de mantener una gran cantidad de datos, descartando los datos anteriores con el paso del tiempo y manteniendo la misma cantidad de espacio de disco utilizado.
Gracias por la gran publicación. si no reduzco los archivos de datos, el mongod siempre costará mucha memoria, ¿cómo podría solucionarlo? –
@Zealot ... Ver mi respuesta sobre el uso de la memoria, podría ser útil. http://stackoverflow.com/questions/4468873/how-to-release-the-caching-which-is-used-by-mongodb/4482465#4482465 –
Lo tengo, tenemos 16GB de memoria, y el mongodb cuesta 4GB . Entonces, puede que no me importe. Gracias por estas respuestas –