Skalierungslösungen für MySQL (Replikation, Clustering)


82

Beim Start, bei dem ich arbeite, erwägen wir jetzt Skalierungslösungen für unsere Datenbank. Bei MySQL mit MySQL- Cluster , Replikation und MySQL-Cluster-Replikation (ab Version 5.1.6), einer asynchronen Version des MySQL-Clusters, wird es ( zumindest für mich) etwas verwirrend . Das MySQL-Handbuch erklärt einige der Unterschiede in den Cluster-FAQ , aber es ist schwierig, daraus festzustellen, wann das eine oder das andere verwendet werden soll.

Ich würde mich über Ratschläge von Personen freuen, die mit den Unterschieden zwischen diesen Lösungen und den Vor- und Nachteilen vertraut sind und wann Sie die einzelnen empfehlen.


4
Was ist die Antwort auf dieselbe Frage im Jahr 2015?
Matical

Hallo, was ist mit der Programmierung? Ich meine, wenn ich sie für meine PHP-basierte Anwendung mache, gibt es eine Liste spezifischer Dinge, die ich beim Schreiben des Codes beachten muss? Oder spielt es keine Rolle?
Salil Momin

Schauen Sie sich 2017 MariaDB, Galera und MariaDB MaxScale an.
MattBianco

Antworten:


102

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.


4
Mit Master-Master können Sie keine Schreibvorgänge skalieren. Beide Master müssen alle Schreibvorgänge ausführen, um synchron zu bleiben. Darüber hinaus führt das gleichzeitige Schreiben auf zwei Server wahrscheinlich (mehr oder weniger garantiert) zu Replikationskonflikten, die von MySQL nicht automatisch gelöst werden.
MarkR

1
Haben Sie diese Antwort im Jahr 08 bemerkt, jetzt, da es über 1 1/2 Jahre später ist, was ist Ihr Ergebnis für Continuent Sequoia?
Kerry Jones

1
Möchten Sie das Ergebnis / die Erfahrung mit Continuent Sequoia teilen?
Conandor

Ich habe Continuent Sequoia am Ende nicht verwendet, ich habe es geschafft, MySQL weiter zu skalieren, um unseren Anforderungen zu entsprechen
Eran Galperin

Continuent Sequoia wurde eingestellt und durch Continuent Tungsten ersetzt, eine Sammlung kostenloser Produkte. continuent.com/community/tungsten-overview
lo_fye

12

Haftungsausschluss: Ich habe MySQL Cluster nicht verwendet, daher gehe ich nur von dem aus, was ich gehört habe.

MySQL Cluster ist eine HA-Lösung (High Availability). Es ist schnell, weil alles im Speicher ist, aber das wahre Verkaufsargument ist die Verfügbarkeit. Es gibt keinen einzigen Fehlerpunkt. Wenn bei der Replikation der Master ausfällt, müssen Sie tatsächlich zum Replikat wechseln, und es kann zu einer geringen Ausfallzeit kommen. (obwohl die DRBD-Lösung eine weitere Alternative mit hoher Verfügbarkeit ist)

Für den Cluster muss Ihre gesamte Datenbank in den Speicher passen. Das bedeutet, dass jeder Computer im Cluster über genügend Speicher verfügt, um die gesamte Datenbank zu speichern. Dies ist also keine praktikable Lösung für sehr große Datenbanken (oder zumindest eine sehr teure Lösung).

Ich denke, wenn HA nicht sehr wichtig ist (lesen Sie: wahrscheinlich nicht), ist es mehr Aufwand (und Geld) als es wert ist. Replikation ist häufiger der bessere Weg.

Bearbeiten: Ich habe auch vergessen zu erwähnen, dass Cluster keine Fremdschlüssel zulässt und Bereichsscans langsamer sind als bei anderen Engines. Hier ist ein Link, der über bekannte Einschränkungen von MySQL Cluster spricht


Nun, der Punkt, den ich ansprechen wollte, ist, dass Sie sich für die Replikation entscheiden, wenn Sie sich Sorgen um die Leistung machen. Wählen Sie Cluster nur, wenn HA ein Hauptanliegen ist. Ich weiß nicht, wie sie sich vergleichen, und die Hardwareanforderungen sind so unterschiedlich, dass wahrscheinlich sowieso Äpfel und Orangen verglichen werden.
Nathan

Dies ist 4-5 Jahre später, aber ich möchte nur hinzufügen, dass MySQL Cluster nicht mehr erfordert, dass die gesamte Datenbank im Speicher / RAM gespeichert wird: "Ab MySQL 5.1 müssen sich die Daten nicht mehr vollständig im Speicher befinden . " dba.stackexchange.com/questions/9357/…
Ted

4

Es gibt einige gute Diskussionen darüber, wie die Leute, die drupal.org pflegen, ihre Datenbankserver strukturiert haben:

Beide stammen aus dem Jahr 2007, daher ist die Clusterunterstützung jetzt möglicherweise stärker, aber zu dem Zeitpunkt, als sie sich für die Replikation entschieden haben.


2

