Frage

Am Start Ich arbeite an überlegen wir nun, Skalierung Lösungen für unsere Datenbank.Werden die Dinge etwas verwirrend (für mich zumindest) mit MySQL, die die MySQL cluster, Replikation und MySQL-cluster-Replikation (ab ver.5.1.6), ist eine asynchrone version von MySQL cluster.Das MySQL-Handbuch erklärt die Unterschiede in seiner cluster FAQ, aber es ist schwer zu ermitteln, von der es zu verwenden wenn eins oder das andere.

Ich würde schätzen jede Beratung von Menschen, die sind vertraut mit den unterschieden zwischen den Lösungen und was sind die vor-und Nachteile und Wann Sie empfehlen zu jeder.

War es hilfreich?

Lösung

Ich habe eine Menge getan zu den verfügbaren Optionen zu lesen. Ich habe auch meine Hände auf High Performance MySQL 2. Ausgabe, die ich sehr empfehlen.

Das ist, was ich habe es geschafft, um Stück zusammen:  

Clustering

Clustering im allgemeinen Sinne ist die Verteilung Last auf viele Server, die als einen Server auf eine externe Anwendung angezeigt werden.

MySQL NDB Cluster

MySQL NDB Cluster ist ein verteiltes, im Speicher, Shared-Nothing-Speicher-Engine mit synchroner Replikation und automatische Daten partioning (entschuldigen Sie mir, ich borgen buchstäblich aus dem High Performance Buch, aber sie setzen es sehr schön dort). Es kann eine leistungsstarke Lösung für einige Anwendungen, aber Web-Anwendung arbeitet in der Regel nicht gut drauf.

Das Hauptproblem besteht darin, dass über sehr einfache Abfragen (das Touch nur eine Tabelle), wird der Cluster im Allgemeinen für Daten auf mehrere Knoten suchen hat, Netzwerk-Latenz ermöglicht zu kriechen und deutlich Abschlusszeit für Abfragen verlangsamen. Da die Anwendung des Clusters als ein Computer behandelt, es kann nicht sagen, welche Knoten aus, die Daten zu holen.

Darüber hinaus ist die in-Speicherbedarf ist für viele großen Datenbanken nicht praktikabel.

Continuent 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. Es stellt auch sicher, dass Anfragen immer die Daten aus der aktuellen Kopie erhalten, automatisch einen Knoten auswählen, die die neuen Daten hat.

Ich habe einige rel="noreferrer">, und insgesamt ist es klingt ziemlich vielversprechend aus.

Bund

Federation ist ähnlich wie Clustering, so dass ich ziehe es auch hier. MySQL bietet Föderation über die föderierte Speicher-Engine. Ähnlich wie bei der NDB-Cluster-Lösung, es funktioniert gut mit einfachen Abfragen nur - aber noch schlimmer den Cluster für komplizierte (da die Netzwerklatenz ist viel höher)

.

Replikation und Lastverteilung

MySQL hat die Kapazität gebaut Replikationen einer Datenbank auf verschiedenen Servern zu erstellen. Dies kann für viele Dinge verwendet werden. - die Last zwischen Servern, Hot Backups aufteilen, Testserver erstellen und Failover

Die Grundeinstellung der Replikation beinhaltet ein Master-Server Umgang mit meist schreibt und eine oder mehrere Slaves Umgang liest nur. Eine fortgeschrittenere Variante ist, dass der Master-Master Konfiguration, die ermöglicht Skala schreibt gut zur gleichen Zeit mit dem Schreiben mehrere Server haben.

Jede Konfiguration hat seine Vor- und Nachteile, aber ein Problem teilen sie alle ist die Replikation Verzögerung - da MySQL-Replikation asynchron ist, sind nicht alle Knoten, die die neuesten Daten zu jeder Zeit haben. Dies erfordert die Anwendung der Replikation zu beachten und Replikation-aware Abfragen integrieren wie erwartet zu funktionieren. Für einige Anwendungen ist dies kein Problem sein, aber wenn Sie immer die neuesten Daten brauchen die Dinge etwas komplizierter.

