webentwicklung-frage-antwort-db.com.de

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

Beim Startup , an dem ich arbeite, erwägen wir jetzt Skalierungslösungen für unsere Datenbank. Mit MySQL, das die MySQL Cluster , Replication und MySQL Cluster Replication (ab Version 5.1.6) hat, was eine asynchrone Version ist, werden die Dinge (für mich zumindest) etwas verwirrend des MySQL-Clusters. Das MySQL-Handbuch erklärt einige Unterschiede in seinem Cluster FAQ , aber es ist schwer festzustellen, wann es den einen oder anderen verwendet.

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

79
Eran Galperin

Ich habe viel über die verfügbaren Optionen gelesen. Ich habe auch die High Performance MySQL 2nd Edition in die Hände bekommen, die ich sehr empfehlen kann.

Das ist es, was ich zusammengefügt habe:

Clustering

Clustering im allgemeinen Sinne ist die Verteilung der Last auf viele Server, die einer externen Anwendung als ein Server erscheinen.

MySQL-NDB-Cluster

MySQL NDB Cluster ist eine verteilte, im Speicher befindliche, gemeinsam genutzte Nothing-Storage-Engine mit synchroner Replikation und automatischer Datenpartitionierung (entschuldigen Sie, dass ich mich wörtlich aus dem High Performance-Buch leihe, aber sie stellen es sehr gut dar). Für manche Anwendungen kann dies eine leistungsstarke Lösung sein, aber Webanwendungen funktionieren im Allgemeinen nicht gut. 

Das Hauptproblem besteht darin, dass der Cluster nach sehr einfachen 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 nicht feststellen, von welchem ​​Knoten die Daten abgerufen werden.

Darüber hinaus kann die In-Memory-Anforderung für viele große Datenbanken nicht verarbeitet werden.

Kontinuierliche Sequoia

Dies ist eine weitere Clustering-Lösung für MySQL, die als Middleware auf dem MySQL-Server fungiert. Es bietet synchrone Replikation, Lastverteilung und Failover. Außerdem wird sichergestellt, dass Anforderungen immer die Daten von der neuesten Kopie erhalten, wobei automatisch ein Knoten ausgewählt wird, der die neuen Daten enthält. 

Ich habe ein paar gute Dinge darauf gelesen und es klingt insgesamt ziemlich vielversprechend.

Föderation

Federation ähnelt dem Clustering, also habe ich es auch hier gezogen. MySQL bietet einen Verbund über die Verbundspeicher-Engine an. Ähnlich wie bei der NDB-Cluster-Lösung funktioniert sie nur mit einfachen Abfragen - aber noch schlimmer ist der Cluster für komplizierte Cluster (da die Netzwerklatenz viel höher ist).

Replikation und Lastverteilung

MySQL verfügt über die integrierte Kapazität, 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.

Das grundlegende Setup der Replikation beinhaltet, dass ein Master-Server hauptsächlich Schreibvorgänge und ein oder mehrere Slaves nur Lesevorgänge abwickelt. Eine fortgeschrittenere Variante ist die der Konfiguration master-master , mit der Schreibvorgänge auch skaliert werden können, wenn 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 neuesten Daten. Dies setzt voraus, dass die Anwendung die Replikation kennt und replikationsabhängige Abfragen integriert, um wie erwartet zu funktionieren. Für einige Anwendungen ist dies möglicherweise kein Problem, aber wenn Sie immer die neuesten Daten benötigen, wird dies etwas komplizierter.

Die Replikation erfordert eine gewisse Lastverteilung, um die Last zwischen den Knoten aufzuteilen. Dies kann so einfach sein wie einige Änderungen am Anwendungscode oder die Verwendung dedizierter Software- und Hardwarelösungen.

Scherben und Unterteilung

Bei der Skalierung von Datenbanklösungen wird häufig Sharding verwendet. Sie teilen die Daten in kleinere Shards auf und verteilen sie auf verschiedene Serverknoten. Dies setzt voraus, dass die Anwendung sich der Änderung des Datenspeichers bewusst ist, um effizient arbeiten zu können, da sie wissen muss, wo sie die benötigten Informationen finden kann.

Es gibt Abstraktions-Frameworks, die beim Umgang mit Daten-Sharding helfen, wie Hibernate Shards , eine Erweiterung des Hibernate-ORM (die leider in Java ist. Ich verwende PHP). HiveDB ist eine weitere solche Lösung, die auch das Shard-Rebalancing unterstützt.

