Skip to content

Dateispeicherung und Objektspeicher

Vorwort

Ein Benutzer lädt ein Profilbild hoch, du speicherst es im /uploads-Verzeichnis des Servers — und dann ist die Serverfestplatte voll, oder du fügst einen zweiten Server hinzu, und der Benutzer findet sein Bild mal da, mal nicht. Dateispeicherung scheint einfach, ist aber in verteilten Umgebungen ein ernstzunehmendes Architekturproblem. Objektspeicher ist die Standardantwort des Internetzeitalters auf dieses Problem.

Was wirst du in diesem Artikel lernen?

Nach Abschluss dieses Kapitels wirst du Folgendes erhalten:

  • Speichertypen-Kenntnisse: Den Unterschied zwischen Blockspeicher, Dateispeicher und Objektspeicher und ihre Anwendungsszenarien verstehen
  • Kernkonzepte des Objektspeichers: Bucket, Object, Key, Pre-signed URL und andere Kernkonzepte beherrschen
  • Upload-Strategien: Die Auswahl zwischen Client-Direktupload und Server-Relay beherrschen
  • CDN-Beschleunigungsprinzipien: Verstehen, wie CDN die weltweite Verteilung statischer Ressourcen beschleunigt
  • Best Practices: Dateibenennung, Zugriffskontrolle, Lebenszyklusverwaltung und andere Praxistipps beherrschen
KapitelInhaltKernkonzept
Kapitel 1Speichertypen-VergleichBlockspeicher, Dateispeicher, Objektspeicher
Kapitel 2Kernkonzepte des ObjektspeichersBucket, Object, Key, Metadaten
Kapitel 3Datei-Upload-StrategienClient-Direktupload, Pre-signed URL
Kapitel 4CDN-BeschleunigungEdge-Knoten, Cache-Strategien, Origin-Pull
Kapitel 5Best PracticesBenennungskonventionen, Berechtigungen, Lebenszyklus

0. Übersicht: Warum man Dateien nicht lokal auf dem Server speichern sollte

Zu Beginn eines Projekts ist es die intuitivste Lösung, vom Benutzer hochgeladene Dateien in einem lokalen Serververzeichnis zu speichern. Mit dem Projektwachstum treten jedoch eine Reihe von Problemen auf:

  • Begrenzter Speicherplatz: Die Serverfestplatte wird immer voll, Erweiterung ist aufwändig
  • Keine Freigabe zwischen Servern: Bei Lastverteilung können Benutzeranfragen verschiedene Server erreichen, und die Datei wird nicht gefunden
  • Kein Backup: Wenn der Server ausfällt, sind die Dateien weg
  • Kein CDN: Weltweite Nutzer greifen auf denselben Server zu, was langsam ist

Der Kernwert des Objektspeichers

Objektspeicher (wie AWS S3, Alibaba Cloud OSS) löst all diese Probleme: unbegrenzte Kapazität, weltweiter Zugriff, automatische Backups, native CDN-Unterstützung. Er ist der De-facto-Standard für die Dateispeicherung in Internetanwendungen geworden.


1. Speichertypen-Vergleich: Block, Datei, Objekt

In der Computerwelt gibt es drei hauptsächliche Speicherarten, die Probleme auf unterschiedlichen Ebenen lösen.

Storage Type Comparison
Click to inspect the characteristics of each storage model
🧱
Block storage
📁
File storage
☁️
Object storage
Object storage
Stores files as objects through HTTP APIs. Each object has a unique key. It has a flat structure, nearly unlimited capacity, and low cost, making it a common choice for internet applications.
Access method
HTTP/HTTPS RESTful API (PUT/GET/DELETE)
Typical scenarios
Images, videos, backups, static site hosting, data lakes
Representative products
AWS S3, Alibaba Cloud OSS, MinIO, Cloudflare R2
Scalability
Nearly unlimited scaling with automatic distributed storage
DimensionBlockspeicherDateispeicherObjektspeicher
DateneinheitFestgroße BlöckeDatei + VerzeichnisObjekt (Key-Value)
ZugriffsprotokolliSCSI/FCNFS/SMBHTTP REST API
PerformanceHöchste (Millisekunden)MittelNiedriger (aber ausreichend)
SkalierbarkeitBegrenztMittelNahezu unbegrenzt
KostenHöchsteMittelNiedrigste
Typisches SzenarioDatenbankGemeinsame DateienBilder/Videos/Backups

Einfache Eselsbrücke

  • Blockspeicher ist wie eine Festplatte — für Datenbanken
  • Dateispeicher ist wie ein Netzwerk-Shared-Folder — für Konfigurationsfreigabe zwischen Servern
  • Objektspeicher ist wie ein Cloud-Drive — für von Benutzern hochgeladene Bilder und Videos

2. Kernkonzepte des Objektspeichers

Das Datenmodell des Objektspeichers ist sehr einfach: Ein Bucket ist der Container, ein Object ist die Datei, und jedes Objekt wird durch einen eindeutigen Key identifiziert.

my-app-bucket/                    ← Bucket
├── avatars/user-123.jpg          ← Object Key
├── avatars/user-456.png          ← Object Key
├── reports/2024/q1-report.pdf    ← Object Key ("Verzeichnis" ist nur ein Key-Präfix)
└── uploads/temp/file.zip         ← Object Key
KonzeptBeschreibungBeispiel
BucketSpeichercontainer, global eindeutiger Namemy-app-prod, company-assets
ObjectDie gespeicherte Datei selbst + MetadatenEin Bild, ein PDF
KeyDer eindeutige Identifikator des Objektsavatars/user-123.jpg
MetadatenZusätzliche Informationen zum ObjektContent-Type, benutzerdefinierte Tags
ACLAccess Control Listpublic-read, private
Pre-signed URLZeitlich begrenzter autorisierter ZugriffslinkUpload-/Download-Link mit 15 Minuten Gültigkeit

