Ein Sklave, mehrere Master MySql

9

Ist es möglich, MySql Replication so einzurichten, dass ein Slave zwei verschiedene Master abhört?

Jonny
quelle

Antworten:

3

Ein mysqld-Prozess kann nicht gleichzeitig zwei verschiedene Master anhören.

Mit dem Befehl CHANGE MASTER TO können Sie nur einen Master als Quelle zum Lesen festlegen.

Um dies zu emulieren, müssten Sie programmgesteuert zwischen den beiden Masters wechseln. Wie machst du das ?

In StackOverflow habe ich beschrieben, wie ein Slave manuell mit verschiedenen Mastern verbunden wird, wobei jeder Master ein Laptop und der Slave ein zentraler Computer war.

Hier ist die Grundidee

  • Master M1
  • Master M2
  • Slave S1

Richten Sie die Replikation von M1 nach S1 und dann von M2 nach S1 wie folgt ein

  • 1) Lassen Sie S1 CHANGE MASTER TO mit M1 als Quelle ausführen
  • 2) START SLAVE;
  • 3) Führen Sie die Replikation für eine kurze Zeit aus
  • 4) STOP SLAVE;
  • 5) Lassen Sie S1 CHANGE MASTER TO mit M2 als Quelle ausführen
  • 6) START SLAVE;
  • 7) Führen Sie die Replikation für eine kurze Zeit aus
  • 8) STOP SLAVE;
  • 9) Gehen Sie zurück zu Schritt 1

Jedes Mal, wenn Sie von einem Master zu einem anderen wechseln, müssen Sie zwei Werte von aufzeichnen SHOW SLAVE STATUS\G

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

Diese beiden Werte stellen die letzte SQL-Anweisung dar, die vom Master stammt und als nächstes auf dem Slave ausgeführt werden soll.

Es gibt eine große Vorsicht: Solange M1 und M2 sich gegenseitig ausschließende Datenbanken aktualisieren, sollte dieser Algorithmus in Ordnung sein.

Ob Sie es glauben oder nicht, ich habe bereits im Mai 2011 eine solche Frage in ServerFault beantwortet. Ich habe tatsächlich erklärt, wie man mit der BLACKHOLE Storage Engine basierend auf dem Buch "High Performance MySQL" einen echten Multimaster / Single Slave emuliert.

RolandoMySQLDBA
quelle
Obwohl ich es selbst noch nicht wirklich gebraucht habe, habe ich früher über dieses Problem nachgedacht. Wäre es nicht möglich, das Binlog des zweiten Masters in den MySQL-Slave zu leiten? Ich denke, das Beste wäre, ein Tool zu haben, das auch die Ergebnisse jeder Abfrage im Auge behält und bei einem Fehler stoppt, genau wie es der normale Replikations-Slave-Thread tut. Aber im Wesentlichen sollte auch eine einfache Pfeife reichen. Natürlich würden beide Master, die in dieselbe Datenbank / Tabelle schreiben, schnell schwierig werden. Etwas, worüber Sie Gurus nachdenken sollten?
Jannes
1
Ich denke, es lohnt sich, Ihrer Antwort hinzuzufügen, dass 5.7 mehrere Master unterstützt, obwohl MySQL 5.6 dies nicht tut.
Phil Sumner
4

Rolandos Lösung hat viele Einschränkungen. Der erste, der ein Replikat-Stream ist, wird notwendigerweise nicht repliziert, während der andere funktioniert. Dies wird Ihnen Zeiträume geben, in denen Ihr Sklave nicht synchron ist. Sie müssen jetzt einen heiklen Balanceakt spielen, um sicherzustellen, dass jeder genug Zeit hat, um aufzuholen, wenn er an der Reihe ist.

Wie beschrieben müssen Sie auch den Buchhalter der Protokollpositionen spielen, um wieder zu wechseln. Dies scheint wirklich nur fehlerhaft zu sein, da das Fenster für fehlende oder inkonsistente Daten geöffnet wird oder sogar die Replikation unterbrochen wird, wenn ein Fehler auftritt (entweder durch einen Fehler "nur um eins" in der Protokollposition).

Ich würde empfehlen, nur mehrere MySQL-Instanzen auszuführen. Nichts hindert Sie daran, zwei oder mehr MySQLs auf demselben Computer auszuführen. Sie können natürlich nicht beide am selben Port arbeiten. Ich sehe dies jedoch nicht wirklich als Problem an, da Sie in jedem Client und jeder Bibliothek etwas anderes als 3306 angeben können.

Geben Sie einfach port = 3307 an (oder was auch immer in einer der .cnf-Dateien).

Sie sollten auch darauf achten, dass die individuell konfigurierten Pufferpools und andere Speicherkonfigurationen nicht im Widerspruch zueinander stehen. Dies ist jedoch ein Vorteil, da Sie diese Einstellungen genauer auf die spezifischen Anforderungen der einzelnen Datenbanken abstimmen können, die repliziert werden.

Auf diese Weise werden nur zwei Replikationsströme auf demselben Server ausgeführt. Niemals zurück, keine Buchhaltung erforderlich, kein "Austausch" -Skript erforderlich.

atxdba
quelle
Ich bin froh, dass jemand den Buchhaltungswahnsinn versteht. Schöne Antwort auch. +1 !!!
RolandoMySQLDBA
0

Fan-In (Multi-Source-Replikation) wird von MySQL 5.7 unterstützt.

Eine Labs-Version finden Sie hier: http://labs.mysql.com/

Morgan Tocker
quelle
0

MariaDB, die als Ersatz für MySQL verwendet werden kann, kann verwendet werden. Es unterstützt es ab Version 10.2

Das Problem mit der Unterstützung von MySQL 5.7 ist die Notwendigkeit von GTID, was bedeutet, dass der Master ebenfalls geändert werden muss, im Fall von MariaDb ist dies nicht der Fall.

Beispiel / HowTo-Link: http://www.skysql.com/blogs/dean-ellis/multi-source-replication-mariadb-100

Roman M.
quelle