Frage

Hier ist das Szenario. 2 Web-Server in zwei getrennten Standorten mit zwei MySQL-Datenbanken mit identischen Tabellen. Die Daten in den Tabellen werden auch in Echtzeit identisch sein erwartet.

Hier ist das Problem. Wenn ein Benutzer in jeder Lage gleichzeitig einen neuen Datensatz in identische Tabellen eintritt, wie unten in den ersten beiden Tabellen dargestellt, wobei der dritte Datensatz in jeder Tabelle wurde gleichzeitig durch die verschiedenen Personen eingegeben. Die Daten in den Tabellen nicht mehr identisch. Welches ist die beste Art und Weise zu halten, dass die Daten in Echtzeit identisch bleiben, wie unten in der dritten Tabelle dargestellt, unabhängig davon, wo der Updates stattfinden? Auf diese Weise in den Abbildungen unten statt mit drei Zeilen in jeder Tabelle zu enden, werden die neuen Datensätze bidirektional repliziert, und sie sind in beiden Tabellen eingefügt 2 identische Tabellen mit 4 Spalten dieses Mal wieder zu schaffen?

Server A in Location A
==============

Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | John  |
|-----------|

Server B in Location B
==============
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | Peter |
|-----------|


Expected Scenario
===========
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
| 3 | Peter |
| 4 | John  |
|-----------|
War es hilfreich?

Lösung

Es gibt nicht viel Leistung von der Replikation der Datenbank auf zwei Herren gewonnen werden. Allerdings gibt es eine nette wenig Failover, wenn Sie Ihre Anwendung korrekt codieren.

Master-Master-Setup ist im Wesentlichen die gleiche wie die Slave-Master-Setup hat aber beide Slaves und eine wichtige Änderung Ihrer Konfigurationsdateien auf jedem Feld gestartet.

Master MySQL 1:

auto_increment_increment = 2
auto_increment_offset = 1 

Master MySQL 2:

auto_increment_increment = 2
auto_increment_offset = 2

Diese beiden Parameter sicherzustellen, dass, wenn zwei Servern über einen Primärschlüssel kämpfen aus irgendeinem Grund, sie nicht duplizieren und die Replikation töten. Statt um 1 zu inkrementieren, jeder Auto-Inkrement-Bereich durch Standard-Inkrement von 2. Auf einem Feld wird wird es die Reihenfolge 1 3 5 7 9 11 13 usw. Auf der zweite Box versetzt von 1 und läuft beginnen, es bei 2-Offset beginnt und mitlaufen 2 4 6 8 10 12 usw. Von Stromprüfung, das auto-Inkrement erscheint die nächste freie Nummer zu nehmen, nicht eine, die vor verlassen hat.
Z.B. Wenn Server 1 fügt die ersten drei Datensätze (1 3 und 5), wenn Server 2 Einsätze der 4., wird er den Schlüssel von 6 gegeben werden (nicht 2, die nicht verwendet wird).

Sobald Sie das eingerichtet haben, beginnen sie beide auf, als Sklaven.
Dann werden beide überprüfen arbeiten ok, eine Verbindung zu beiden Maschinen und den Befehl SHOW SLAVE STATUS ausführen und Sie sollten beachten, dass beide Slave_IO_Running und Slave_SQL_Running sollten beide auf jedem Feld „JA“ sagen.

Dann, natürlich, ein paar Datensätze in einer Tabelle zu erstellen und sicherzustellen, nur ein Kästchen einfügt ungeraden Primärschlüssel und der andere ist nur noch taugt erhöht wird.

Sie dann die alle Tests, um sicherzustellen, dass Sie alle Standardanwendungen auf jedem Feld damit die Replikation auf den anderen durchführen kann.

Es ist relativ einfach, wenn es geht.
Aber wie bereits erwähnt, MySQL es nicht entmutigen und darauf hinweisen, dass Sie sicher, dass Sie diese Funktionalität bewusst sind, wenn die Anwendung Code zu schreiben.

Edit: Ich nehme an, es ist theoretisch möglich, mehr Meister zu addieren, wenn Sie sicherstellen, dass die Offsets korrekt sind und so weiter. Sie könnten realistischer obwohl, fügen Sie einige zusätzliche Sklaven.

Andere Tipps

MySQL unterstützt nicht die synchrone Replikation, jedoch selbst wenn es so wäre, würden Sie wahrscheinlich wollen es nicht benutzen (kann die Performance-Einbußen für den anderen Server des Wartens auf jede Transaktion synchronisieren begehen nicht nehmen).

Sie werden geeignetere architektonische Lösungen, um es zu betrachten haben - es Produkte von Drittanbietern sind, die eine Zusammenführung und Konflikte lösen in einer vorgegebenen Art und Weise tun -. Das ist der einzige Weg, wirklich

Expecting Ihre Architektur-Funktion auf diese Weise ist naiv -. Es gibt keine „einfache Lösung“ für jede Datenbank, nicht nur MySQL

Ist es wichtig, dass die UIDs gleich sind? Oder würden Sie die Gedanken, eine Tabelle unterhalten oder Spalte Zuordnen den Remote-UID an den lokalen UID und Schreiben von benutzerdefiniertem Synchronisationscode für Objekte, die Sie wollen replizieren über das tut jede notwendige Abbildung von UIDs für Fremdschlüsselspalten, etc?

Die einzige Möglichkeit, Ihre Tabellen synchronisiert wird, um sicherzustellen, ist die Einrichtung eine 2-Wege-Replikation zwischen Datenbanken.

Aber, MySQL erlaubt nur eine Replikation, so dass Sie nicht einfach Ihr Problem in dieser Konfiguration lösen.

Um klar zu sein, können Sie "Setup" eine 2-Wege-Replikation aber MySQL AB schreckt diese .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top