Andere

Sphinx

Sphinx ist eine Volltextsuchmaschine, die für weit mehr als nur Testsuchen verwendet werden kann. Für viele Abfragen ist es viel schneller als MySQL (insbesondere für das Gruppieren und Sortieren), und es kann entfernte Systeme parallel abfragen und die Ergebnisse zusammenfassen. Dies macht es sehr nützlich beim Sharding. 

Im Allgemeinen sollte Sphinx mit anderen Skalierungslösungen verwendet werden, um die verfügbare Hardware und Infrastruktur besser nutzen zu können. Der Nachteil ist, dass Sie wiederum den Anwendungscode benötigen, um sich der Sphinx bewusst zu sein, um sie sinnvoll einzusetzen.

Zusammenfassung

Skalierungslösungen unterscheiden sich je nach den Anforderungen der Anwendung, die sie benötigt. Für uns und für die meisten Webanwendungen glaube ich, dass Replikation (wahrscheinlich Multimaster) der Weg ist, wenn ein Lastausgleicher die Last verteilt. Das Scherben bestimmter Problembereiche (große Tische) ist auch ein Muss, um horizontal skalieren zu können.

Ich werde auch Continuent Sequoia eine Chance geben und sehen, ob es wirklich tun kann, was es verspricht, da es am wenigsten Änderungen am Anwendungscode erfordert.

100
Eran Galperin

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

MySQL Cluster ist eine HA-Lösung (Hochverfügbarkeit). Es ist schnell, weil sich alles im Speicher befindet, aber die Verfügbarkeit ist ein echtes Verkaufsargument. Es gibt keinen einzigen Fehlerpunkt. Bei der Replikation müssen Sie dagegen bei einem Ausfall des Masters 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)

Cluster erfordert, dass Ihre gesamte Datenbank in den Arbeitsspeicher passt. Das bedeutet, dass jeder Rechner im Cluster über genügend Speicher verfügen muss, um die gesamte Datenbank zu speichern. Daher ist dies keine Lösung für sehr große Datenbanken (oder zumindest eine sehr teure Lösung).

Ich denke, wenn HA nicht extrem wichtig ist (gelesen: wahrscheinlich nicht), ist es mehr Aufwand (und Geld) als es wert ist. Replikation ist häufig der bessere Weg.

Edit: Ich habe auch vergessen zu erwähnen, dass Cluster keine Fremdschlüssel zulässt und Reichweiten-Scans langsamer sind als bei anderen Engines. Hier ist ein Link über Bekannte Einschränkungen von MySQL Cluster

12
nathan

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

Beide stammen aus dem Jahr 2007, sodass die Unterstützung für das Clustering jetzt möglicherweise stärker ist, sich zu dem Zeitpunkt jedoch für die Replikation entschieden hat.

4
acrosman

Das Coole an der Replikation ist, dass es einfach ist. Richten Sie einfach 2 Mysql-Boxen ein, ändern Sie die Server-ID in der zweiten Box und richten Sie die zweite Box mit dem Befehl change master to auf die erste Box. 

Hier ist der entsprechende Beispielslave 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 Server-ID erhält, die um 1 erhöht wird (der nächste Slave ist also Server 3).

richten Sie einen Benutzernamen und ein Kennwort ein, unter denen der Slave eine Verbindung herstellen kann, Führen Sie dann .__ aus. Master in MASTER_Host = 'x.x.x.x' ändern; Master in MASTER_PASSWORD = "xxxxx" ändern;

und so weiter. 

zum Schluss "start slave" starten

Up kommt dein Sklave und fängt an zu replizieren. süß, huh!

Dies setzt voraus, dass Sie mit 2 leeren Servern beginnen. Dann können Sie Ihre Datenbank auf dem Master-Server sichern, 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 Spass damit .. soooo einfach ...

2
Zak

Während der Hochverfügbarkeitsstudie bin ich auf viele Lösungen gestoßen. In meinem Fall, in dem das System mit mehr Schreibintensität betrieben wurde, fand ich den DRBD-Cluster besser als der NDB-Cluster, da er mehr Transaktionen pro Sekunde bietet. 

Mysql Replication bietet Ihnen eine Backup-Maschine, die entweder als Read-Slave oder im Falle einer Notfallwiederherstellung verwendet werden kann. 

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

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

