2009-04-26 14 views
1

Ich muss eine MySQL-Umgebung einrichten, die das Hinzufügen vieler eindeutiger Datenbanken im Laufe der Zeit unterstützt (eigentlich tausende). Ich gehe davon aus, dass ich irgendwann mit dem Hinzufügen von MySQL-Servern beginnen muss und möchte, dass meine Umgebung im Vorfeld auf den Fall vorbereitet wird, um den Übergang zu einem 2., 3., 100. Server einfach zu machen.Einrichten mehrerer MySQL-Datenbanken mit Skalierbarkeitsoptionen

Und nur um es interessant zu machen, wäre es sehr praktisch, wenn die Lösung so modelliert wurde, dass die Anwendung, die die Datenbanken abfragt, alle Abfragen an eine einzige Adresse sendet und ein Ergebnis erhält. Es sollte sich nicht über die Anzahl und den Speicherort der Server im Klaren sein. Der Datenbankname ist eindeutig und kann verwendet werden, um herauszufinden, welcher Server die Datenbank enthält.

Ich habe einige Nachforschungen angestellt, und MySQL Proxy erscheint als der Hauptkandidat, aber ich konnte nichts Bestimmtes darüber herausfinden, wie es funktioniert, wie oben beschrieben.

Jeder?

Antwort

5

Große Frage. Ich kenne mehrere Firmen, die das gemacht haben (Facebook springt als das größte heraus). Keiner ist glücklich, aber Alternativen sind auch scheiße.

Weitere Dinge, die Sie beachten sollten - was passiert, wenn einige dieser Datenbanken oder Server ausfallen? Was passiert, wenn Sie eine datenbankübergreifende Abfrage durchführen müssen (und Sie werden dies auch tun, wenn Sie es gerade nicht glauben).

Hier ist die Lösung Friend: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

Es ist ein bisschen „back-asswards“, da sie grundsätzlich den Einsatz von MySQL als glorifizierte Schlüssel-Wert-Speicher werden. Ich bin nicht sicher, warum sie nicht einfach den Zwischenhändler ausschneiden und etwas wie BerkeleyDB zum Speichern ihrer Objekte verwenden. Verbindungsverwaltung, vielleicht? Scheint so, als wäre der MySQL-Overhead ein zu hoher Preis, um etwas zu bezahlen, das ziemlich leicht hinzugefügt werden könnte (berühmte letzte Worte).

Was Sie wirklich suchen (denke ich) ist eine verteilte Share-Nothing-Datenbank. Einige wurden auf Open-Source-Technologien wie MySQL und PostgreSQL aufgebaut, aber keine sind kostenlos verfügbar. Wenn Sie in Kauflaune sind, sehen Sie sich diese Firmen an: Greenplum, AsterData, Netezza, Vertica.

Es gibt auch eine große Anzahl verschiedener verteilter Schlüsselwertspeicherlösungen. Aus Mangel an einer besseren Referenz, hier ist ein Ausgangspunkt: http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/.

+0

lässt sich sagen, dass ich keine Datenbank-Abfragen durchführen muss. Jede Datenbank ist eine eigene Insel, genau das ist: a. Die Anwendung muss in der Lage sein, alle Datenbanken von einem einzigen Punkt abzufragen, und b. Ich muss neue Datenbanken nach Belieben hinzufügen können. Ändert das das Bild? – Omer

+0

oh, und danke für die sehr schnelle und detaillierte Antwort. – Omer

+2

Die einfache Lösung besteht darin, einen Wrapper für Ihr aktuelles Datenbankverbindungsmodul zu schreiben und einen Pool von Konnektoren zu verwalten. Wenn Sie nach einem db-Handle fragen, geben Sie ihm die Möglichkeit, die richtige db zu finden. Dies funktioniert für eine bestimmte Anzahl von dbs und eine statische Zuordnung; Es gibt offensichtliche Probleme mit dynamischen Zuordnungen. Und ich fragte nicht wirklich, ob Sie Cross-DB-Abfragen benötigen; Ich habe Ihnen gesagt, dass wenn Ihr Projekt wächst, Sie Cross-DB-Abfragen benötigen. Vielleicht nicht viele, aber du wirst sie brauchen. – SquareCog

2

Ihr Problem klingt ähnlich wie bei uns - Sie agieren als White-Label und jeder Kunde benötigt eine eigene Datenbank. Wenn wir davon ausgehen, dass dieses Konzept mit Ihrem Konzept übereinstimmt, wurde eine "Master" -Datenbank verwendet, die den Hostnamen und den Datenbanknamen für den Client speicherte (der in der Anwendungsebene zwischengespeichert werden konnte). Der Server, auf den der Client zugreift, kann dann dynamisch seine Datenquelle in die erforderliche Datenbank verschieben. Dies ermöglichte uns die Skalierung auf tausende von Client-Datenbanken, die auf Server verteilt sind.