Deep EVM #26: Sharding vs. Partitionierung — Architektur fuer massive Tabellen
Engineering Team
Partitionierung vs. Sharding: Was ist der Unterschied?
Beide teilen Daten in kleinere Stuecke, arbeiten aber auf unterschiedlichen Ebenen:
- Partitionierung: Teilt eine Tabelle auf demselben Datenbankserver
- Sharding: Verteilt Daten auf mehrere Server
Partitionierung skaliert vertikal (mehr CPU/RAM), Sharding skaliert horizontal (mehr Server).
Wann Partitionierung reicht
- Tabelle < 1 Milliarde Zeilen
- Einzelner Server hat genug CPU/RAM
- Abfragen betreffen typischerweise einen Bereich (z.B. letzte 24 Stunden)
- VACUUM wird durch kleinere Partitionen schneller
Wann Sharding notwendig wird
- Tabelle > 1 Milliarde Zeilen
- Schreiblast uebersteigt die Kapazitaet eines einzelnen Servers
- Geographische Verteilung erforderlich
- Leselast erfordert Parallelisierung ueber Server
Consistent Hashing
Beim Sharding muessen Sie entscheiden, welche Daten auf welchem Shard landen. Consistent Hashing minimiert die Datenbewegung beim Hinzufuegen neuer Shards:
use std::collections::BTreeMap;
use sha2::{Sha256, Digest};
struct ConsistentHashRing {
ring: BTreeMap<u64, ShardId>,
virtual_nodes: usize,
}
impl ConsistentHashRing {
fn get_shard(&self, key: &[u8]) -> ShardId {
let hash = self.hash(key);
// Finde den naechsten Knoten im Ring
self.ring.range(hash..)
.next()
.or_else(|| self.ring.iter().next())
.map(|(_, shard)| *shard)
.unwrap()
}
}
Cross-Shard-Abfragen
Das groesste Problem beim Sharding: Abfragen, die Daten von mehreren Shards benoetigen.
Strategien:
- Scatter-Gather: Abfrage an alle Shards senden, Ergebnisse zusammenfuehren
- Shard-Key-Design: So waehlen, dass haeufige Abfragen nur einen Shard treffen
- Denormalisierung: Haeufig abgefragte Daten auf allen Shards replizieren
Resharding
Wenn Sie neue Shards hinzufuegen muessen:
- Neue Shards bereitstellen
- Hash-Ring aktualisieren
- Daten von alten zu neuen Shards migrieren (im Hintergrund)
- Dual-Write waehrend der Migration
- Alte Daten nach Abschluss bereinigen
Fazit
Partitionierung und Sharding sind komplementaere Strategien. Beginnen Sie mit Partitionierung — sie ist einfacher und oft ausreichend. Wechseln Sie zu Sharding, wenn ein einzelner Server nicht mehr ausreicht. Der Schluessel: Waehlen Sie Ihren Shard-Key sorgfaeltig, denn er bestimmt die Leistung aller zukuenftigen Abfragen.