zerberus666: 2-seitige Datenbanksynchronisation (MySQL)

Hallo Zusammen,

ich habe folgende Aufgabenstellung bezüglich 2 MySQL-Datenbanken und wollte nachfragen, ob bzw. was es denn für Möglichkeiten dazu gibt.

Szenario ist folgendes...

Ich habe 2x dieselbe Version einer MySQL-Datenbank - davon liegt eine auf einem Webserver und die andere auf einem lokalen Windows-Rechner.

Nun möchte ich diese 2 Datenbanken möglichst in beide Richtungen synchronisieren und das möglichst zeitnah und möglichst automatisch.

An beiden Datenbanken werden Datensätze geändert, neu angelegt, etc.

Ist sowas möglich und wenn ja, was gibt es für Möglichkeiten?

Hilft mir da z.B. ein Tool wie http://www.mysync.de weiter?

Gruss
zerberus

  1. echo $begrüßung;

    Ich habe 2x dieselbe Version einer MySQL-Datenbank - davon liegt eine auf einem Webserver und die andere auf einem lokalen Windows-Rechner.
    Nun möchte ich diese 2 Datenbanken möglichst in beide Richtungen synchronisieren und das möglichst zeitnah und möglichst automatisch.

    Mit dem Synchronisieren beschäftigt sich das Kapitel Replication im Handbuch. Allerdings gehen die Szenarien immmer davon aus, dass nur ein Schreibmaster existiert und die anderen nur Lese-Sklaven sind. Das Problem ist die Atomarität der Daten. Wenn A den Datensatz mit der ID x ändert, und B das auch machen will, wer hat nun Recht? Wenn A einen Datensatz anlegt, der die ID y bekommt, und B ebenfalls tätig wird, bevor die Synchronisierung stattfand, gibt es nun zweimal die ID y.

    Es ist nicht grundsätzlich unmöglich, eine Zweiwege-Replikation aufzusetzen. Eine Replication-FAQ-Frage benennt die Voraussetzungen: http://dev.mysql.com/doc/refman/5.0/en/replication-faq.html#qandaitem-15-3-4-5

    Hilft mir da z.B. ein Tool wie http://www.mysync.de weiter?

    Es hat den gleichen Nachteil wie die Replikationslösung, zuzüglich der größeren Zeitabstände, und des Nichtwissens, welche Daten konkret geändert wurden. Um letzeres festzustellen wird ein LastChanged-Feld benötigt, das stets gepflegt werden muss. Der einzige Vorteil ist, dass es keine direkte Netzwerk-Verbindung zwischen den Servern benötigt.

    echo "$verabschiedung $name";

    1. Hallo,

      Master-Master Replikation ist überhaupt nicht trivial, wie dedlfix bereits bemerkt hat. Es ist immer mit Datenkonflikten und einer spezifischen Implementierung zur Konfliktlösung verbunden.

      Um die Atomizität von Records zu gewährleisten setzen manche DBMS auf so genannte UUIDs bzw. GUIDs. Das sind quasi immer eineindeutige Werte. Solch _eine_ UUID würde dann auf beiden/allen Mastern jedem Datensatz hinzugefügt werden. So bleibt der Datensatz innerhalb der gesamten Replikationswelt eindeutig.

      Durch die UUID/GUID als globale Identifikation für den Datensatz hat die IDENTITY bzw. AUTO_INCREMENT Spalte der Tabelle eine noch geringere Bedeutung und einen sehr begrenzten Gültigkeitsbereich.

      Ein weiteres Konzept, welches u.a. bei der Konfliktlösung verwendet wird oder um festzustellen ob synchronisiert werden muss, ist die Generationsverwaltung von Records/Datensätzen. Dabei kann man u.a. verwenden:

      • ein Datumsfeld
            ... welches dann auf allen Mastern an den Datensatz angehängt wird und bei der Replikation auf allen Mastern gespeichert wird
      • oder eine simples numerisches (integer) Feld
            ... welches an den Datensatz angehangen wird und dann bei Änderungen am Datensatz inkrementiert wird und auf allen Mastern gespeichert wird

      Fassen wir mal zusammen:

      • Globale Identifikation
      • Konflikthandling
      • Generationsverwaltung

      ... sollte deine Master-Master Replikation beinhalten bzw. berücksichtigen.

      Ciao, Frank