Sharding ist fast das Gegenteil von Replikation, obwohl sie orthogonale Konzepte sind und gut zusammenarbeiten.
Sharding, auch bekannt als Partitionierung, teilt die Daten nach Schlüsseln auf; Während die Replikation, auch bekannt als Spiegelung, darin besteht, alle Daten zu kopieren.
Sharding ist nützlich, um die Leistung zu steigern und die Zugriffs- und Arbeitsspeicherlast auf einer Ressource zu reduzieren. Die Replikation ist nützlich, um eine hohe Verfügbarkeit von Lesevorgängen zu erhalten. Wenn Sie von mehreren Replikaten lesen, verringern Sie auch die Trefferquote auf allen Ressourcen, aber der Speicherbedarf für alle Ressourcen bleibt gleich. Es sollte beachtet werden, dass Sie zwar auf einen Slave schreiben können, die Replikation jedoch nur Master->Slave ist. Sie können Schreibvorgänge also nicht auf diese Weise skalieren.
Angenommen, Sie haben die folgenden Tupel:[1:Apple], [2:Banana], [3:Cherry], [4:Durian] und wir haben zwei Maschinen A und B. Mit Sharding könnten wir die Schlüssel 2,4 speichern Maschine A; und Schlüssel 1,3 auf Maschine B. Mit der Replikation speichern wir die Schlüssel 1,2,3,4 auf Maschine A und 1,2,3,4 auf Maschine B.
Sharding wird normalerweise implementiert, indem ein konsistenter Hash auf den Schlüssel angewendet wird. Das obige Beispiel wurde mit der folgenden Hash-Funktion h(x){return x%2==0?A:B}.
implementiertUm die Konzepte zu kombinieren, könnten wir jeden Shard replizieren. In den obigen Fällen könnten alle Daten (2,4) von Maschine A auf Maschine C repliziert werden und alle Daten (1,3) von Maschine B könnten auf Maschine D repliziert werden.
Jeder Key-Value-Store (wobei Redis nur ein Beispiel ist) unterstützt Sharding, obwohl bestimmte Cross-Key-Funktionen nicht mehr funktionieren. Redis unterstützt die Replikation standardmäßig.