[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Mysql Datenbanken auf verschiedenen Maschinen in "realtime" abgleichen


On Sat, 2005-09-24 at 10:54 +0200, Christian Eichert wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Halo,
> 
> FRAGE: Wenn man zwei mysqlserver hat auf zwei entfernten maschinen, wie
> gleicht man am besten die Datenbanken mit minimalem Trafic ab.
> Die Datenbanken sind teilweise hunderte MB gross.
> Was ich will ist eine art "diff" zu machen. so dass praktisch nach jedem
> INSERT oder DELETE quasi sofort auch die andere datenbank auf dem
> anderen entfernten Server die aktuelle version bekommt.
> Und es muss in beide Richtungen gehen.
Du kannst den einen Rechner als Master und den anderen als Slave
einrichten. Nachzulesen im Mysql Manual und Replikation.  Dann schreibt
der Master alle Aktionen in ein binaeres logfile und der Slave liest aus
diesem Logfile und fuehrt die Aktionen nachtraeglich aus. Das hat den
Vorteil, dass du den Slave sogar stoppen kannst und er fuehrt nach dem
Restart die anstehenden Aktionen aus.

Doku hier:
http://dev.mysql.com/doc/mysql/en/replication.html

Allerdings geht das nicht in beide Richtungen. Man kann das zwar so
einrichten, aber das funktioniert nicht, weil es einige Races geben
kann. So was funktioniert vielleicht am Anfang eine gewisse Zeit, geht
aber irgendwann schief. Irgendwann wird sowohl auf HOSTA ein Statement
abgesetzt, das in eine Tabelle schreibt und einen Primaerschluessel belegt
gleichzeitig schaut HOSTB ob dieser Primaerschluessel schon belegt ist,
sieht die Aenderung von HOSTA noch nicht, weil sie noch nicht repliziert
ist und versucht den selben Primaerschluessel zu benutzen. Wenn das
Statement von HOSTA repliziert wird kann es nicht mehr ausgefuehrt werden
weil der insert mit einem Duplicate Key error schiefgeht und die
Replikation bleibt stehen. Dann kannst du von Hand versuchen die
Datenbanken wieder synchron zu kriegen. Was meistens darauf hinauslaeuft
den Zustand auf einem der beiden Rechner genau auf den des anderen
abzugleichen. Ergo Datenverlust.

Da helfen auf Tablelocks usw nicht weiter, weil sie nicht repliziert
werden. Ich wuesste keine nicht triviale Applikation die ich guten
Gewissens auf einer 2-Wege Replikation laufen lassen wuerde.

Ich wuerde einen Rechner fuer schreibende Zugriffe nehmen auf den anderen
Rechner replizieren und auf beide lesend zugreifen.

Die andere Moeglichkeit die du hast ist die neue NDB Storage Engine von
Mysql zu benutzen die Mysql-Clusterung erlaubt. Die hat das oben genannt
Problem nicht.
http://dev.mysql.com/doc/mysql/en/ndbcluster.html
Das habe ich aber noch nie ausprobiert. Diese Loesung wird wohl auch
nicht deiner minimaler Traffic Anforderung genuegen.

	thomas



-- 
Thomas Gross <thomas@xxxxxxxxxx>