Replikation erfordert eine gewissen Lastausgleich die Last zwischen den Knoten splitten. Dies kann so einfach wie einige Änderungen am Anwendungscode oder mit spezieller Software und Hardware-Lösungen sein.

Sharding und partioning

Sharding wird häufig verwendet Ansatz Datenbanklösungen zu skalieren. Sie teilen die Daten in kleinere Scherben und verteile sie um verschiedene Server-Knoten. Dies erfordert die Anwendung auf die Datenspeicherung Kenntnis von der Änderung zu sein, effizient zu arbeiten, wie es wissen muss, wo die Informationen zu finden, die sie braucht.

Es gibt Abstraktion Frameworks mit Daten sharding beschäftigen zu helfen, wie Hibernate Shards , ein Erweiterung der Ruhe ORM(Was leider in Java ist. Ich bin mit PHP). HiveDB ist eine weitere solche Lösung, die auch Scherbe Rebalancing unterstützt.

Andere

Sphinx

Sphinx ist ein Volltext-Suchmaschine, die für weit mehr als Test Suche verwendet werden können. Für viele Abfragen ist es viel schneller als MySQL (vor allem für die Gruppierung und Sortierung) und Remote-Systeme parallel abfragen und aggregieren die Ergebnisse - die es sehr nützlich bei der Verwendung mit sharding machen.

Generell Sphinx sollte mit anderen Skalierungslösungen verwendet werden, um mehr von der verfügbaren Hardware und Infrastruktur zu erhalten. Der Nachteil ist, dass Sie wieder den Anwendungscode müssen sich dessen bewusst Sphinx sein, es weise zu nutzen.

Zusammenfassung

Die Skalierung Lösungen unterscheiden sich je nach den Bedürfnissen der Anwendung, die es braucht. Für uns und für die meisten Web-Anwendungen, wie ich glaube, dass die Replikation (wahrscheinlich Multi-Master) ist der Weg mit einem Load Balancer zu gehen, um die Last zu verteilen. Sharding von spezifischen Problembereichen (große Tabellen) ist auch ein Muss für die Möglichkeit, horizontal zu skalieren.

Ich werde auch einen Schuss Continuent Sequoia geben und sehen, ob es wirklich tun kann, was es verspricht, da es die geringste Menge an Änderungen an Anwendungscode beinhalten wird.

Andere Tipps

Disclaimer:. Ich habe MySQL Cluster nicht verwendet wird, also werde ich nur von dem, was ich gehört habe,

MySQL Cluster ist eine HA (High Availability) -Lösung. Es ist schnell, weil es alle in Erinnerung ist, aber es ist real Verkaufsargument der Verfügbarkeit ist. Es gibt keinen Single Point of Failure. Mit Replikation, auf der anderen Seite, wenn der Master ausfällt, müssen Sie tatsächlich auf die Replik wechseln, und es kann eine kleine Menge von Ausfallzeiten sein. (Obwohl die DRBD Lösung ist eine weitere Alternative, die eine hohe Verfügbarkeit aufweist)

Cluster erfordert, dass die gesamte Datenbank in den Speicher passen. Das bedeutet, dass jede Maschine im Cluster muss genügend Speicher haben, um die gesamte Datenbank zu speichern. Das ist also nicht eine realisierbare Lösung für sehr große Datenbanken (oder zumindest ist es eine sehr teuere Lösung).

Ich denke, dass es sei denn, HA super wichtig ist (sprich: wahrscheinlich nicht), ist es mehr Aufwand (und Geld) ist als es wert ist. Die Replikation ist häufiger der bessere Weg zu gehen.

Edit: Ich habe vergessen, dass Cluster zu erwähnen, erlaubt keinen Fremdschlüssel und Bereichsscans sind langsamer als auf anderen Motoren. Hier ist ein Link, spricht über Bekannte Einschränkungen von MySQL Cluster

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

