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

Autor: Thomas Groß <thomas_at_tgross.net>
Datum: 24.09.2005
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 binäres logfile und der Slave liest aus
diesem Logfile und führt die Aktionen nachträglich aus. Das hat den
Vorteil, dass du den Slave sogar stoppen kannst und er führt 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 Primärschlüssel belegt
gleichzeitig schaut HOSTB ob dieser Primärschlüssel schon belegt ist,
sieht die Änderung von HOSTA noch nicht, weil sie noch nicht repliziert
ist und versucht den selben Primärschlüssel zu benutzen. Wenn das
Statement von HOSTA repliziert wird kann es nicht mehr ausgeführt 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 hinausläuft
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 wüsste keine nicht triviale Applikation die ich guten
Gewissens auf einer 2-Wege Replikation laufen lassen würde.

Ich würde einen Rechner für schreibende Zugriffe nehmen auf den anderen
Rechner replizieren und auf beide lesend zugreifen.

Die andere Möglichkeit 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 Lösung wird wohl auch
nicht deiner minimaler Traffic Anforderung genügen.

	thomas



-- 
Thomas Groß <thomas@tgross.net>
Received on Sat Sep 24 12:04:03 2005

Dieses Archiv wurde generiert von hypermail 2.1.8.
Zurück zur UUGRN-Homepage.