Sharding-Erweiterungen für PostgreSQL- und MariaDB-Cluster

Um Datenbanken zu clustern, verwenden Erweiterungen für PostgreSQL und MariaDB Sharding. Das lohnt sich nicht immer, wohl aber in Einzelfällen.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht
Sharding-Erweiterungen für PostgreSQL- und MariaDB-Cluster
Lesezeit: 26 Min.
Von
  • Daniel Bößwetter
  • Robert Wunderer
Inhaltsverzeichnis

Stößt man an die vertikalen Skalierungsgrenzen einer relationalen Datenbank, kommt schnell die Forderung nach einem Cluster. Die meisten Systeme benötigen dafür Zusatzsoftware. Cluster garantieren aber keineswegs einen linearen Speed-up; bisherige Probleme können zwar verschwinden, neue jedoch auftreten. Wir haben Clustering-Lösungen für PostgreSQL und MariaDB untersucht und geben Hinweise, wofür sich deren Einsatz lohnt. Zahlen hierfür liefern Benchmarks des Transaction Processing Performance Council (TPC).

Relationale Datenbanken lassen sich auf verschiedene Arten auf mehrere Rechenknoten verteilen. Bei ausreichendem Storage legt man die gesamten Daten auf mehreren Knoten ab und die verteilt die Leseanfragen darauf. Schreibanfragen landen üblicherweise auf einem Master. Alle anderen Rechner im Cluster sind Replikations-Slaves. Dies funktioniert so lange, bis entweder die Schreiblast auf dem Master oder die (sequenzielle) Replikation zum Flaschenhals wird. Außerdem muss die Applikation wissen, dass auf einem Knoten geschrieben wird und die Daten beim nächsten Lesen vom Slave möglicherweise noch nicht aktuell sind. PostgreSQL erlaubt tatsächlich auch synchrone Replikation, allerdings nur mit einem einzigen Slave.

Verteilt man die Daten, spricht man von Sharding. Dafür sollte es inhaltlich sinnvolle Sollbruchstellen geben, zum Beispiel einen Shard pro Land, Abteilung oder Kundengruppe. Wenn dies nicht möglich ist, kann man die Daten per Hash-Verfahren auf die Knoten verteilen. Hier beginnen die Herausforderungen: Quasi alle relationalen Datenbanken unterstützen Joins, die dazu führen können, dass Datensätze von unterschiedlichen Knoten miteinander verknüpft werden müssen. Dies ist über ein Netzwerk viel teurer als lokal. Außerdem werden aus lokalen Transaktionen nun verteilte Transaktionen, die eine Reihe neuer Probleme mit sich bringen.