Failover-Setup - Aber Zweiseitig!

dark alex

Depp vom Dienst
Morgen ;)

Ich habe folgendes Problem:

Ich habe einen Server mit einer sehr wichtigen MySQL-Datenbank (genauer gesagt vier Datenbanken, ein MySQL-Server).
Nun muss ich sicherstellen, dass die Datenbank im Falle eines Ausfalles des Servers noch erreichbar ist. Ich habe eine IP, die cih auf zwei verschiedene Server routen kann.

Aufgabenstellung:
s0-master hat die aktuelle DB
s0-slave ist leer.
die datenbank soll in Zukunft auf beiden Servern edundant vorhanden sein sodass ich auf bedarf umrouten kann. Wichtig dabei ist, dass änderungen immer nur an einer seite durchgeführt werden (entwerder ist der eine doer der andere server Zielhost, es ist technsich unmöglich, dass auf beide gleichzeitig zugegriffen wird, daher kein locking notwendig). Und Es müssen, egal ob ich nun auf dem master oder dem slave eine query ausführe die daten repliziert werden.
Auch wichtig ist, dass angenommen MAster stürzt ab, slave übernimmt und ich starte den Master später wieder dieser wieder aktiv wird und sich die änderungen vom slave zieht.

Wie setze ich das am besten um?
MySQL-Replication bekomme ich nicht zum laufen. Einen 2-node-Cluster (incl. 3. Management-Server) nur zum Teil... (Die NDBs verbinden sich, die mysqld aber nicht)
ggnf bräuchte ich mal ein detailliertes aktuelles howto... Kennt jemand ein gutes?

Die Tabellen sind MyISAM-Tabellen

Vielen Dank schonmal für eure Hilfe!
 
Jo nach beidne howtos hab ich mcih versucht.

Jedoch ist die Änderung in einer Tabelle selbst nach über 5 stunden auf dem anderen server noch cniht angekommen. irgendwas luft da nicht. Und ich bin pingelichst durchgegangen. (binary backup-Variante)
 
Dann muss da ein klitzekleiner Fehler sein. Ich hatte noch nie Probleme bei der Replikation..

Wenn Du an dem Punkt bist, wo es eigentlich funktionieren sollte, schau mit SHOW MASTER STATUS; und SHOW SLAVE STATUS; nach, ob sie verbunden sind und vor allem, ob MASTER_LOG_POS stimmt. Das wäre der einzige Fehler, der mir einfallen würde, den Du gemacht haben könntest. Replikation evtl. mal mit START SLAVE; starten, hatte ich auch schon mal vergessen.
 
Gedächtnisprotokoll:

Show slave status sagte mir er wartet drauf, dass der Maste ihm was rüberscheibt was er ändern soll

bei show master status und show slave status haben die werte übereingestimmt (Binärlogposition und Filename)


//Edit: Start Slave hatte ich versucht.
 
Als Du auf dem Master den Query ausgeführt hast, hat die Position mit dem Salve aber nicht mehr überein gestimmt, oder?
 
doch die nummer an dem filename war .000003 und die Position 98
Das wurmte mich ja... Binärlogs sind aber eingeschaltet gewesen...
 
Die Position ist auf dem Slave mitgewandert, aber die Daten waren in der Datenbank nicht verändert? Wirklich eigenartig.

Ist das ein neues Setup, also ohne bisherige Daten auf dem Master, oder wurde der bisherige MySQL-Server zum Master umgebaut? Wenn ja, wurden die Daten, die vorher "angefallen", auf dem Slave kopiert? Diese stehen ja dann nicht im Binärlog und können auch nicht übernommen werden. Werden nun Daten verändert, die auf dem Slave noch gar nicht vorhanden waren, klappt das ja nicht.
 
Wi ich schon oben geschrieben ahb sind auf dem einen server (s0-master) bereits echtdaten drauf.

Vorgehensweise Datentransfer:
Nach dem setup (vor dem start slave und dem angleichen der Logpositionen beider server via change master...):
1. Shutdown beider MySQLServer
2. cd /var/lib/mysql
3. tar -zfv /tmp/sqlbin.tgz *
Wechsel auf den s0-slave:
4. mkdir restore && cd restore
5. sftp root@hostname.domain.tld:/tmp/sqlbin.tgz
6. tar -xf sqlbin.tgz
7. mv /var/lib/mysql /var/lib/mysql_original
8. cd .. && mv restore /var/lib/mysql
9. chown -R mysql:mysql /var/lib/mysql
10. Start des MySQL-Servers (Slave)
11. Geprüft ob die DB korrekt eingelesen wurde (HeidiSQL)
12. Start des Masters
Dann eben die logposition am Slave überprüft - in dem fall war sie korrekt gewesen, also gleich, und dann start slave

dann ahbe cihe inen neuen Eintrag in einer Tabelle erzeugt und der ist binnen einiger Stunden immernoch nicht am slave angeommen.
 
Klappt nicht -.-

Code:
mysql@master> insert into rofl values (55);
Query OK, 1 row affected (0.00 sec)

mysql@master> show master status \G
*************************** 1. row ***************************
            File: mysql-bin.000012
        Position: 98
    Binlog_Do_DB: testdb DB2 DB3 DB4 DB5 DB6 DB7 DB8
Binlog_Ignore_DB:
1 row in set (0.00 sec)
Minuten später...
Code:
mysql@slave> select * FROM rofl;
+------+
| lol  |
+------+
|    5 |
|    0 |
|   99 |
+------+
3 rows in set (0.00 sec)

mysql@slave> show slave status \G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 78.46.***.**
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000012
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000012
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)
 
Gelöst -.-

mehrere DBs nicht etwa mit leerzeichen doer komma trennen (auch wenns im show master status exakt gleich aussieht mit komma) sondern pro DBe inmal den Parameter replicate-do-db und binlog_do_db verwenden^^
 
Back
Top