Objektspeicher hat keine echten "Verzeichnisse"

avatars/user-123.jpg — das avatars/ ist kein Verzeichnis, sondern nur ein Präfix des Keys. Der Objektspeicher ist flach strukturiert: Alle Objekte befinden sich auf derselben Ebene. Die in der Konsole angezeigten "Ordner" sind lediglich eine visuelle Gruppierung nach Präfix.


3. Datei-Upload-Strategien: Wer lädt die Datei hoch?

Für den Datei-Upload gibt es zwei gängige Ansätze: Server-Relay und Client-Direktupload. In den meisten Szenarien ist Client-Direktupload die bessere Wahl.

File Upload Method Comparison
Switch between upload modes to compare their flow
1
Client → Server
The user selects a file and uploads it to your backend server
Large files consume server bandwidth and memory
2
Server receives file
The backend temporarily stores the file on local disk or in memory
May hit Nginx body size limits
3
Server → OSS
The backend forwards the file to object storage
The file is transferred twice, which is inefficient
4
OSS returns URL
Object storage returns the file access URL
5
Server → Client
The backend returns the file URL to the frontend

Vorteile des Client-Direktuploads

  1. Server-Bandbreite sparen: Die Datei durchläuft nicht deinen Server, sondern geht direkt zum OSS
  2. Timeouts vermeiden: Große Datei-Uploads lösen keine Nginx/Gateway-Timeouts aus
  3. Serverlast senken: Der Server muss nur Anmeldeinformationen ausstellen, keine Datei-Streams verarbeiten
  4. Fortsetzbare Uploads unterstützen: OSS unterstützt nativ Multipart-Uploads, das Frontend kann Upload-Fortsetzung implementieren

Implementierungsschritte: Frontend fordert vom Backend eine Pre-signed URL an → Frontend lädt mit dieser URL direkt zum OSS hoch → OSS benachrichtigt das Backend per Callback


4. CDN-Beschleunigung: Schnelle Zugriffe für weltweite Nutzer

Wenn deine Nutzer weltweit verteilt sind, ist das Herunterladen von Dateien von einem einzigen Ursprungsserver langsam. Ein CDN (Content Delivery Network) cached die Dateien durch weltweit verteilte Edge-Knoten in der Nähe der Nutzer und reduziert so die Zugriffslatenz erheblich.

How CDN Acceleration Works
Compare file access paths with and without CDN
👤
Beijing user
5ms
Beijing CDN node
Cache hit
Return to origin on cache miss
🏢
Origin (US West S3)
Time to first byte (TTFB)
~30ms
Download 1MB image
~50ms
CDN-KonzeptBeschreibung
Edge-KnotenWeltweit verteilte Cache-Server
Origin-PullWenn der Edge-Knoten keinen Cache hat, wird die Datei vom Ursprungsserver angefordert
Cache-Hit-RateAnteil der Anfragen, die direkt von Edge-Knoten beantwortet werden — je höher, desto besser
TTLCache-Gültigkeitsdauer; nach Ablauf muss neu vom Ursprung geladen werden
Cache-InvalidierungAktives Löschen des Edge-Caches, damit neue Dateien wirksam werden

CDN Best Practices

  • Hash im Dateinamen: logo.a3f2b1.png statt logo.png, sodass bei Dateiaktualisierungen keine Cache-Invalidierung nötig ist
  • Sinnvolle TTL setzen: Statische Ressourcen (JS/CSS/Bilder) lange TTL (1 Jahr), HTML kurze TTL (5 Minuten)
  • Gzip/Brotli-Kompression aktivieren: Textressourcen werden nach Kompression um 60-80% kleiner

5. Best Practices

PraxisBeschreibungBeispiel
Key-BenennungskonventionenAussagekräftige Präfixe zur Organisation{type}/{date}/{uuid}.{ext}
Hotspot-Keys vermeidenNicht mit inkrementellen Zahlen beginnenUUID oder Hash-Präfix verwenden
Minimale BerechtigungenBucket standardmäßig privateNur für Dateien, die öffentlich sein müssen, public-read setzen
LebenszyklusregelnAutomatische Bereinigung abgelaufener DateienTemporäre Dateien nach 7 Tagen automatisch löschen
CORS-KonfigurationClient-Direktupload erfordert CORS-KonfigurationEigene Domäne für PUT/POST erlauben
Serverseitige VerschlüsselungSSE für sensible Dateien aktivierenSSE-S3 oder SSE-KMS

Zusammenfassung

Dateispeicherung ist ein Grundproblem, dem jede Webanwendung begegnet. Objektspeicher ist mit seiner unbegrenzten Kapazität, niedrigen Kosten und hohen Verfügbarkeit zur Standardwahl für Internetanwendungen geworden.

Wichtige Erkenntnisse dieses Kapitels:

  1. Drei Speichertypen: Blockspeicher für Datenbanken, Dateispeicher für Freigabe, Objektspeicher für Benutzerdateien
  2. Objektspeicher-Modell: Bucket + Key + Object, flache Struktur, HTTP-API-Zugriff
  3. Client-Direktupload: Pre-signed URL-Ansatz, Dateien durchlaufen nicht den Server, effizient und ressourcenschonend
  4. CDN-Beschleunigung: Edge-Caching + Dateiname-Hash für schnellen weltweiten Zugriff
  5. Sicherheit und Verwaltung: Minimale Berechtigungen, Lebenszyklusregeln, serverseitige Verschlüsselung

Weiterführende Literatur