Das Coole an der Replikation ist, dass es einfach ist. Richten Sie einfach 2 MySQL-Felder ein, ändern Sie die Server-ID auf dem zweiten Feld und zeigen Sie dann mit dem Befehl change master to auf das erste Feld.

Hier ist der relevante Beispiel-Slave my.cnf config

#
#       Log names
#

log-bin=binlog
relay-log=relaylog
log-error=errors.log

#
#       Log tuning
#

sync_binlog = 1
binlog_cache_size = 1M

#
#       Replication rules (what are we interested in listening for...)
#
#       In our replicants, we are interested in ANYTHING that isn't a permission table thing
#

replicate-ignore-db =      mysql
replicate-wild-ignore-table=mysql.%

#
#       Replication server ID
#

server-id      =        2

Stellen Sie also sicher, dass jeder Slave eine um 1 erhöhte Server-ID erhält (der nächste Slave ist also Server 3).

Richten Sie einen Benutzernamen und ein Kennwort ein, über die der Slave eine Verbindung herstellen kann. Führen Sie dann change master zu MASTER_HOST = 'xxxx' aus. Master in MASTER_PASSWORD = "xxxxx" ändern;

und so weiter.

Führen Sie schließlich "Sklave starten" aus.

Ihr Sklave kommt und beginnt zu replizieren. süß huh!

Dies setzt voraus, dass Sie mit 2 leeren Servern beginnen. Dann können Sie Ihre Datenbank auf dem Master-Server ablegen, und wenn sie dort geladen wird, wird sie auch auf den Slave geladen.

Sie können den Slave-Status überprüfen, indem Sie Folgendes ausführen:

Slave-Status anzeigen \ G.

Viel Spaß damit .. soooo einfach ...


1

Während der Hochverfügbarkeitsstudie bin ich auf viele Lösungen gestoßen, und in unserem Fall, der ein schreibintensiveres System war, fand ich den DRBD-Cluster besser als den NDB-Cluster, da er mehr Transaktionen pro Sekunde bietet.

Mysql Replication bietet Ihnen einen Sicherungscomputer, der entweder als Lese-Slave oder im Falle einer Notfallwiederherstellung verwendet werden kann.

Mit verschiedenen von DRBD bereitgestellten Modi für das Transaktionsmanagement können Sie die Leistung verringern, die durch die Replikation von Daten über das Netzwerk auf Geräteebene beeinträchtigt wird. Verwenden Sie für ein zuverlässiges System, das im Fehlerfall keine Transaktion verlieren sollte, den C-Modus. Andernfalls wählen Sie B.

Ich habe versucht, einige der Erkenntnisse, die ich beim Einrichten des DRBD-Clusters gemacht habe, unter http://www.techiegyan.com/?p=132 aufzulisten

Es funktioniert sehr gut bei dedizierten Verbindungen für die Replikation, dh reservieren Sie separate Hochgeschwindigkeitsschnittstellen auf beiden Computern nur für die drbd-Replikation. Heartbeat kann den Cluster mit allen Diensten einzeln steuern, dh IP-Adressen, Partitionen, drbd und mysql.

Ich muss noch die Master-Master-Konfiguration auf DRBD entdecken. Wird aktualisiert, sobald ich Erfolg habe.

Vielen Dank.


1

Meiner Ansicht nach schickt mich die Verwirrung hier einfach zurück zu Mnesia. Mit Fragmentierung, deklarativer und pragmatischer Art des Umgangs mit Indizes, Standorttransparenz von Datenbankreplikaten usw.

In unserem Setup führen wir sowohl MySQL Cluster als auch Mnesia aus. Unsere Daten sind irgendwie saisonabhängig. Was also passiert, ist, dass wir nach einiger Zeit die Mnesie von Daten, die nicht mehr verwendet werden, abbauen und in den MYSQL-Cluster werfen. Dies hält unsere Mnesie effizient. Außerdem haben wir Anwendungen in den wichtigsten Stream-Sprachen (Python, Clojure usw.) implementiert, die Daten direkt von MySQL verwenden.

Kurz gesagt, wir führen Mnesia über MySQL Cluster aus. Der MySQL-Cluster kann große Datenmengen verarbeiten, eine Datenbank kann auf über 50 GB anwachsen. Wir haben Mnesia, die die Erlang / OTP- Anwendungen mit Strom versorgt . Java- und PHP- Zugriffsdaten von mnesia über maßgeschneiderte REST- APIs (kürzlich Thrift ) unter Verwendung von JSON und XML als Austauschformate.

Die Datenzugriffsschicht hat den Zugriff auf Daten in Mnesia und alte ausgelieferte Daten in MySQL Cluster bei Bedarf abstrahiert. Mnesia ist im Wesentlichen hier, um die Erlang / OTP-Anwendungen mit Strom zu versorgen. Sobald es mit Daten überfüllt ist, werfen wir sie in den MYSQL-Cluster. Die Datenzugriffsschicht kann im Namen aller Anwendungen in einer abstrahierten API sowohl auf Daten in Mnesia als auch auf MySQL zugreifen.

