MySQL Master-Master-Replikation ALLER Datenbanken. Wie?

16

Hintergrund : Ich habe zwei MySQL 5.1 Server - Setup in Master-Master zeilenbasierte Replikation (RBR) nach diesem ausgezeichneten Führer . Ich möchte, dass alle Datenbanken repliziert werden und füge regelmäßig neue Datenbanken hinzu.

Ziel : Ich möchte in der Lage sein, der Replikation neue Datenbanken hinzuzufügen, indem ich einfach die Datenbank zu einem der Server hinzufüge. ohne dass Sie beide Slaves anhalten müssen, ändern Sie die Konfigurationsdateien, starten Sie die MySQL-Server neu und starten Sie die Slaves erneut.

Frage : Von dem, was ich gelesen habe, ich glaube , ich kann dies tun , indem Sie einfach das Weglassen alle binlog-do-db, binlog-ignore-db, replicate-do-db, und replicate-ignore-dbEinstellungen in jeder Konfiguration des Servers, aber ich kann nicht sicher sein. Die MySQL-Dokumente zur Bewertung der Replikationsoptionen auf Datenbank- und Tabellenebene lassen mich vermuten, dass dies möglicherweise überhaupt nicht möglich ist.

Relevante Teile meiner /etc/mysql/my.cnfDateien werden unten kopiert. Bin ich auf dem richtigen Weg? Ist das, was ich will, überhaupt möglich?

Meister 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

Meister 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M
Andrew Ensley
quelle
1
Erstellen Sie die Datenbank auf dem Computer, auf den Sie die Schreibvorgänge richten.
Martin
Was ist deine vollständige Konfiguration? Ich versuche diese Antwort unten, es hat nicht funktioniert :-(
zx1986

Antworten:

17

So habe ich es für beide Meister gemacht

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin
Mike
quelle
Können Sie einem Master Datenbanken hinzufügen und diese automatisch auf den anderen replizieren?
Andrew Ensley
Ja, sie haben es getan. Ich habe gerade festgelegt, welche zu ignorieren sind
Mike
1
Zwei Fragen: Ich muss nur sicherstellen, dass wir beide dasselbe sagen. # 1 Können Sie eine Datenbank zu einem der beiden Master hinzufügen und diese automatisch auf dem anderen Master erstellen. Anschließend werden alle in die neue Datenbank eingefügten Daten repliziert, ohne dass die Konfiguration geändert oder die Server neu gestartet werden müssen? # 2 Verwenden Sie anweisungs- oder zeilenbasierte Replikation? Ich muss alle Änderungen in allen Datenbanken replizieren. Auch solche, die zuvor ohne "use" -Anweisung ausgeführt wurden. Funktionieren diese Einstellungen gut mit zeilenbasierter Replikation?
Andrew Ensley
3
ja ja ja ja ja :)
Mike
1
Ok, ich habe gerade letzte Nacht meine Server mit diesen Einstellungen eingerichtet. Ich habe die log-slave-updatesEinstellung übersprungen , weil ich keine Notwendigkeit dafür sah. Alles funktioniert einwandfrei. Ich kann Datenbanken hinzufügen und löschen, und die Änderungen werden repliziert. Vielen Dank! Kopfgeld vergeben.
Andrew Ensley
4

In Bezug auf die Erstellung von Datenbanken gibt es immer noch Fehlerberichte zur Verwendung von CREATE DATABASE mit zeilenbasierter Replikation.

Dieser Bericht ist geschlossen, aber der Fehler ist erneut in MySQL 5.1.47 aufgetreten.
Dieser Bericht basiert auf MySQL Cluster (NDB Storage Engine).
Dieser Bericht basiert auf einer noch replizierenden Replikat-Wild-Ignore-Tabelle.

Die zeilenbasierte Replikation führt dazu, dass Binärprotokolle mit einer außergewöhnlichen Geschwindigkeit anwachsen, wodurch der Netzwerkverkehr ansteigen kann, wenn nur Binärprotokolldaten an die Relay-Protokolle des Slaves übertragen werden.

