MySQL-Slave unterbrechungsfrei erstellen

MySQL-Slave unterbrechungsfrei erstellen

Die Vorteile von einem Master-Slave-Setup für Datenbanken wie MySQL hat sich ja mittlerweile herumgesprochen. Typischer wird ein Slave aus einem MySQL-Dump vom Master-Server gebaut. Je nach Größe der Datenbank dauert dieser Vorgang jedoch einige Minuten bis hin zu Stunden.
Teilweise ist beim Dump sogar der MySQL-Master für weitere Schreibvorgänge gelockt. Wer eine schnellere Lösung sucht oder den Slave im laufenden Betrieb erstellen möchte ohne die Anwendung zu unterbrechen, findet hier eine alternative Lösung.
Zunächst stellen wir sicher, dass auf dem Slave der MySQL-Dienst gestoppt und das Datenverzeichnis komplett leer ist.
[bash]
/etc/init.d/mysql stop
rm -rf /var/lib/mysql/*
[/bash]
Für einen unterbrechungsfreien Snapshot der Datenbank nutzen wir die Software Xtrabackup von Percona. Xtrabackup sichert im laufenden Betrieb das MySQL-Datenverzeichnis und merkt sich dabei auch die aktuelle Binlog-Position. Wir senden die Daten dann live über Netcat. Dazu öffnen wir einen Socket z.B. Beispiel auf Port 6789 auf dem Slave:
[bash]
cd /var/lib/mysql
nc -l -p 6789 | tar xvi
[/bash]
und starten das Hot-Backup auf dem Master-Server:
[bash]
innobackupex-1.5.1 –password=rootpassword –slave-info –stream=tar ./ | nc -w 15 10.3.128.46 6789
[/bash]
Dies dauert nun je nach Geschwindigkeit der Netzwerkverbindungen einen Moment. Hier macht sich nun eine 10G-Verbindung des Servers positiv bemerkbar. Der MySQL-Master kann in der Zwischenzeit wie gehabt weiter genutzt werden.
Ist die Übertragung abgeschlossen kann das Backup auf dem Slave eingespielt:
[bash]
innobackupex-1.5.1 –apply-log –use-memory=2G /var/lib/mysql/
[/bash]
und der MySQL-Dienst gestartet werden:
[bash]
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysql start
[/bash]
Nun nur noch die MySQL-Replikation auf dem Slave starten. Die Binlog-Datei und -Position lesen wir aus der Datei “xtrabackup_binlog_info” aus, die Xtrabackup für uns erstellt hat.
[bash]
cat xtrabackup_binlog_info
mysql -p
CHANGE MASTER TO MASTER_HOST = ‘10.3.128.11’, MASTER_USER = ‘repl’, MASTER_PASSWORD = ‘test’, MASTER_LOG_FILE = ‘mysql-bin.000005’, MASTER_LOG_POS = 1644;
[/bash]
Auf dem DevOps-Camp in Nürnberg haben wir dazu eine kurze Session mit Live-Präsentation gehalten. Gleichgesinnte tauschen sich hier im klassischen Barcamp-Style aus. Empfehlung für jeden Entwickler und/oder Operations Engineer.

Share this post

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.