Montag, 14. Februar 2011

MySQL Replizieren

Heute beschäftigen wir uns kurz mal mit dem Thema "MySQL Replikation".
Kurz?
Ja! Lange dauert das ja nicht :-)

Nehmen wir mal die Ausgangssituation
Einen Debian Server MASTER mit MySQL
Auf die Installation von Debian bzw MySQL muss man wohl nicht mehr im Detail eingehen, diese ist bei Debian ja so schön automatisiert das nichts schief gehen sollte, und
Einen Debian Server SLAVE mit MySQL
 Wenn man die beiden Server zufällig in einem Rack haben sollte, so bevorzuge ich es an eth1 einfach ein Crosskabel anzuschliessen (Anmerkung!: Ein Crosskabel braucht man eigentlich nicht mehr, neue Neztwerkkarten sind so toll das sie dies alleine tun können).
Somit konfigurieren wir uns auf beiden Servern ein Netz, zB
auto eth1
iface eth1 inet static
        address 10.0.1.X
        netmask 255.255.255.0
        network 10.0.1.0
        broadcast 10.0.1.255
10.0.1.X sollte hierbei das X als 1 auf dem Master und 2 auf dem Slave gesetzt sein. Nach einem  /etc/init.d/networking restart sollte eine ping Probe möglich sein
root@mysql-master:~# ping 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=3.95 ms
Nun beginnen wir mit der Arbeit auf dem Master
Als erstes editieren wir die /etc/mysql/my.cnf, hier suchen wir die Zeile

  • #server-id            = 1
  • #log_bin              = /var/log/mysql/mysql-bin.log
und kommentieren sie ein, danach
  • mysql -p
um in das MySQL Interface zu gelangen

  •  GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repl'@'10.0.1.2' IDENTIFIED by '<ANYPASSWORD>';
  • flush privileges;
Nun brauchen wir noch den Grunddatensatz, hierzu packen wir uns einfach das data_dir welches wir in /etc/mysql/my.cnf finden. Im Falle von Debian sollte dies /var/lib/mysql sein

  • cd /var/lib/mysql
  • tar cfz /tmp/mysnap.tar.gz .
  • scp mysnap.tar.gz 10.0.1.2:
Letzter Punkt auf dem Master, wir brauchen das aktuelle Logfile

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

ACHTUNG! Debian hat einen eigenen Systemnutzer, mit dieser Methode wird auch sein Passwort überschrieben, was dazu führt das MySQL auf dem Slave gleich nicht mehr gestartet werden kann. Workaround ist relativ simple, man kopiere sich die Passwörter aus /etc/mysql/debian.cnf und ersetze diese auch auf dem Slave.

Nun machen wir auf dem Slave weiter
Auch hier suchen wir den server-id Eintrag, setzen ihn aber auf 2

  • server-id            = 2

Nun entpacken wir unser Archiv, wenn Sie unsicher sind können Sie hier auch im my.cnf File nachsehen welches das data dir ist

  • tar xfz mysnap.tar.gz -C /var/lib/mysql/
Im letzten Schritt

  • mysql -p
  • CHANGE MASTER TO
    MASTER_HOST="10.0.1.1",
    MASTER_USER="repl",
    MASTER_PASSWORD="<ANYPASSWORD>",
    MASTER_LOG_FILE="mysql-bin.000001";
  •  START SLAVE;
Abschliessende Kontrolle:
So, eigentlich sollte unsere Arbeit hiermit erledigt sein, wir testen unser tun natürlich noch, ich kopiere mit Absicht nicht die ganze Zeile der Ausgabe, aber so ungefähr sollte sie aussehen

Auf dem Master
  • show processlist;
  • 35 | repl | 10.0.1.2:36874 | NULL | Binlog Dump |  914 | Has sent all binlog to slave; waiting for binlog to be updated | NULL

 Auf dem Slave, so etwas wie

  • show processlist;
  • Waiting for master to send event | 10.0.1.1    | repl        |        3306 |            60 | mysql-bin.000001 |                 106 | mysqld-relay-bin.000002 |           251 | mysql-bin.000001 
ACHTUNG! Fast hätte ich es vergessen. Was mir auch sehr spät bei der Kontrolle aufgefallen ist, ist das Debian standardmässig nur auf 127.0.0.1 hört daher muss die bind-adresse noch angepasst werden.

  • bind-address = 0.0.0.0


Danke das wars :-)