2012-07-16 9 views
5

Ich arbeite gerade an einem 'einfachen' Foto-System mit mongoDB, mit einem Replica Set und GridFS.GridFS benutze Dateiname als Index

Das Prinzip ist einfach, ich habe eine Menge Fotos setzen GridFS verwenden, kennt der Client den Dateinamen, und aus dem Dateinamen kann ich die Datei abzurufen.

Verwendet GridFS Dateinamen als Indizes? Hoffentlich ja, ich konnte es in keinem offiziellen Dokument finden.

Meine Statistiken sind:

 { 
     "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 
    } 

EDIT: von indizieren() die Sammlungen, I 30 Go gewonnen, aber es ist immer noch viel zu hoch ..

Meine Indizes sind:

{ 
    "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 ndexes Größe:

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

ich nie _id_ verwenden, wie ich es nicht speichern, ist es OK, um sie zu entfernen? Indexgröße ist 125084624, was bedeutet, dass ich fast alle meine Fotos im RAM haben sollte, was ein bisschen seltsam ist?

Weitere Fragen:

  1. Statistik: mongostats ist die Grundlagen, gibt es ein weiteres gutes Werkzeug für die Überwachung, oder muss ich mein eigenes Werkzeug erstellen?

  2. Fehler: Ich konnte eine Menge sehen (ungefähr 100 pro Sekunde), wenn ich viele Einfügungen mache, ich habe nichts auf der Konsole ... wo soll ich nachforschen?

  3. Connecion Pool mit JAVA/Tomcat: Ich benutze eine einfache Tomcat Webapp Verbindung zu MongoDB, würden Sie eine neue Verbindung zu mongoDB für jede Anfrage öffnen (ich denke nicht) oder eine Referenz als Singleton behalten auf dem Mongo-Objekt (mit Holder zum Beispiel) oder mit einem guten Pool, aber ich habe keinen Standard gefunden?

Vielen Dank!

Antwort

4

Um Ihre Fragen zu beantworten:

1) Wenn Sie eine GridFS Sammlung mit dem Java-Treiber zu initialisieren, dass Treiber erstellt automatisch Indizes für die Dateien .files und .chunks.

2) MongoDB erfordert, dass Sie ein _id-Feld und einen eindeutigen _id-Index haben. Der Standard '_id' ist nur 12 Bytes lang - es gibt wirklich keinen signifikanten Overhead, wenn er vorhanden ist.

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

3) Die Werte auf dem "filename_1_uploadDate_1" Index zeigen nur die Größe des Index. Dieser Index enthält nur den Inhalt des Dateinamens und der Upload-Datenfelder - er enthält keine der Fotodaten selbst. Sie möchten, dass der aktive Teil des Index aus Leistungsgründen in den Arbeitsspeicher passt.

Referenzen:

4) Wenn Sie erweiterte Statistiken und Überwachung haben wollen, registrieren Sie Ihr System in der von 10gen kostenlos zur Verfügung gestellt MMS-Monitoring-System. Weitere Informationen erhalten Sie hier: https://mms.10gen.com/help/

5) Seitenfehler sind beim Laden neuer Daten normal. MongoDB verwendet speicherorientierte Dateien. Jedes Mal, wenn Sie an einen neuen Speicherort innerhalb der Datendatei schreiben, muss das Betriebssystem auf dieser Seite einen Fehler melden.

Weitere Informationen über Memory-Mapped-Dateien, hier: http://docs.mongodb.org/manual/faq/storage/

6) Der MongoDB Java-Treiber seinen eigenen Verbindungspool zur Verfügung stellt. Wenn Sie keine wirklich leistungsstarke Anwendung ausführen, verwenden Sie das Mongo-Objekt wahrscheinlich am besten als Singleton.

+0

Perfekter Dank! PS: Ich dachte, die Größen wären schon in KB, wenn es in B ginge, also kann es erklären, warum ich es für enorm hielt. –

2

Sieht aus wie Sie _id Feld haben, in jedem ‚normalen‘ Dokument haben:

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

Wenn Sie angeben, nicht, wie es erzeugt wird, MongoDB wird automatisch generiert es BsonObjectId Datentyp verwenden und auch automatisch erstellen ein Index darauf. Es ist, weil Mongo über die Einzigartigkeit dieses Feldes sicher ist. Aber wenn Sie nicht it..like in Ihrem Fall verwenden möchten, können Sie Dateiname + dateupload in _id Feld setzen und lassen Sie Mongo den Index damit umgehen ..

Auch, was Sie erwähnt haben about..the 125.084.624 Ding, das ist die Größe des Index auf _id. Die Gesamtgröße Ihrer Fotos könnte viel mehr sein .. 125 MB im RAM sieht für mich harmlos aus.
Ich weiß nicht, wie Sie Fehler besser untersuchen können, aber .. ich nehme an, dass Sie 64-Bit verwenden. Wenn es 32 Bit ist, dann ist die DB-Größe auf 2 GB begrenzt. Ihre Inserts beginnen zu einem bestimmten Zeitpunkt davor zu versagen.

Wie auch immer, in Bezug auf Verbindungen, versuchen und testen mit ein paar Anfragen, einmal mit einzelnen Verbindungen und einmal mit Singleton .. Ich denke ein Singleton sollte besser funktionieren. Um die Leistung zu testen, oder führen Sie einen Last-Test, können Sie Jmeter verwenden:

http://jmeter.apache.org/