2012-07-16 19 views
5

Actualmente estoy trabajando en un sistema de fotos 'simple' con mongoDB, usando un conjunto de réplicas y GridFS.GridFS usa el nombre de archivo como índice

El principio es simple, puse muchas fotos usando GridFS, el cliente conoce el nombre del archivo, y del nombre del archivo puedo recuperar el archivo.

¿GridFS usa el nombre del archivo como índices? Espero que sí, no pude encontrarlo escrito en ningún documento oficial.

Mis estadísticas son:

 { 
     "ns" : "photos.socialphotos.files", 
     "count" : 758086, 
     "size" : 168295128, 
     "avgObjSize" : 222.00004748801587, 
     "storageSize" : 220647424, 
     "numExtents" : 15, 
     "nindexes" : 2, 
     "lastExtentSize" : 43311104, 
     "paddingFactor" : 1, 
     "flags" : 1, 
     "totalIndexSize" : 125084624, 
     "indexSizes" : { 
      "_id_" : 22925504, 
      "filename_1_uploadDate_1" : 102159120 
     }, 
     "ok" : 1 
    } 

EDITAR: por REINDEX() las colecciones, que ganó 30 Ve, pero sigue siendo demasiado alto ..

Mis índices son:

{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "photos.socialphotos.files", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "filename" : 1, 
     "uploadDate" : 1 
    }, 
    "ns" : "photos.socialphotos.files", 
    "name" : "filename_1_uploadDate_1" 
} 

I tamaño ndexes:

"keysPerIndex" : { 
    "photos.socialphotos.files.$_id_" : 758086, 
    "photos.socialphotos.files.$filename_1_uploadDate_1" : 758086 
} 

nunca uso _id_ ya que no almacenarlo, ¿está bien para eliminarlo? El tamaño del índice es 125084624, lo que significa que debería tener casi todas mis fotos en la RAM, lo cual es un poco extraño.

preguntas adicionales:

  1. Estadísticas: mongostats es lo básico, ¿hay otra buena herramienta para el seguimiento, o tengo que crear mi propia herramienta?

  2. Fallas: Pude ver MUCHAS (alrededor de 100 por segundo) cuando hago muchas inserciones, no tengo nada en la consola ... ¿dónde debo investigar?

  3. Connecion Pool con JAVA/Tomcat: estoy usando una conexión simple de Tomcat webapp para MongoDB, ¿recomendaría abrir una nueva conexión a mongoDB para cada solicitud (supongo que no) o mantener una referencia como singleton en el objeto Mongo (con Holder por ejemplo) o usando un buen grupo, pero no encontré uno estándar?

Muchas gracias!

Respuesta

4

a responder a sus preguntas:

1) Al inicializar una colección GridFS utilizando el controlador de Java, que el conductor creará automáticamente índices en los archivos .files y .chunks.

2) MongoDB requiere que tenga un campo '_id' y un índice '_id' único. El '_id' predeterminado tiene solo 12 bytes de longitud, realmente no hay una sobrecarga significativa por tenerlo presente.

Referencia: http://www.mongodb.org/display/DOCS/Object+IDs

3) Las estadísticas sobre el índice "filename_1_uploadDate_1" sólo indican el tamaño de la índice. Este índice contiene solo los contenidos del nombre de archivo y los campos de carga de datos; no contiene ninguno de los datos de la foto en sí. Desea que la parte activa del índice quepa en la RAM por motivos de rendimiento.

Referencias:

4) Si usted quiere tener estadísticas y seguimiento avanzados, inscribir a su sistema en el sistema de monitoreo MMS gratuito proporcionado por 10gen. Para obtener más información, comience aquí: https://mms.10gen.com/help/

5) Las fallas de página son normales al cargar datos nuevos. MongoDB utiliza archivos mapeados en memoria, por lo que cada vez que escriba en una nueva ubicación dentro del archivo de datos, el sistema operativo tendrá que fallar en esa página.

Para obtener más información acerca de los archivos de memoria asignada, mira aquí: http://docs.mongodb.org/manual/faq/storage/

6) El conductor MongoDB Java proporciona su propio conjunto de conexiones. A menos que esté haciendo una aplicación realmente de alto rendimiento, probablemente sea mejor que use el objeto Mongo como singleton.

+0

Perfecto gracias! PD: Pensaba que los tamaños ya estaban en KB cuando estaban en B, así que puede explicar por qué pensé que era enorme. –

2

Parece que usted tiene que tener campo _id en cada documento 'regular':

http://www.mongodb.org/display/DOCS/Object+IDs

Si no se especifica cómo se genera, MongoDB generar automáticamente usando BsonObjectId tipo de datos y también se crea automáticamente un índice sobre él ... Es porque Mongo está seguro de la singularidad de este campo. Pero si no quiere usarlo ... como en su caso, puede poner el nombre del archivo + dateupload en el campo _id y dejar que Mongo maneje el índice en él.

Además, lo que ha mencionado sobre ... el 125084624 cosa, ese es el tamaño del índice en _id. El tamaño total de tus fotos podría ser mucho más ... 125 MB en la memoria RAM parece inofensivo para mí.
No sé cómo podrías investigar mejor las fallas, pero ... Supongo que estás usando 64 bits. Si es de 32 bits, entonces el tamaño de la base de datos está limitado a 2 GB ... Sus inserciones comenzarán a fallar en algún momento antes de eso ...

De todos modos, con respecto a las conexiones, prueba y prueba con algunas solicitudes, una con conexiones individuales y otra con singleton ... Supongo que un singleton debería funcionar mejor. Para probar el rendimiento, o llevar a cabo una prueba de carga, es posible utilizar Jmeter:

http://jmeter.apache.org/

Cuestiones relacionadas