Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Konsistentes Hashing als Möglichkeit zum Skalieren von Schreibvorgängen

Es gibt zwei Gründe, mehrere Knoten in einem Cluster zu verwenden:

  • Sharding, um die auf jedem Knoten gespeicherte Datenmenge zu begrenzen
  • Duplizieren, um die Leselast zu reduzieren und das Entfernen eines Knotens ohne Datenverlust zu ermöglichen.

Die beiden unterscheiden sich grundlegend, aber Sie können beide implementieren - verwenden Sie konsistentes Hashing, um auf eine Reihe von Knoten mit einem standardmäßigen Master/Slave-Setup zu verweisen, anstatt auf einen einzelnen Knoten.

Wenn der Cluster Ihr primärer Datenspeicher und kein Cache ist, benötigen Sie eine andere Umverteilungsstrategie, die das Kopieren der Daten umfasst.

Meine Implementierung basiert darauf, dass der Client einen von 64.000 Buckets für einen Hash auswählt und eine Tabelle hat, die diesen Bucket einem Knoten zuordnet. Anfangs werden alle Knoten #1 zugeordnet.

Wenn der Knoten Nr. 1 zu groß wird, wird sein Slave zum Master-Knoten Nr. 2, und die Tabelle wird aktualisiert, um die Hälfte der Schlüssel des Knotens Nr. 1 dem Knoten Nr. 2 zuzuordnen. An diesem Punkt funktionieren alle Lese- und Schreibvorgänge mit der neuen Zuordnung, und Sie müssen nur die Schlüssel bereinigen, die sich jetzt auf dem falschen Knoten befinden. Je nach Leistungsanforderungen können Sie alle Schlüssel auf einmal prüfen oder wie das Ablaufsystem eine zufällige Auswahl von Schlüsseln prüfen.