Ich habe viel über die verfügbaren Optionen gelesen. Ich habe auch High Performance MySQL 2nd Edition in die Hände bekommen, was ich sehr empfehlen kann.
Folgendes habe ich zusammengefügt:
Clustering
Clustering im allgemeinen Sinne verteilt die Last auf viele Server, die einer externen Anwendung als ein Server angezeigt werden.
MySQL NDB Cluster
MySQL NDB Cluster ist eine verteilte speicherinterne, gemeinsam genutzte Speicher-Engine mit synchroner Replikation und automatischer Datenpartitionierung (entschuldigen Sie, ich leihe buchstäblich aus dem High Performance-Buch, aber sie haben es dort sehr gut ausgedrückt). Es kann für einige Anwendungen eine Hochleistungslösung sein, aber Webanwendungen funktionieren im Allgemeinen nicht gut.
Das Hauptproblem besteht darin, dass der Cluster über sehr einfache Abfragen (die nur eine Tabelle berühren) im Allgemeinen nach Daten auf mehreren Knoten suchen muss, wodurch sich die Netzwerklatenz einschleichen und die Abschlusszeit für Abfragen erheblich verlangsamen kann. Da die Anwendung den Cluster als einen Computer behandelt, kann sie ihm nicht mitteilen, von welchem Knoten die Daten abgerufen werden sollen.
Darüber hinaus ist die In-Memory-Anforderung für viele große Datenbanken nicht funktionsfähig.
Kontinuierliche Sequoia
Dies ist eine weitere Clustering-Lösung für MySQL, die als Middleware über dem MySQL-Server fungiert. Es bietet synchrone Replikation, Lastausgleich und Failover. Außerdem wird sichergestellt, dass Anforderungen immer die Daten aus der neuesten Kopie abrufen und automatisch einen Knoten mit den neuen Daten auswählen.
Ich habe einige gute Dinge darüber gelesen und insgesamt klingt es ziemlich vielversprechend.
Föderation
Federation ähnelt Clustering, daher habe ich es auch hier gezogen. MySQL bietet einen Verbund über die Verbundspeicher-Engine an. Ähnlich wie bei der NDB-Clusterlösung funktioniert sie nur bei einfachen Abfragen - aber noch schlimmer bei komplizierten Abfragen (da die Netzwerklatenz viel höher ist).
Replikation und Lastausgleich
MySQL verfügt über die integrierte Kapazität, um Replikationen einer Datenbank auf verschiedenen Servern zu erstellen. Dies kann für viele Zwecke verwendet werden - Aufteilen der Last auf Server, Hot-Backups, Erstellen von Testservern und Failover.
Die Grundeinstellung der Replikation umfasst einen Master-Server, der hauptsächlich Schreibvorgänge verarbeitet, und einen oder mehrere Slaves, die nur Lesevorgänge verarbeiten. Eine erweiterte Variante ist die Master-Master- Konfiguration, mit der auch Schreibvorgänge skaliert werden können, indem mehrere Server gleichzeitig schreiben.
Jede Konfiguration hat ihre Vor- und Nachteile, aber ein Problem, das sie alle gemeinsam haben, ist die Replikationsverzögerung. Da die MySQL-Replikation asynchron ist, verfügen nicht alle Knoten zu jeder Zeit über die aktuellsten Daten. Dies erfordert, dass die Anwendung die Replikation kennt und replikationsfähige Abfragen enthält, damit sie wie erwartet funktioniert. Für einige Anwendungen ist dies möglicherweise kein Problem, aber wenn Sie immer die aktuellsten Daten benötigen, werden die Dinge etwas kompliziert.
Die Replikation erfordert einen gewissen Lastausgleich, um die Last auf die Knoten aufzuteilen. Dies kann so einfach sein wie einige Änderungen am Anwendungscode oder die Verwendung dedizierter Software- und Hardwarelösungen.
Scherben und Partitionieren
Sharding wird häufig zur Skalierung von Datenbanklösungen verwendet. Sie teilen die Daten in kleinere Shards auf und verteilen sie auf verschiedene Serverknoten. Dies erfordert, dass die Anwendung über die Änderung des Datenspeichers informiert ist, um effizient arbeiten zu können, da sie wissen muss, wo sie die benötigten Informationen finden kann.
Es stehen Abstraktionsframeworks zur Verfügung, die beim Umgang mit Data Sharding helfen, z. B. Hibernate Shards , eine Erweiterung des Hibernate ORM (das sich leider in Java befindet. Ich verwende PHP). HiveDB ist eine weitere solche Lösung, die auch das Shard-Rebalancing unterstützt.
Andere
Sphinx
Sphinx ist eine Volltextsuchmaschine, die weit mehr als nur für Testsuchen verwendet werden kann. Bei vielen Abfragen ist es viel schneller als MySQL (insbesondere zum Gruppieren und Sortieren) und kann Remote-Systeme parallel abfragen und die Ergebnisse aggregieren - was es bei der Verwendung mit Sharding sehr nützlich macht.
Im Allgemeinen sollte Sphinx mit anderen Skalierungslösungen verwendet werden, um mehr von der verfügbaren Hardware und Infrastruktur zu erhalten. Der Nachteil ist, dass Sie erneut den Anwendungscode benötigen, um Sphinx zu kennen und ihn mit Bedacht einsetzen zu können.
Zusammenfassung
Die Skalierungslösungen unterscheiden sich je nach den Anforderungen der Anwendung, die sie benötigt. Für uns und die meisten Webanwendungen glaube ich, dass die Replikation (wahrscheinlich Multi-Master) der richtige Weg ist, um die Last mit einem Load Balancer zu verteilen. Das Splittern bestimmter Problembereiche (große Tabellen) ist auch ein Muss, um horizontal skalieren zu können.
Ich werde auch Continuent Sequoia ausprobieren und sehen, ob es wirklich das kann, was es verspricht, da es die geringsten Änderungen am Anwendungscode beinhaltet.