MySQL Lastverteilung

MySQL, PostgreSQL, SQLite
evilh
Posts: 126
Joined: 2004-03-25 17:45

MySQL Lastverteilung

Post by evilh » 2005-12-16 23:06

Hallo zusammen,

da für ein Projekt in Kürze eine MySQL Lastverteilung anstehen wird, lese ich mich gerade in dieses Thema ein. Leider habe ich recht wenig dazu gefunden. Zum Thema Ausfallsicherheit bezüglich MySQL gibt es recht viel Material. Mir geht es jedoch darum, eine möglichst performante MySQL Datenbank über verteilte Server zu erreichen, da ca. 350 Queries pro Sekunde gestellt werden (müssen).

Ich bin dankbar für jede Einlesehilfe

Gruss
Markus

phillux
Posts: 80
Joined: 2004-03-16 13:47
Location: Münster

Re: MySQL Lastverteilung

Post by phillux » 2005-12-20 17:39

High Performance MySQL von Jeremy D. Zawodny, Derek J. Balling
ISBN: 3897213885

Beste Grüße, Phil

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL Lastverteilung

Post by isotopp » 2006-01-26 19:29

evilh wrote:Mir geht es jedoch darum, eine möglichst performante MySQL Datenbank über verteilte Server zu erreichen, da ca. 350 Queries pro Sekunde gestellt werden (müssen).
Das Buch von Zawodny ist recht okay, aber 350qps sollten eine Datenbank eigentlich nicht umbringen, wenn die Queries gut optimiert sind. Bei Kunden habe ich Dell 2850 mit 2 CPUs und 6 Platten bis zu 3000 updates/sec und etwa zweimal so viele selects/sec ausführen sehen.

theton
Posts: 31
Joined: 2006-01-24 11:56
Location: Berlin

Re: MySQL Lastverteilung

Post by theton » 2006-01-26 20:45

Die Loesung koennte durchaus auch ein kleines MySQL-Cluster hinter einem Load-Balancer sein. Das Clustering wuerde dafuer sorgen, dass die Datenbanken gespiegelt auf allen Knoten existieren und der Loadbalancer verteilt die Last gleichmaessig auf die Speicherknoten. Sollte die Leistung mal nicht mehr reichen, kann man das Cluster "einfach" um neue Knoten erweitern. API-Knoten koennte man hier natuerlich weglassen.

evilh
Posts: 126
Joined: 2004-03-25 17:45

Re: MySQL Lastverteilung

Post by evilh » 2006-02-15 10:50

sorry für meine verspätete Antwort.

das Buch werde ich mir mal ansehen.

@theton:
wie würde eine solche clusterlösung genau aussehen ? Der Loadbalancer schickt die anfragen an den server der den schnellsten ping hat nehme ich an.
Nur wie wird die Datenbank auf alle server identisch repliziert ?
Wenn Server 1 eine Ã?nderung erfährt, muss er diese Ã?nderung ja an alle anderen Server weitergeben damit diese die Ã?nderung auch durchführen. Wo ist hierbei dann der Geschwindigkeitsvorteil, wenn ohnehin wieder jeder Server jede Anfrage machen muss ?
Den einzigen Vorteil sehe ich hierbei in select anfragen.

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL Lastverteilung

Post by isotopp » 2006-02-15 18:27

theton wrote:Die Loesung koennte durchaus auch ein kleines MySQL-Cluster hinter einem Load-Balancer sein.
Für ein Forum? Eher nicht.Cluster hat ein paar sehr überraschende Eigenschaften. Wenn man die nicht kennt und abschätzen kann, sollte man das lieber lassen.

theton
Posts: 31
Joined: 2006-01-24 11:56
Location: Berlin

Re: MySQL Lastverteilung

Post by theton » 2006-02-15 18:47

@isotopp: Ich weiss zwar nicht, was du unter ueberraschenden Eigenschaften verstehst, aber bei uns nutzen einige Kunden MySQL-Cluster fuer Foren, Wikis u.ae. Mit einer sauberen Konfiguration stellt das ueberhaupt kein Problem dar.

@evilh: Der Vorteil eines Clusters liegt darin, dass der Knoten die Anfragen bekommt, der gerade die meisten Ressourcen zur Verfuegung hat (dafuer sorgt ja der Load-Balancer). Gespiegelt werden die Daten erst auf die anderen Knoten, wenn dort wieder Rechenzeit verfuegbar ist. Ein sauber eingerichtetes MySQL-Cluster sorgt ganz allein dafuer, dass die Daten sauber auf alle Speicherknoten repliziert werden. Der Geschwindigkeitsvorteil kommt allerdings erst durch den Load-Balancer und das direkte Schreiben auf die Speicherknoten (normalerweise wuerde man das ueber einen API-Knoten machen), wodurch quasi mehrere DB-Server zur Verfuegung stehen. Es muss nur sicher gestellt werden, dass die Daten ueber einen API-Knoten gelesen werden, denn nur der stellt seine Anfragen so, dass auf allen Speicherknoten nach den entsprechenden Datensaetzen gesucht wird, falls mal ein Datensatz noch nicht gespiegelt wurde.
Fazit: Schreiben ueber einen Loadbalancer direkt auf die Speicherknoten, Lesen ueber einen oder mehrere API-Knoten (auch diese koennen ja durch den Loadbalancer zugewiesen werden) kann einiges an Vorteilen bringen, sofern alles korrekt eingestellt ist. Schliesslich steht ja in einem Cluster ein "Netzwerk" zur Verfuegung, in dem alle Speicher-Knoten die gleichen Daten enthalten. Wenn das alles sauber balanced wird und alles ordentlich konfiguriert ist, steht also einiges an zusaetzlicher Rechenleistung zur Verfuegung.

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: MySQL Lastverteilung

Post by isotopp » 2006-02-16 09:30

theton wrote:@isotopp: Ich weiss zwar nicht, was du unter ueberraschenden Eigenschaften verstehst, aber bei uns nutzen einige Kunden MySQL-Cluster fuer Foren, Wikis u.ae. Mit einer sauberen Konfiguration stellt das ueberhaupt kein Problem dar.
Einige Unterschiede zwischen NDBCLUSTER vs. Vanilla:

- varchar() sind char(), und brauchen immer die deklarierte Länge unabhängig von den tatsächlichen Daten
- BLOB und TEXT sind limitiert
- Die Anzahl der Data Nodes sollte 2^x sein, sonst ist die Speicherverteilung im Cluster kaputt.
- Cluster ist ein shared nothing Cluster, und Joins im Cluster machen jede Menge in-cluster Communication notwendig.
- Der Optimizer bekommt von Cluster keine Table Statistics, und so degeneriert der Cost Based Optimizer von MySQL in Cluster zu einem (schlechten) Rule Based Optimizer. Man sollte sich das EXPLAIN zu einer Query immer in Vanilla MySQL ansehen, und das Cluster-EXPLAIN dagegen halten, dann die passenden Indices forcen.

Aber das kratzt eigentlich nur an der Oberfläche...