Es funktioniert sehr gut bei dedizierten Verbindungen für die Replizierung, d. H. Es ist erforderlich, separate Hochgeschwindigkeitsschnittstellen auf beiden Maschinen nur für die Drbd-Replikation zu reservieren. Heartbeat kann den Cluster mit allen Services einzeln steuern, d. H. 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
Adi

meiner Ansicht nach schickt mich die Verwirrung hier nur zurück nach Mnesia. Mit Fragmentierung, deklarativem und pragmatischem Umgang mit Indizes, Standorttransparenz von Datenbankreplikaten e.t.c

In unserem Setup betreiben wir sowohl MySQL Cluster als auch Mnesia. Unsere Daten sind irgendwie saisonbedingt. Was passiert, ist nach einiger Zeit, wir entlasten Mnesia von Daten, die nicht mehr verwendet werden, und wirft sie in den MYSQL-Cluster. Dies hält unsere Mnesia effizient. Wir haben auch Anwendungen in den wichtigsten Stream-Sprachen (Python, Clojure e.t.c) implementiert, die Daten direkt aus MySQL verwenden.

Kurz gesagt, wir führen Mnesia auf MySQL Cluster aus. Der MySQL Cluster kann große Datenmengen verarbeiten, eine Datenbank kann auf über 50 GB wachsen. Wir haben Mnesia, die das antreibt Erlang/OTP Anwendungen. Java und PHP Zugangsdaten von Mnesia über zugeschnitten REST (vor kurzem Sparsamkeit) APIs, die JSON und XML als Austauschformate verwenden.

Die Datenzugriffsebene hat bei Bedarf Zugriff auf Daten in Mnesia und alte ausgelieferte Daten in MySQL Cluster abstrahiert. Mnesia dient im Wesentlichen dazu, die Erlang/OTP-Anwendungen mit Strom zu versorgen. Sobald die Daten mit Daten gefüllt sind, werfen wir sie in den MYSQL Cluster. Die Datenzugriffsschicht kann für alle Anwendungen in einer abstrakten 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 über zwei Standorte hinweg repliziert, die über einen Tunnel verbunden sind.

Früher befürchteten wir, dass Mnesia aufgrund von Tabellengrößenbeschränkungen möglicherweise nicht so viele Datensätze wie möglich verarbeitet. Aber wir fanden diese Aussage falsch. Bei guter Abstimmung (Fragmentierung) halten unsere Mnesia-Datenbanken durchschnittlich etwa 250 Millionen Datensätze pro Jahr.

Wir haben von der komplexen Datenstruktur von Erlang profitiert und davon, dass Mnesia sie unverändert verschlucken kann. Die Erlang/OTP-Anwendungen sind in älteren Sprachen am effizientesten von allen anderen Anwendungen. Mit unserem System planen wir eine Migration auf die Erlang/OTP-Technologie. Von Erlang aus greifen wir scheinbar auf Daten aus MySQL Cluster zu und führen wunderbar Abfragen auf seinen Servern durch. Tatsächlich haben wir davon abgeleitet, dass Erlang/OTP die MySQL-Serverressourcen aufgrund seiner (Erlang) massiven Parallelität vollständig nutzen kann.

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

Ich empfehle Ihnen, Mnesia zu überprüfen, und wer weiß, vielleicht werden einige Ihrer Verteilungs- oder Replikationsanforderungen erfüllt.

1
Muzaaya Joshua

Die Einschränkung der "im Speicher" 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/logs/configs synchron hält (es kann jedoch immer nur ein Server "live" sein). Das Failover erfolgt automatisch, verwendet dieselbe IP-Adresse und ist nach dem Neustart von mysql schnell, daher ist dies eine gute Lösung für uns.

1
Brent

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

0
Javier

Der MySQL-Cluster ist ein merkwürdiges Biest und jedes Mal, wenn wir es bewertet haben, hat es entweder sehr schlecht funktioniert oder war unzuverlässig.

Es ist schrecklich kompliziert einzurichten (Sie benötigen mindestens drei Knoten, möglicherweise mehr). Es gibt auch keine Vorkehrung für ein Failover von Clients. Daher müssen Sie dies selbst tun (oder etwas anderes verwenden, um als Proxy zu fungieren usw.).

Es ist äußerst clever, da es eine automatische Hash-Partitionierung des Primärschlüssels vornimmt, mit der Sie Schreibvorgänge skalieren können, und dass es auch 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 eine andere Datenbank-Engine (z. B. InnoDB) weder in Bezug auf die Leistung noch auf die Funktionen ersetzt werden.

0
MarkR