Webserver Dateien(Dokumente) verwalten: wie?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

Hallo community,

ich bin gerade dabei ein System für einen Webserver zu erstellen, der Dokumente verwaltet. Es sollen folgende Anforderungen erfüllt werden:
  • Große Anzahl an Dateien (ca. 3-5 mio.)
    Hauptsächlich pdf
    Einteilbar in 4 Kategorien (Ordnerstruktur)
    Zu jeder Datei sollen Stichworte, und ein paar andere Attribute gespeichert werden
    Die Dateien sollen nur über temporäre links verfügbar sein (nur für registrierte User)
Meine Frage ist, wie ihr eine derartige Verwaltung umsetzen würdet?

Der erste Gedanke ist sicher es über ein Datenbank zu machen. Für den fall ist die Frage, wie man die Dateien dann hinterlegt (alle in einen Ordner oder struckturiert)?

Wenn die Dateien aber stuckturiert gespeichert sind, kann ich den Zugriff aber ja sicher auch ohne Datenbank regeln?

Hat jemand Erfahrungen mit einem ähnlichen System, und kann mir nützliche Tipps geben?

LG TjuXx
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde da vermutlich auf einen Key-Value-Store setzen. Die Dinger sind extrem schnell und verwalten auch riesige Datenmengen. Zudem bringen einige bereits Replikationskonzepte mit.

Die ewige Frage nach Link auf Datei oder "Blob" ist wohl nur schwer zu klären. Ich würde ja intuitiv sagen, dass Dateisysteme perfekt auf das Verwalten von Dateien zugeschnitten sind. Insofern würde ich wohl mit Links arbeiten.

Schau Dir doch mal diesen Artikel an:
http://en.wikipedia.org/wiki/NoSQL
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

3 bis 5 Mio? Wow!

Was mir spontan einfällt:

- CouchDB
- Alfresco

Gruß, noisefloor
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich finde ja, die Dateien machen sich doch gut im Dateisystem (wo sie wahrscheinlich jetzt schon liegen). Die Metadaten gehören dann eher in eine DB (außer man nutzt spezielle Dateiattribute wie NT oder Mac sie haben - Linux-Dateisysteme vielleicht auch, keine Ahnung) aber wenn man mehr machen will, als über den Dateinamen zu suchen, wird das langsam. Nachteil der DB-Lösung ist, das sie aus dem Tritt kommen kann, wenn jemand zu Fuß am Dateisystem fummelt. Das passiert mit erweiterten Dateiattributen nicht. Wenn die Leute aber die Finger von den Dateien lassen können, ist DB + Dateisystem die einfachste Lösung.

Einen KVS könnte man benutzen, aber ich sehe nicht, wo er seinen Vorteil ausspielen könnte. Sind die Extraattribute individuell pro Datei und unterliegen keinem Schema? Muss man sehr schnell (schneller als es z.B. mysql könnte) zugreifen? Mir scheint, das langsamste (und wir reden hier von Größenordnungen) ist sowieso das lesen der Dateien und das ausliefern per Webserver. Da spielen die paar Millisekunden für den Datenbank-Zugriff doch wohl keine Rolle.

Bei einem Dateiarchiv denke ich zuerst an die Dauerhaftigkeit. Daher würde ich die denkbar einfachste Speicherung der Daten wählen, damit man da auch noch Jahre später ohne spezielle Software rankommen kann.

Übrigens, lighttpd unterstützt AFAIK zeitlich begrenzt funktionierte URLs. Das wäre schon mal die halbe Miete für den Download-Server.

Ansonsten ist das aber auch nicht schwer. Alles was ich machen muss, ist URLs zu generieren, die (verschlüsselt) den Benutzer und eine Zeit enthalten. Sagen wir, die Benutzer-ID hat maximal 8 Bytes, ein Zeitpunkt ebenfalls, so sind das 16-Bytes, in die ich 16 weitere zufällige Bytes mische, um auf 32 zu kommen, das kann ich dann mit einem geheimen AES-Schlüssel (den ich täglich oder wöchentlich ändere) verschlüsseln und als Base64-kodierten (jedenfalls fast - ich würde / + und = ersetzen - oder man nimmt hexadezimal-Kodierung) String an meine URL hängen.

Nun muss ein Server (in 5-10 Zeilen) dieses Token nehmen, entschlüsseln, Benutzer und Zeit prüfen und dem eigentlichen Web-Server signalisieren (x-sendfile), ob er ausliefern darf oder nicht.

Tatsächlich muss man den Benutzer gar nicht kodieren, ein zeitbeschränktes Ticket sollte reichen, denn nur ein angemeldeter Benutzer konnte es ja bekommen. Macht's noch mal ein bisschen einfacher.

Stefan
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

> Sind die Extraattribute individuell pro Datei und unterliegen keinem Schema?
Bei CouchDB ist das so (und ich denke mal, bei anderen dokumentenorientierten DBs auch). CouchDB kann BTW auch supereinfach Dateien in der DB handeln, ohne BLOB und so'n Quatsch. ;-)

Wenn wirklich nur eine selektierter Kreis von Leuten (die Admins) Zugriff auf die Dateien haben, ist Filesystem + DB auch nicht schlecht.

BTW, Linux kennt auch erweiterte Dateiattribute. Aber wie gut (oder schlecht) man von Python darauf zugreifen kann weiß ich nicht. Abgesehen davon: Wenn du alle Meta-Infos in den Attributen unterbringst und dann bei 3 Mio Dateien suchst könnte das etwas... lange dauern, oder?

Gruß, noisefloor
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

Vielen Dank erstmal für die Tipps.

Der Zugriff auf die Dateien soll ausschließlich über ein Webinterface stattfinden. "Manuelle" Eingriffe sind nicht geplant.

Ich werde nochmal einen intensiven Blick auf CouchDB werfen, ich tendiere aber auch mehr zu einer Lösung mit DB + Filesystem. Gerade auch um eine halbwegts schnelle Suche anbieten zu können.
Antworten