Zum Hauptinhalt springen
DevOpsMar 28, 2026

Deep EVM #26: Sharding vs. Partitionierung — Architektur fuer massive Tabellen

OS
Open Soft Team

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:

  1. Scatter-Gather: Abfrage an alle Shards senden, Ergebnisse zusammenfuehren
  2. Shard-Key-Design: So waehlen, dass haeufige Abfragen nur einen Shard treffen
  3. Denormalisierung: Haeufig abgefragte Daten auf allen Shards replizieren

Resharding

Wenn Sie neue Shards hinzufuegen muessen:

  1. Neue Shards bereitstellen
  2. Hash-Ring aktualisieren
  3. Daten von alten zu neuen Shards migrieren (im Hintergrund)
  4. Dual-Write waehrend der Migration
  5. 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.