MySQL Replikation: Daten vom Slave zurück an den Master

slashwalker

New Member
Hallo Forum,
ich experimentiere gerade mit der Replikation von MySQL Datenbanken.
Ich habe einen Master und einen Slave Server.

Die Replikation funktioniert soweit auch. Inserts etc. werden auf dem Slave ausgeführt.

Aber mein Ziel ist ja Ausfallsicherheit. Wenn also der Master down ist, soll die Anwendung (Forum, Shop, whatever) auf den Slave zugreifen.

Was ist aber nun mit den Aktionen, die in so einem Fall ja auf dem Slave ausgeführt werden?

Also Master ist down, Forum läuft über den Slave und es werden Posts, Threads und Kommentare direkt auf dem Slave eingefügt.

Wie bekomme ich nun, wenn der Master wieder online ist, den aktuellen Stand?

Den Master als Slave vom Slave und den Slave als Master? Wäre ja total bkloppt, oder?
 
Und schon gehen die Probleme los...

So, ich habe jetzt ein paar HowTos durchgelesen und mich mal an die Konfiguration gewagt.

Situation:

Server 1 IP 192.168.1.1 MySQL 5.1.50
Server 2 IP 192.168.1.2 MySQL 5.0.45

my.cnf Server 1:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = 192.168.1.2
master-user = replika
master-password = meinpass
master-connect-retry = 60
replicate-do-db = replika

log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = replika

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

my.cnf Server 2

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = 192.168.1.1
master-user = replika
master-password = meinpass
master-connect-retry = 60
replicate-do-db = replika

log-bin= /var/log/mysql/mysql-bin.log
binlog-do-db = replika

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

Danach habe ich beide mysqld neu gestartet und auf beiden SHOW MASTER STATUS aufgerufen.

Mit den Werten von Server 2 habe ich auf Server 1 :
CHANGE MASTER TO MASTER_HOST='192.168.1.2', MASTER_USER='replika', MASTER_PASSWORD='meinpass', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;

ausgeführt.

Wenn ich nun obigen Befehl auf Server 2 mit den Werten von Server 1:
CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_USER='replika', MASTER_PASSWORD='meinpass', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=98;

ausführe, erhalte ich:
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

Im Log steht dann:

100914 11:31:33 [ERROR] Failed to open the relay log '/var/run/mysqld/mysqld-relay-bin.000007' (relay_log_pos 631)
100914 11:31:33 [ERROR] Could not find target log during relay log initialization


Was mache ich falsch? Müssen beide zwingend die gleiche MySQL Version nutzen? Master - Slave hat ja funktioniert.
 
Danke!

Hab jetzt die Parameter auf beiden Servern geändert:
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

geändert in:
relay-log = /var/lib/mysql/repo-relay.log
relay-log-index = /var/lib/mysql/repo-relay-log.index

Jetzt bringen beide die Fehlermeldung:
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

Im mysqld.log steht:
100914 13:07:50 [ERROR] Failed to open the relay log '/var/run/mysqld/mysqld-relay-bin.000007' (relay_log_pos 631)
100914 13:07:50 [ERROR] Could not find target log during relay log initialization

Ich habe alternativ auch schon versucht:
mysql> load data from master;
ERROR 1219 (HY000): Error running query on master: Access denied; you need the RELOAD privilege for this operation
 
Last edited by a moderator:
Zwei unterschiedliche Majorversionen kombiniert man normalerweise nicht. Bringe beide MySQLd und ihre Datenbanken auf den gleichen aktuellen Versionsstand (5.1.50), andernfalls wird die Fehlersuche unverhältnismässig aufwendig, dafür gibt es den kostenpflichtigen MySQL-Support.
 
Okay, Update läuft. Dauert bissel, da yum auch PHP etc updated.

Edit: So, Server 2 hat nun auch 5.1.50, mysql_upgrade wurde ausgeführt.

Fehler wie oben beschrieben bestehen immer noch auf beiden Servern.

Ich verstehe halt nicht, wo er sich den Pfad her holt:/var/run/mysqld/mysqld-relay-bin.000007
Der steht so ja nicht in der my.cnf
 
Last edited by a moderator:
Relevant sind folgende Optionen in der my.cnf:
Code:
log-bin                         = /var/db/mysql/mysql-bin
relay-log                       = /var/db/mysql/relay.log
relay-log-index                 = /var/db/mysql/relay.index
relay-log-info-file             = /var/db/mysql/relay.info
master-info-file                = /var/db/mysql/master.info
master-host                     = <hostname>
master-user                     = <username>
master-password                 = <password>
master-port                     = 3306
auto_increment_increment        = 2
auto_increment_offset           = 2
server-id                       = 1
Wie sehen diese bei Dir auf beiden Servern exakt aus? Werden sie im Init-Script überschrieben? Beide MySQLd restartet?
 
Hier mal die entsprechenden Confs.

Server 1:

Code:
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = 192.168.1.1
master-user = replika
master-password = meinpass
master-connect-retry = 60
replicate-do-db = replika

log-bin = /var/log/mysql/mysql-repo-bin.log
binlog-do-db = replika

relay-log = /var/lib/mysql/repo-relay.log
relay-log-index = /var/lib/mysql/repo-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

Server 2:

Code:
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = 192.168.1.2
master-user = replika
master-password = meinpass
master-connect-retry = 60
replicate-do-db = replika

log-bin= /var/log/mysql/mysql-repo-bin.log
binlog-do-db = replika

relay-log = /var/lib/mysql/repo-relay.log
relay-log-index = /var/lib/mysql/repo-relay-log.index

expire_logs_days = 10
max_binlog_size = 500M

Beide mysqld wurden mehrfach restartet. Benutzer replika existiert auf beiden, mit jeweils dem selben Passwort und den selben Rechten.
 
Wie geil!! Es läuft.

Habe in beiden my.cnf ergänzt:
relay-log-info-file = /var/lib/mysql/repo-relay.info
master-info-file = /var/lib/mysql/repo-master.info

Die zwei Zeilen hatte ich vorher nicht drin.
 
Deswegen bevorzuge ich gerne vollständige Configs, da man sich auf die Lebensdauer vorgeblicher Defaults nicht immer verlassen kann.
 
Okay, jetzt müsste ich nur noch wissen, wie es sich mit mehreren DBs verhält?

Ich vermute mal, das ich für jede DB in der my.cnf einen Abschnitt mit folgenden Angaben benötige:

Code:
replicate-do-db = replika

log-bin = /var/log/mysql/mysql-repo-bin.log
binlog-do-db = replika

relay-log = /var/lib/mysql/repo-relay.log
relay-log-index = /var/lib/mysql/repo-relay-log.index
 
Dann entweder alle, und nur die nicht gewollt sind mit "ignore-DB", oder von Haus aus keine, und die gewollten mit "do-db" definieren.

viele Grüße
Basti
 
Achja, ich hatte irgendwo gelesen, das ab 5.1 die Replikation anders funktioniert.

Wenn ich einen Insert mit UUID() mache, wird die UUID ja auf Server 2 neu generiert und weicht daher ab.

Wo kann ich konfigurieren, das nicht UUID() sondern das Ergebnis davon gelogt wird?
 
Back
Top