Beide sind aus dem Jahr 2007, so dass die Clustering-Unterstützung nun stärker sein, aber in der Zeit, die sie gewählt haben Replikation.

Die kühle Sache über die Replikation zu tun ist, dass es einfach ist. set up nur 2 mysql-Boxen, die serverID Änderung auf dem zweite Feld, und dann an den ersten die zweite Box weist den Änderungsstamm Verwendung zu befehlen.

Hier ist die relevante Probe 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

So stellen Sie sicher, dass jeder Slave eine serverID von 1 (also den nächsten Slave-Server 3)

erhöht wird

einen Benutzernamen und ein Passwort einrichten, dass die Slave-Verbindung auf kann, Dann renne ändern Master = 'x.x.x.x' MASTER_HOST; Änderungsstamm zu MASTER_PASSWORD = "xxxxx";

und so weiter.

schließlich läuft "start-Slave;"

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

Dies vorausgesetzt, dass Sie mit zwei leeren Server starten. Dann können Sie Ihre db in den Master-Server-Dump, und wie es dort lädt, wird es auch auf dem Slave geladen werden.

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

Slave-Status zeigen \ G

Viel Spaß damit .. soooo einfach ...

Während Hochverfügbarkeits-Studie zu tun i über viele Lösungen kam und wahrscheinlich in unserem Fall, die intensivere System schreiben war, fand ich DRBD Cluster besser als der NDB Cluster, da es mehr Anzahl der Transaktionen pro Sekunde liefert.

MySQL-Replikation können Sie eine Backup-Maschine zur Verfügung stellen, die entweder als gelesen Slave eingesetzt werden oder im Falle einer Disaster-Recovery verwendet werden.

Mit verschiedenen Modi auf Transaktionsmanagement von DRBD zur Verfügung gestellt können Sie einige, was die Leistung von Geräteebene Replikation von Daten über das Netzwerk getroffen reduzieren. Für zuverlässiges System, das keine Transaktion im Falle des Scheiterns Verwendung C-Modus verlieren sollte, sonst für B gehen.

Ich habe versucht, einige der Learnings zur Liste i unter http: / /www.techiegyan.com/?p=132

Es funktioniert wirklich gut auf dedizierte Verbindung für die Replikation heißt Reserve separate Hochgeschwindigkeitsschnittstellen auf beiden Maschinen nur für DRBD-Replikation. Herzschlag kann die Cluster-Steuerung gut mit allen Dienstleistungen einer nach dem anderen das heißt IP-Adressen, Teilungen, drbd und mysql.

Ich bin noch die Master-Master-Konfiguration auf DRBD zu entdecken. Wird aktualisiert, und wenn ich Erfolg in das zu bekommen.

Danke.

in meinen Augen, die Verwirrung, die hier nur schickt mich zurück zu Mnesia.Mit der Zersplitterung, deklarative und pragmatischen Umgang mit Indizes, Position, Transparenz der datenbankreplikate e.t.c

In unserem setup ist, führen Wir sowohl MySQL-Cluster-und Mnesia.Unsere Daten irgendwie saisonal.So was passiert, ist, nach einiger Zeit, wir entlasten mnesia von Daten, die nicht mehr verwendet und werfen Sie es in MYSQL cluster.Dies hält unsere mnesia effizient.Wir haben auch realisierte Anwendungen in der main-stream-Sprachen (Python, Clojure e.t.c) die Verwendung von Daten direkt von MySQL.

Kurz gesagt, wir führen mnesia auf top von MySQL Cluster.MySQL Cluster can handle large data sets, eine Datenbank kann bis zu 50 GB plus.Wir haben mnesia einschalten des Erlang/OTP Anwendungen. Java und PHP Zugriff auf die Daten von mnesia über zugeschnitten REST (der erst vor kurzem Sparsamkeit)- APIs mit JSON-und XML-Formate für den Austausch.

