Home   Profil   Fun
#48 Linux  03.03.2009

Zwei MySQL-Dämonen zur gleichen Zeit laufen lassen


Ziel ist der parallele Betrieb von zwei MySQL-Dämonen auf dem selben Server. Hat man nur einen Server zu verfügung, kann dies zum Beispiel genutzt werden, um konsistente Backups zu erstellen, ohne die Live-Datenbanken mit einem read lock zu versehen. Ohne die Replikation müsste man die Live-Datenbanken während des Backups für Schreiboperationen sperren, womit man Gefahr läuft mit Benutzeraktionene zu kollidieren. Mit der Replikation jedoch sperrt man einfach die zweite Instanz und kann dann von dort das Backup erstellen. Die Benutzer werden nicht gestört, da sie ja in die Live-Datenbanken schreiben. Ist das Backup erstellt sorgt der Replizierungsvorgang dafür, dass beide Instanzen sofort wieder abgeglichen werden. Jedoch ist zu beachten, dass die Replikation nicht über Sockets funktioniert, sondern über TCP/IP. Dies bedeutet die beteiligten MySQL-Instanzen benötigen unterschiedliche IP-Adressen.

Um ein solches Szenario zu realisieren müssen die beiden MySQL-Dämonen unterschiedliche Ports und Sockets verwenden.
Für dieses Tutorial nehme ich an, dass bereits ein MySQL-Dämon mit der Konfigurationsdatein /var/db/mysql/mysql.cnf installiert ist.
Nehmen wir an diese Datei enthält folgende Zeilen:
port=3306
datadir=/var/db/mysql
pid-file=/var/db/mysql/mysql.pid
tmpdir=/var/db/tmp
socket=/tmp/mysql.sock

Wir erzeugen ein zweites Datenverzeichnis indem wir /var/db/mysql nach /var/db/mysql2 kopieren.
cp -rp /var/db/mysql /var/db/mysql2

Es wird auch ein zweites temporäres Verzeichnis benötigt.
cp -rp /var/db/tmp /var/db/tmp2

Beide neuen Verzeichnisse sollten die gleichen Rechte haben wie die Originalverzeichnisse.
Für den zweiten MySQL-Dämon ändern wir nun einfach dessen Konfigurationsdatei /var/db/mysql2/mysql.cnf:
port=3307
datadir=/var/db/mysql2
pid-file=/var/db/mysql2/mysql.pid
tmpdir=/var/db/tmp2
socket=/tmp/mysql2.sock

Jetzt kann man beide Dämonen starten:
/usr/local/bin/mysqld_safe --defaults-file=/var/db/mysql/mysql.cnf &
/usr/local/bin/mysqld_safe --defaults-file=/var/db/mysql2/mysql.cnf &

Clients von localhost können sich mit den Dämonen jeweils anhand ihrer Sockets verbinden.
mysql -uroot -p -h localhost -S /tmp/mysql.sock
mysql -uroot -p -h localhost -S /tmp/mysql2.sock

Remote clients können die Dämonen anhand ihrer Ports unterscheiden und sich so mit ihnen verbinden.
mysql -uroot -p -h dbserver -P 3306
mysql -uroot -p -h dbserver -P 3307