@ Mike sagt, er habe die Datenbankerstellung zum Funktionieren und Replizieren gebracht. Das bezweifle ich gar nicht. Was ich bin, ist, dass MySQL (z. B. Oracle) nicht alle Probleme mit der zeilenbasierten Replikation hat, sobald die Datenbank instanziiert wurde.

Möglicherweise möchten Sie zu row_format MIXED wechseln, wenn Sie weiterhin zeilenbasierte Einträge in den Binärprotokollen möchten. Intern tendiert das binäre Protokollformat dazu, zwischen Anweisung und Behoben zu schweben: (Siehe http://bugs.mysql.com/bug.php?id=40146 ). Weitere Fehlerberichte werden mit mixed geschlossen und meiden zeilenbasiert ( http://bugs.mysql.com/bug.php?id=39701 ), aber es treten immer noch zeitweise Probleme auf.

SCHLUSSBEMERKUNG

Kehren Sie zu Ihrer eigenen Sicherheit zur anweisungsbasierten Replikation zurück, und stellen Sie CREATE DATABASE (eine SQL-Anweisung) für nachfolgendes SQL für die erstellte Datenbank stabil und konsistent her. Tatsächlich zeigt der jüngste Fehlerbericht, dass es am besten ist, eine anweisungsbasierte Replikation zu verwenden, unabhängig davon, was in der Dokumentation zu Optionen auf Datenbank- und Tabellenebene angegeben ist.

RolandoMySQLDBA
quelle
Danke für all diese Infos. Mein einziges Problem bei der anweisungsbasierten Replikation ist, dass Änderungen, die die Datenbank angeben (z. B. "INSERT INTO db1.table1 (col1) VALUES ('hi');"), nur funktionieren, wenn die Datenbank die aktuell verwendete Datenbank ist. Ich nehme an, es ist an der Zeit, auf anweisungsbasierte Replikation umzusteigen und Code zu bereinigen ...
Andrew Ensley,
Es stellte sich heraus, dass es nicht so schwer war, den erforderlichen Code zu reparieren. Ich verwende jetzt die anweisungsbasierte Replikation. Danke für den Hinweis.
Andrew Ensley
0

Hmm ... Sie müssen auch einen Weg finden, um automatisch inkrementierte Schlüssel und Felder zu behandeln / zu unterscheiden. Das sieht interessant aus. Http://mysql-mmm.org/

Nandhini Anand
quelle
Dies wird in den auto-increment-incrementund auto-increment-offsetEinstellungen in meinen Konfigurationsdateien behandelt. Siehe diese Seite: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley
Ich denke du missverstehst. Bei @Andrew geht es um das Hinzufügen neuer Datenbanken, nicht um das Hinzufügen neuer Datenbankserver. Wenn @Andrew neue Datenbankserver einführt, kann es zu Schlüsselkollisionen bei der Neuverteilung der Daten auf 3 oder mehr DB-Server kommen, die Ihre Antwort ansprechen würde. +1 für Ihre Mühe, aber lesen Sie bitte alle Fragen sorgfältig durch. Ich bin genauso verbrannt worden.
RolandoMySQLDBA
@all: Ups .. Entschuldigung. Ich könnte schwören, dass ich es vollständig gelesen habe, aber stattdessen muss kein
Bild überflogen worden sein
-1

Ich dachte, Sie sollten in der Lage sein, Datenbank auf Master1 und Master2 zu erstellen, ohne die Konfiguration zu ändern oder den Slave zu stoppen, aber stellen Sie sicher, dass die Master-Master-Replikation ausgeführt wird. Da Sie nicht definieren, welche Datenbank repliziert werden muss, bedeutet dies, dass alle Datenbanken repliziert werden, wenn Sie sie nicht in my.cnf definieren.

chocripple
quelle
Genau das frage ich hier. Ich kann dazu noch keine endgültige Antwort finden.
Andrew Ensley