Der data access layer abstrahiert den Zugriff auf Daten in Mnesia und alt versendet Daten in MySQL-Cluster, wenn Sie gebraucht wird.Mnesia ist hier im wesentlichen an die macht der Erlang/OTP-Anwendungen.Einmal wird es hogged mit Daten, wir werfen es in MYSQL Cluster.Die datenzugriffsebene kann den Zugriff auf Daten in mnesia und MySQL in eine abstrahierte API stellvertretend für alle Anwendungen.

Was ich hier sagen kann, ist, dass Mnesia die beste option für uns.Die Tische sind sehr fragmentiert und indizierte Abfragen durchführen sehr gut und die Datenbank repliziert wird über 2 Standorte, verbunden über einen tunnel.

Früher, wir hatten befürchtet, dass mnesia können nicht Griff, wie viele Datensätze wie möglich durch Tabelle Größenbeschränkung.Aber wir fanden, dass diese Aussage falsch.Mit guter Stimmung (Fragmentierung), unseren Datenbanken mnesia halten durchschnittlich etwa 250 Millionen Datensätze pro Jahr.

Wir profitierten von Erlang für die komplexe Daten-Struktur und die Tatsache, dass Mnesia schlucken kann es unverändert.Die Erlang /OTP-Anwendungen sind die meisten effiziente zu allen anderen apps in älteren Sprachen und mit unserem system planen wir die Migration, die es alle zu Erlang/OTP-Technologie.Von Erlang wir fügen sich nahtlos Zugriff auf Daten aus MySQL-Cluster und die Ausführung von Abfragen auf seinen Servern ganz wunderbar, In der Tat, wir ableiten, dass Ihre Erlang/OTP, dass das MySQL-server-Ressourcen wegen seiner (Erlang) massive Parallelität.

Mnesia hat für uns sehr gut.Mnesia hat sich völlig verändert die Art, wie wir schauen Datenbanken wegen seiner spannenden performance.Unser Solaris-server-CPU-Kerne beschäftigt bei einem Durchschnitt von etwa 48% Auslastung zu Spitzenzeiten.

Ich rate Ihnen, überprüfen Sie heraus mnesia und wer weiß, vielleicht beantworten Sie eine Reihe von Ihrer distribution oder Replikation benötigt.

Ich habe sie nicht genutzt, sondern von der docs würde ich sagen, dass die Replikation die bevorzugte Lösung ist, wenn die größte Last von der Datenbank zu lesen.

Die „im Speicher“ Einschränkung hindert uns daran, den Einsatz von MySQL Cluster für unser fast 50 GB Daten, so dass wir mit DRBD und Linux Heartbeat .

Es ist ein bisschen wie ein RAID-Array zwischen zwei (oder mehr) Box, die die Datenbanken / logs / configs synchron halten (aber nur ein Server kann „live“ zu einer Zeit sein). Failover automatisch erfolgt, verwendet die gleiche IP-Adresse und ist schnell als mysql restart, so dass eine gute Lösung für uns.

MySQL Cluster ist eine seltsame Tierchen und jedes Mal, das wir geprüft haben ist es entweder sehr schlecht ausgeführt oder unzuverlässig gewesen.

Es ist schrecklich kompliziert einzurichten (Sie müssen mindestens drei Knoten, möglicherweise mehr). Auch gibt es keine Bestimmung für mit Kunden nicht über, so haben Sie zu tun, dass sich selbst (oder etwas anderes zu nutzen als Proxy zu fungieren usw.).

Es ist extrem klug, weil es die automatische Hash-Partitionierung auf dem Primärschlüssel, die Sie schreibt maßstab erlaubt, und auch, weil es keinen Single Point of Failure hat.

Aber ich glaube wirklich, es ist besser geeignet, um den ganz besonderen Zweck Fällen ist es für entworfen wurde. Es kann nicht in den meisten Fällen ersetzen eine andere Datenbank-Engine (z InnoDB) in entweder die Leistung oder Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top