matzewe01 wrote:Mit zei Mysql Datenbanken könnte man selbiges erreichen Ich meine, dass der Proxy eine Verteilung nach oben genannten Kriterium z.B. unterstützt.
Im mathematischen Sinn ist eine Partition eine vollständige Zerlegung einer Obermenge in eine Menge von überlappungsfreien Untermengen. Eine Obermenge O wird also in eine Menge (Partition) P von Teilnehmen P1 - Pn zerlegt, sodaß Px geschnitten mit Py = leer (für x ungleich y) und daß die Vereinigungsmenge P = Vereinigung von P1 bis Pn genau gleich O ist.
In MySQL 5.1 gibt es partitionierte Tabellen als Nachfolger von MyISAM Merge Tabellen (die so voller Bugs sind, daß man sie besser nicht einsetzt, und wenn doch, dann unbedingt komplett read-only, und schon gar nicht die unterliegenden MyISAMs in irgendeiner Weise direkt anfaßt). Partitionierte Tabellen lösen das MyISAM-Merge Problem generischer, bugfreier und sind auch schneller. Das liegt unter anderem daran, daß die SQL-Engine über den Storage Engines bei MySQL Partitionen die Verteilregel kennt und der Optimizer davon Gebrauch machen kann.
MySQL Partitionen liegen jedoch immer auf demselben Server.
Wenn man eine Tabelle partitioniert und die Partitionen auf mehrere Server verteilt, dann bekommt man Shards (Scherben, Splitter). Sharding bewirkt, daß Writes nicht mehr auf einen Server gehen, sondern je nach Schreibort auf den Server gehen, auf dem die betreffenden Daten liegen. Dadurch kann man auch Writes sinnvoll skalieren. Shards haben jedoch das Problem, daß horizontale Queries über mehr als einen Shard sehr teuer werden. Dafür gibt es verschiedene Workarounds, die alle auf eine starke denormalisierung heraus laufen. Siehe auch
http://highscalability.com/flickr-architecture als ein Lehrbuchbeispiel, und die Serie
http://www.oreillynet.com/databases/blo ... ories.html für mehr davon.
Sharding kann man effizient nicht automatisch realisieren, sondern es bedeutet immer Änderungen an der Anwendung. Daher werden auch in der Regel klassische Closed Source Anwendungen nicht gesharded, sondern vertikal skaliert. Dies ist die Domain von Dingen wie den großen Sun Enterprise Hobeln, und von klassischen vertikal skalierenden Datenbankservern von IBM und Oracle.
Für Webanwendungen ist, wenn sie sehr viel Erfolg haben, schon von vorneherein absehbar, daß sie irgendwann größer werden als die größte erhältliche Maschine. (
http://kris.koehntopp.de/artikel/linuxtag/img9.html aus
http://kris.koehntopp.de/artikel/linuxtag/). Webanwendungen sind aber in der Regel auch so gestaltet, daß dem Betreiber der Quelltext zur Verfügung steht - daher findet man in solchen Installationen aber auch kaum vertikale Skalierung, sondern stattdessen horizontales Wachsum.
web.de hatte 2005 zum Beispiel etwa 35 Datenbankserver, von denen 25 je eine Million User beherbergten (Sharding-Beispiel) und die anderen 10 jeweils eine geringere Anzahl von sehr aktiven Usern hielten. Pro Datenbankserver waren zwischen 4 und 8 Web-Frontendserver aktiv. Man kann das heute noch sehen: freemailxxyy.web.de ist die xx-Clusternummer (01-25 oder so für Freemail-Kunden, und höhere Zahlen für Clubkunden) und yy ist die Webserver-Nummer in diesem Cluster. Sie wird beim Login durch Redirect zufällig, aber sticky zugewiesen.
Neckermann.de betreibt eine kleine dreistellige Anzahl von MySQL-Instanzen - auf Blades. Und booking.com betreibt ebenfalls um die 100 Datenbank-Instanzen, auf HP DL 585, DL 385 und vergleichbaren Maschinen, mit 2, 4 oder 8 Cores und zwischen 8 und 32 GB RAM. Andere große MySQL-Installationen (Xing, Puma, Swoodoo, ...) sehen ganz ähnlich aus.
Wenn man den Source der Anwendung nicht oder nicht sofort ändern kann, weil man Versäumnisse der Vergangenheit aufarbeiten muß, dann kann man sich als Interimslösung mit dem MySQL Proxy in der Loadbalancer-Variante behelfen. Damit kommt man dann immerhin sofort weiter, wenn die Lösung auch nicht so fein kontrollierbar und so flexibel ist wie eine Lösung, die komplett unter Kenntnis der Anwendungslogik abgewickelt wird (Dazu kommen Beschränkungen in der internen Logik, die lighttpd und MySQL Proxy gemeinsam sind und die in Extremfällen zum Load-Limit werden können).
Bedeutet jedoch auch im Umkehrschluss, dass 2 physikalisch getrennte Maschinen sinnvoll sind und die Datenfiles auf unterschiedlichem Storage liegen sollten.
Nein.
http://www.sun.com/blueprints/1000/layout.pdf ist besser.
Login Daten z.B. würde ich auf einer DB halten, um eindeutig und zuverlässig IDs zu vergeben und redundante abfragen auf mehren Host zu vermeiden zumal Logins vermutlich die kleinste Last erzeugen.
In einer klassischen Architektur, etwa web.de, hat man eine zentrale Datenbank, die ein Tripel (user, password, clusternummer) enthält. Beim Login kann man so zentral (aus dem RAM!) die Authenisierung zunehmen und dann auf den zuständigen Cluster verweisen. Außerdem kann man so User von einem Cluster zum anderen Migrieren. Was man nicht machen sollte: Writes in diese Tabelle (etwa: Das Lastlogin-Date aktualisieren). Solche Daten sollten pro Cluster und nicht zentral geschrieben werden. Sonst hat man jeden Montag morgen um 9 Uhr ca. 4000-5000 Writes pro Sekunde auf der zentralen Tabelle und in einer Krise drei- bis fünfmal so viele.
http://blog.koehntopp.de/archives/1775- ... MySQL.html, Folgerung 4 diskutiert das in ein wenig mehr Detail. Der Rest des Artikels ist unter Umständen auch von Interesse.