Was ich hier sagen kann ist, dass Mnesia die beste Option für uns war. Die Tabellen sind stark fragmentiert und indiziert, Abfragen funktionieren sehr gut und die Datenbank wird an zwei Standorten repliziert, die über einen Tunnel verbunden sind.

Zuvor hatten wir befürchtet, dass Mnesia aufgrund der Beschränkung der Tabellengröße möglicherweise nicht so viele Datensätze wie möglich verarbeitet. Aber wir fanden diese Aussage falsch. Bei guter Abstimmung (Fragmentierung) enthalten unsere Mnesia-Datenbanken durchschnittlich 250 Millionen Datensätze pro Jahr.

Wir haben von Erlangs komplexer Datenstruktur und der Tatsache profitiert, dass Mnesia sie unverändert verschlingen kann. Die Erlang / OTP-Anwendungen sind von allen anderen Apps in Legacy-Sprachen am effizientesten. Mit unserem System planen wir, alles auf die Erlang / OTP-Technologie zu migrieren. Von Erlang aus greifen wir scheinbar wunderbar auf Daten aus MySQL Cluster zu und führen Abfragen auf seinen Servern sehr wunderbar aus. Tatsächlich haben wir festgestellt, dass Erlang / OTP aufgrund seiner (Erlang) massiven Parallelität die MySQL-Serverressourcen vollständig nutzen kann.

Mnesia hat sehr gut für uns gearbeitet. Mnesia hat die Art und Weise, wie wir Datenbanken betrachten, aufgrund seiner aufregenden Leistung grundlegend verändert. Unsere Solaris-Server-CPU-Kerne sind zu Spitzenzeiten zu durchschnittlich 48% ausgelastet.

Ich rate Ihnen, sich mit Mnesia zu befassen, und wer weiß, es kann eine Reihe Ihrer Verteilungs- oder Replikationsanforderungen erfüllen.


0

Ich habe sie nicht verwendet, aber aus den Dokumenten würde ich sagen, dass die Replikation die bevorzugte Lösung ist, wenn die größte Last das Lesen aus der Datenbank ist.


1
Wie genau sind Sie zu diesem Schluss gekommen ... Es wäre schön, wenn Sie angeben würden. Auch die Dokumente scheinen darauf hinzudeuten, dass Clustering zuverlässiger ist
Eran Galperin

0

Die "In Memory" -Beschränkung verhindert, dass wir MySQL-Cluster für unsere fast 50 GB Daten verwenden. Daher verwenden wir DRBD plus Linux Heartbeat .

Es ist wie ein RAID-Array zwischen zwei (oder mehr) Boxen, das die Datenbanken / Protokolle / Konfigurationen synchron hält (es kann jedoch immer nur ein Server "live" sein). Das Failover erfolgt automatisch, verwendet dieselbe IP-Adresse und ist schnell wie ein MySQL-Neustart. Das war also eine gute Lösung für uns.


1
Hilft es auch bei der Leistung oder dient es nur der Redundanz?
Eran Galperin

DRBD ist alles in Ordnung und gut, bis etwas im gesamten Dateisystem kaputt geht und Ihre Tabellen beschädigt - dann haben Sie zwei Knoten der Zerbrochenheit anstelle von nur einem. Ich vertraue es nicht.
Jon Topper

+1 @ Eric Galperin Failover / Redundanz ist der Hauptgrund für meinen Besuch auf dieser Fragenseite, damit Ideen für unsere unternehmensinterne Vereinbarung für einen MySQL-Server pro Standort gelten.
Therobyouknow

0

MySQL-Cluster ist ein seltsames Biest und jedes Mal, wenn wir es evaluiert haben, wird es entweder sehr schlecht ausgeführt oder war unzuverlässig.

Die Einrichtung ist schrecklich kompliziert (Sie benötigen mindestens drei Knoten, möglicherweise mehr). Es ist auch nicht vorgesehen, dass Clients ein Failover durchführen, sodass Sie dies selbst tun müssen (oder etwas anderes als Proxy usw. verwenden müssen).

Es ist äußerst clever, da es eine automatische Hash-Partitionierung auf dem Primärschlüssel ausführt, mit der Sie Schreibvorgänge skalieren können, und weil es keinen einzigen Fehlerpunkt gibt.

Aber ich denke wirklich, dass es besser für die speziellen Fälle geeignet ist, für die es entwickelt wurde. In den meisten Fällen kann es weder in der Leistung noch in den Funktionen ein anderes Datenbankmodul (z. B. InnoDB) ersetzen.


Mehrere Nines haben eine Lösung, die das Einrichten erleichtert: support.severalnines.com/entries/… ... aber ich bin damit einverstanden, dass ich MySQL Cluster in meinem Unternehmen evaluiert habe, und es ist großartig, um Schreibvorgänge zu verbreiten, aber viel langsamer at liest und hat keine Fremdschlüsselunterstützung usw.
Suman

Fremdschlüsselunterstützung ist seit Version 7.3 verfügbar . Hier ist ein guter Vergleich von InnoDB gegen NDB
lennartvdd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.