Datenbank-Sharding
Inhaltsverzeichnis
Schnellübersicht
Auf dieser Seite lernen Sie alles über Datenbank-Sharding:
- Definition: Was ist Sharding und warum wird es benötigt?
- Sharding vs. Replication: Der wichtige Unterschied
- Sharding-Strategien: Range, Hash, Directory, Geo
- Shard Keys: Die richtige Wahl des Schlüssels
- Architekturen: Shared-Nothing, Proxy/Router
- Vorteile & Nachteile: Wann lohnt sich Sharding?
- Use Cases: E-Commerce, IoT, Social Media, Gaming
- Challenges: Rebalancing, Cross-Shard Queries, Hotspots
- FAQ: Häufige Fragen zu Sharding
1. Was ist Datenbank-Sharding?
Definition
Sharding (auch horizontale Partitionierung genannt) ist eine Datenbank-Architektur-Technik, bei der eine große Datenbank in kleinere, verwaltbare Teile – sogenannte Shards – aufgeteilt und auf mehrere Server verteilt wird. Jeder Shard enthält einen Teil der Gesamtdaten und läuft auf einem eigenen Datenbank-Server.
Im Gegensatz zur vertikalen Skalierung (mehr CPU/RAM auf einem Server) ermöglicht Sharding horizontale Skalierung – durch Hinzufügen weiterer Server kann die Datenbank-Kapazität und -Leistung nahezu unbegrenzt gesteigert werden.
Die drei Kernprinzipien von Sharding: Partitionierung (Daten aufteilen), Distribution (auf Server verteilen) und Transparenz (Anwendung sieht nur eine logische Datenbank).
Warum Sharding?
Sharding wird benötigt, wenn:
- Daten zu groß: Eine einzelne Datenbank-Instanz kann die Datenmenge nicht mehr speichern
- Performance-Probleme: Queries werden zu langsam, weil die Datenbank zu groß ist
- Skalierungsbedarf: Vertikale Skalierung (größerer Server) ist zu teuer oder nicht mehr möglich
- Geografische Verteilung: Daten sollen näher an den Benutzern gespeichert werden
2. Sharding vs. Replication
Sharding und Replication sind zwei unterschiedliche Techniken zur Skalierung von Datenbanken. Oft werden sie kombiniert.
Sharding
Jeder Server enthält einen unterschiedlichen Teil der Daten. Zusammen bilden alle Shards die komplette Datenbank.
- Horizontale Skalierung: Mehr Server = mehr Kapazität
- Datenpartitionierung: Jeder Shard hat andere Daten
- Write-Skalierung: Schreiblast wird verteilt
- Keine Redundanz: Daten nur auf einem Shard
- Komplexität: Höher (Shard Key, Rebalancing)
Replication
Jeder Server enthält eine komplette Kopie der Daten. Alle Replikate haben dieselben Daten.
- Read-Skalierung: Leseanfragen werden verteilt
- Hochverfügbarkeit: Fallback bei Serverausfall
- Redundanz: Daten auf mehreren Servern
- Einfachheit: Keine komplexe Logik nötig
- Keine Write-Skalierung: Writes nur auf Primary
Kombination: Sharding + Replication
In der Praxis werden Sharding und Replication oft kombiniert:
- Sharding: Daten werden auf mehrere Shards verteilt (horizontale Skalierung)
- Replication: Jeder Shard hat mehrere Replikate (Hochverfügbarkeit + Read-Skalierung)
- Beispiel: MongoDB Replica Sets mit Sharding, MySQL Group Replication
3. Sharding-Strategien
Es gibt verschiedene Strategien, wie Daten auf Shards verteilt werden können. Die Wahl der Strategie hängt von den Daten und den Anforderungen ab.
Range Sharding
Daten werden basierend auf einem Wertebereich auf Shards verteilt. Jeder Shard enthält einen bestimmten Bereich.
- Einfach zu implementieren
- Gute Performance für Range-Queries
- Vorhersagbare Datenverteilung
- Risiko von Hotspots
- Ungleiche Verteilung möglich
Shard 1: ID 1-1.000.000
Shard 2: ID 1.000.001-2.000.000
Shard 3: ID 2.000.001-3.000.000
Hash Sharding
Eine Hash-Funktion wird auf den Shard Key angewendet. Der Hash-Wert bestimmt, auf welchem Shard die Daten gespeichert werden.
- Gleichmäßige Datenverteilung
- Keine Hotspots
- Gute Performance für Point-Queries
- Schlecht für Range-Queries
- Rebalancing schwierig
Hash(User_ID) % Anzahl_Shards = Shard-Nummer
Hash("user123") % 4 = 2 → Shard 2
Directory Sharding
Ein zentrales Verzeichnis (Lookup-Table) speichert die Zuordnung zwischen Daten und Shards. Der Router fragt das Verzeichnis, wo die Daten liegen.
- Maximale Flexibilität
- Einfaches Rebalancing
- Keine feste Zuordnung
- Lookup-Table ist Single Point of Failure
- Extra Latenz für Lookup
Lookup-Table:
user123 → Shard 2
user456 → Shard 1
user789 → Shard 3
Geo Sharding
Daten werden basierend auf geografischen Kriterien verteilt. Jeder Shard ist in einer bestimmten Region platziert.
- Niedrige Latenz für lokale Benutzer
- Compliance (Datenhoheit)
- Disaster Recovery
- Cross-Region Queries langsam
- Komplexes Rebalancing
Shard EU: Europäische Benutzer
Shard US: US-Benutzer
Shard Asia: Asiatische Benutzer
| Strategie | Verteilung | Vorteile | Nachteile | Einsatz |
|---|---|---|---|---|
| Range | Wertebereiche | Einfach, gut für Range-Queries | Hotspots möglich | Zeitserien, Logs |
| Hash | Hash-Funktion | Gleichmäßige Verteilung | Schlecht für Range-Queries | User-Daten, Key-Value |
| Directory | Lookup-Table | Flexibel, einfaches Rebalancing | Single Point of Failure | Komplexe Szenarien |
| Geo | Regionen | Niedrige Latenz, Compliance | Cross-Region langsam | Globale Anwendungen |
4. Shard Keys – Die richtige Wahl
Der Shard Key ist das Feld (oder die Kombination von Feldern), das bestimmt, auf welchem Shard ein Datensatz gespeichert wird. Die Wahl des Shard Keys ist entscheidend für die Performance.
Beispiel: E-Commerce-Datenbank
Gute Shard Keys:
- User_ID: Hohe Kardinalität, häufig in Queries, nicht änderbar
- Order_ID: Eindeutig, häufig in Queries
Schlechte Shard Keys:
- Timestamp: Monoton steigend → Hotspot
- Status: Niedrige Kardinalität (nur "offen", "geschlossen") → ungleiche Verteilung
5. Sharding-Architekturen
Es gibt verschiedene Architekturen, wie Sharding implementiert werden kann.
| Architektur | Beschreibung | Vorteile | Nachteile |
|---|---|---|---|
| Shared-Nothing | Jeder Shard ist unabhängig, keine gemeinsame Hardware | Maximale Skalierbarkeit, keine Single Point of Failure | Cross-Shard Queries komplex |
| Shared-Disk | Alle Shards teilen sich einen gemeinsamen Storage | Einfache Verwaltung, gute Konsistenz | Storage ist Bottleneck, teurer |
| Application-Level | Anwendung entscheidet, welcher Shard angesprochen wird | Maximale Kontrolle, keine Middleware nötig | Komplex in der Anwendung, schwer zu warten |
| Proxy/Router | Ein Proxy leitet Queries an den richtigen Shard weiter | Transparent für Anwendung, zentral gesteuert | Proxy ist Single Point of Failure, Latenz |
Empfohlene Architektur: Proxy/Router
Die meisten modernen Sharding-Implementierungen nutzen einen Proxy oder Router:
- MongoDB: Mongos (Query Router) leitet Anfragen an die richtigen Shards
- MySQL: Vitess oder ProxySQL als Middleware
- PostgreSQL: Citus oder Pgpool-II
- Cassandra: Native Sharding-Unterstützung (kein Proxy nötig)
6. Vorteile & Nachteile von Sharding
Sharding bietet viele Vorteile, hat aber auch Herausforderungen, die berücksichtigt werden müssen.
Vorteile
- Horizontale Skalierung: Mehr Server = mehr Kapazität und Performance
- Write-Skalierung: Schreiblast wird auf mehrere Server verteilt
- Reduzierte Latenz: Kleinere Datenbanken = schnellere Queries
- Kosteneffizienz: Viele kleine Server sind günstiger als ein großer
- Geografische Verteilung: Daten näher an den Benutzern
- Parallelität: Mehrere Shards können parallel arbeiten
Nachteile & Herausforderungen
- Komplexität: Sharding erfordert sorgfältige Planung und Implementierung
- Cross-Shard Queries: Joins über mehrere Shards sind teuer und langsam
- Rebalancing: Daten zwischen Shards verschieben ist aufwändig
- Hotspots: Ungleiche Verteilung kann zu überlasteten Shards führen
- Transaktionen: Distributed Transactions sind komplex (2-Phase-Commit)
- Operationale Komplexität: Mehr Server = mehr Monitoring, Backup, Wartung
Wann lohnt sich Sharding?
Sharding eignet sich besonders für:
- Sehr große Datenmengen (> 1 TB)
- Hohe Schreiblast (viele Writes pro Sekunde)
- Globale Anwendungen mit Benutzern weltweit
- Skalierbare SaaS-Plattformen mit vielen Mandanten
Sharding ist weniger geeignet für:
- Kleine bis mittlere Datenbanken (< 100 GB)
- Viele Joins und komplexe Queries
- Starke Konsistenzanforderungen (ACID über alle Daten)
- Begrenzte IT-Ressourcen (kein Team für Sharding-Management)
7. Use Cases – Wo wird Sharding eingesetzt?
Sharding wird in verschiedenen Branchen und Anwendungsfällen eingesetzt.
E-Commerce
Millionen von Produkten, Bestellungen und Kunden. Sharding nach User_ID oder Product_ID ermöglicht Skalierung.
IoT & Sensor-Daten
Milliarden von Zeitstempel-Daten von Sensoren. Sharding nach Device_ID oder Zeitbereich.
Online Gaming
Spielstände, Leaderboards, Multiplayer-Daten. Sharding nach Game_ID oder User_ID.
Finanzdienstleistungen
Transaktionen, Konten, Trades. Sharding nach Account_ID oder Region (Compliance).
Analytics & Big Data
Log-Daten, Clickstreams, Metriken. Sharding nach Zeitbereich oder Tenant_ID.
8. Challenges & Lösungen
Sharding bringt spezifische Herausforderungen mit sich. Hier die wichtigsten und wie man sie löst.
Rebalancing
Wenn sich die Datenverteilung ändert (z.B. durch Wachstum), müssen Daten zwischen Shards verschoben werden. Dies ist teuer und kann zu Downtime führen.
Cross-Shard Queries
Joins oder Aggregationen über mehrere Shards sind teuer, da Daten von mehreren Servern geholt werden müssen.
Hotspots
Einzelne Shards werden übermäßig belastet (z.B. durch populäre User oder monotone Keys), während andere unterausgelastet sind.
Distributed Transactions
Transaktionen über mehrere Shards erfordern 2-Phase-Commit (2PC), was komplex und langsam ist.
Schema Changes
Schema-Änderungen (z.B. neue Spalte) müssen auf allen Shards gleichzeitig angewendet werden, was komplex ist.
Query Routing
Der Router muss wissen, auf welchem Shard die Daten liegen. Bei falschem Routing werden alle Shards abgefragt (Scatter-Gather).
9. FAQ – Häufige Fragen & Antworten
Häufige Fragen zu Sharding
Partitionierung ist der Oberbegriff für das Aufteilen von Daten. Es gibt zwei Arten:
- Vertikale Partitionierung: Verschiedene Spalten auf verschiedene Tabellen/Server verteilen
- Horizontale Partitionierung (Sharding): Verschiedene Zeilen auf verschiedene Server verteilen
Sharding ist also eine spezifische Form der horizontalen Partitionierung, bei der die Partitionen auf verschiedene Server verteilt werden.
Ein guter Shard Key sollte folgende Eigenschaften haben:
- Hohe Kardinalität: Viele unterschiedliche Werte (z.B. User-ID, nicht Status)
- Häufig in Queries: Der Shard Key sollte in den meisten Queries vorkommen
- Nicht änderbar: Der Wert sollte sich nicht ändern
- Gleichmäßige Verteilung: Vermeidet Hotspots
Beispiele: User_ID für Social Media, Order_ID für E-Commerce, Device_ID für IoT.
Consistent Hashing ist eine Hashing-Technik, die das Rebalancing minimiert, wenn Server hinzugefügt oder entfernt werden:
- Hash-Ring: Server und Keys werden auf einen Ring abgebildet
- Jeder Key wird dem nächsten Server im Uhrzeigersinn zugeordnet
- Wenn ein Server entfernt wird, müssen nur seine Keys zum nächsten Server verschoben werden
- Wenn ein Server hinzugefügt wird, übernimmt er nur einen Teil der Keys vom nächsten Server
Vorteil: Minimale Datenverschiebungen bei Skalierung. Wird von Cassandra, DynamoDB und anderen verwendet.
Ja, aber es ist aufwändig. Die Daten müssen von allen Shards wieder auf einen Server konsolidiert werden:
- Alle Shards müssen gelesen und zusammengeführt werden
- Cross-Shard References müssen aufgelöst werden
- Downtime oder komplexe Migration nötig
Empfehlung: Sharding sollte gut geplant sein und nicht leichtfertig eingeführt werden. Einmal implementiert, ist es schwer rückgängig zu machen.
Verschiedene Datenbanken bieten native Sharding-Unterstützung:
- MongoDB: Native Sharding mit Config Servers und Mongos Router
- Cassandra: Native Sharding mit Consistent Hashing (kein Router nötig)
- CockroachDB: Distributed SQL mit automatischem Sharding
- TiDB: MySQL-kompatibel mit horizontalem Sharding
- PostgreSQL: Native Partitionierung (ab PG 10), Citus für Sharding
- MySQL: Keine native Sharding, aber Vitess oder ProxySQL als Middleware
Joins über mehrere Shards sind eine der größten Herausforderungen. Lösungsansätze:
- Denormalisierung: Daten redundant auf mehreren Shards speichern
- Application-Level Joins: Anwendung holt Daten von mehreren Shards und joined sie
- Materialized Views: Vorberechnete Join-Ergebnisse speichern
- Same-Shard Design: Verwandte Daten auf demselben Shard speichern (z.B. User und seine Orders)
- Graph-Datenbanken: Für komplexe Beziehungen (Neo4j, Amazon Neptune)
Best Practice: Sharding so designen, dass die meisten Queries innerhalb eines Shards bleiben.
Sharding:
- Daten werden aufgeteilt (jeder Shard hat andere Daten)
- Horizontale Skalierung (mehr Kapazität)
- Write-Skalierung (Schreiblast verteilt)
- Keine Redundanz (Daten nur auf einem Shard)
Replication:
- Daten werden kopiert (jedes Replikat hat alle Daten)
- Read-Skalierung (Leseanfragen verteilt)
- Hochverfügbarkeit (Fallback bei Ausfall)
- Redundanz (Daten auf mehreren Servern)
In der Praxis: Oft werden beide Techniken kombiniert (Sharding + Replication pro Shard).
Nicht zu früh! Sharding sollte erst eingeführt werden, wenn:
- Die Datenbank zu groß für einen einzelnen Server ist (> 1 TB)
- Die Schreiblast zu hoch für einen einzelnen Server ist
- Vertikale Skalierung (größerer Server) zu teuer oder nicht mehr möglich ist
- Performance-Optimierungen (Indizes, Caching, Query-Optimierung) nicht mehr ausreichen
Frühe Anzeichen:
- Queries werden langsam trotz Indizes
- CPU/RAM auf dem Datenbank-Server ist dauerhaft hoch ausgelastet
- Writes werden zum Flaschenhals
Empfehlung: Erst alle anderen Optimierungen ausschöpfen, dann Sharding als letzte Option.
Zusammenfassung
Die wichtigsten Punkte
- Sharding: Horizontale Partitionierung – Daten auf mehrere Server verteilen
- Strategien: Range, Hash, Directory, Geo – je nach Use Case
- Shard Key: Hohe Kardinalität, häufig in Queries, nicht änderbar
- Architekturen: Shared-Nothing, Proxy/Router (empfohlen)
- Vorteile: Horizontale Skalierung, Write-Skalierung, reduzierte Latenz
- Nachteile: Komplexität, Cross-Shard Queries, Rebalancing
- Use Cases: E-Commerce, IoT, Social Media, Gaming, Finance, Analytics
- Challenges: Hotspots, Distributed Transactions, Schema Changes
- Best Practice: Sharding erst einführen, wenn andere Optimierungen nicht mehr ausreichen
Enterprise-Tipps
- Shard Key sorgfältig wählen: Hohe Kardinalität, häufig in Queries, nicht änderbar
- Consistent Hashing nutzen: Minimiert Rebalancing-Aufwand
- Monitoring einrichten: Shard-Größe, Hotspots, Query-Performance überwachen
- Sharding + Replication kombinieren: Jeder Shard hat mehrere Replikate
- Application-Level Caching: Redis oder Memcached für häufige Queries
- Same-Shard Design: Verwandte Daten auf demselben Shard speichern
Weiterführende Themen
Master-Slave, Multi-Master, Synchron vs. Asynchron – Datenbanken replizieren.
Zur ReplikationSQL vs. NoSQL, ACID, CAP-Theorem – die Basis für Datenbank-Verständnis.
Zu GrundlagenHadoop, Spark, Data Lakes – Verarbeitung riesiger Datenmengen.
Zu Big DataIndizes, Query-Optimierung, Caching – Performance steigern.
Zur Optimierung