====== MySQL Replication ====== [[software:datenbanken:mysql|MySQL]] Replication kann zum Load-Balancing und zur Ausfallsicherheit genutzt werden. In folgendem Tutorial ist die Installation einer Master-Slave-Umgebung beschrieben. ===== Wie es funktioniert ===== Die MySQL-Replikation funktioniert, in dem der Slave-Server aus dem Binärlog des Master-Servers alle ausgeführten Queries auch ausführt. Das Konzept stößt jedoch bei komplexen Queries mit Transaktionen und Triggern an seine Grenzen und für jeden Einsatzzweck muss geprüft werden, ob die Lösung umsetzbar ist. ===== Konfiguration ===== Die Installation wird nach Vorschlag von //Schwartz et al. (2008)//((Schwartz, Baron; Zawodny, Jeremy D. (2008): High performance MySQL. 2. Aufl. Beijing ;, Sebastopol: O'Reilly.)) durchgeführt. ==== Schritt 1: Installieren von MySQL auf allen Servern ==== Unter Debian und Ubuntu erhält man den MySQL-Server mittels apt-get install mysql-server ==== Schritt 2: Nicht-Lokale Serverzugriffe freischalten ==== Standardmäßig sind nur Zugriffe auf den Server über die interne Netzwerkkarte ''localhost'' möglich, weshalb in der ''my.cnf'' die externe Netzwerkkarte eingegeben werden muss, bzw. ''0.0.0.0'' für Zugriffe von allen Netzwerkkarten eingetragen werden muss (my.cnf-Datei wahrscheinlich in /etc/mysql zu finden): bind-address = [server-address] ==== Schritt 3: Einrichten von Replication-Accounts ==== Nun können wir User-Accounts auf Client und Server erstellen. //Schwartz et al. (2008)//((Schwartz, Baron; Zawodny, Jeremy D. (2008): High performance MySQL. 2. Aufl. Beijing ;, Sebastopol: O'Reilly.)) schlagen vor, auf allen Serveren Nutzer mit den Rechten ''REPLICATION SLAVE'' und ''REPLICATION CLIENT'' anzulegen, jedoch sollte man die Zugriffsrechte auf das tatsächlich benötigte Netzwerk beschränken, da die Replikation unsicher sei. mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@[ip] IDENTIFIED BY '[password]' Die ''[ip]'' Adresse kann Wildcards enthalten: ''%''. Mehr zu den Rechten wie REPLICATION SLAVE bzw, REPLICATION CLIENT sind [[http://dev.mysql.com/doc/refman/5.0/en/privileges-provided.html#priv_replication-client|hier]] zu finden. ==== Schritt 4: Master-konfiguration ==== Auf allen Maschinen muss das binary-logging aktiviert werden und eine eindeutige Server-ID gesetzt werden, dies geschieht alles in der ''my.cnf'': log_bin = /var/log/mysql/mysql-bin.log server_id = 10 Nach einem Dienstneustart können wir checken, ob alles läuft: mysql> SHOW MASTER STATUS; Die Ergebnisse dieser Abfrage benötigen wir in **Schritt 6**, wenn wir den Slave zum Master verbinden. ==== Schritt 5: Slave-Konfiguration ==== Wie beim Master müssen Konfigurationen in der ''my.cnf'' erfolgen: log_bin = /var/log/mysql/mysql-bin.log server_id = 20 relay_log = /var/log/mysql/mysql-relay-bin.log log_slave_updates = 1 read_only = 1 ==== Schritt 6: Connecting the slave to the master ==== Die Verbindung zum Master geschieht mit folgender Abfrage: mysql> CHANGE MASTER TO MASTER_HOST='[master-address]', -> MASTER_USER='[user]', -> MASTER_PASSWORD='[password]', -> MASTER_LOG_FILE='[logfile]', -> MASTER_LOG_POS=[position]; ''[master-address]'', ''[user]'' und ''[password]'' sind die Replication-Account-Informationen am Master. Die Informationen über ''[logfile]'' und ''[position]'' können aus der Abfrage ''SHOW MASTER STATUS;'' in **Schritt 4**. ==== Schritt 7: Starting the replication ==== Vor dem Start der Replikation können wir mit folgender Abfrage den Status überprüfen: mysql> SHOW SLAVE STATUS\G Alle Einstellungen müssen wie konfiguriert erscheinen und ''Slave_IO_Running'', wie auch ''Slave_SQL_Running'' müssen auf ''No'' stehen. Nun können wir die Replikation starten: mysql> START SLAVE; und überprüfen, ob alles einwandfrei funktioniert: mysql> SHOW SLAVE STATUS\G Wir können die Replizierung auch in der Prozessliste sehen: mysql> SHOW PROCESSLIST\G ==== Fehlerbehandlung ==== Falls es beim Start der Replikation zu einer Fehlermeldung kommt, dass Primary Keys doppelt vergeben sind, kann man folgendes versuchen: MySQL Server stoppen: # service mysql stop In der Datei **/etc/mysql/my.cnf** folgenden Eintrag im Abschnitt [mysqld] hinzufügen: slave-skip-errors=1062 MySQL Server neu starten: # service mysql start Wenn bei der Anzeige des Slave Status der Wert von "Seconds_Behind_Master" auf 0 gesunken ist, entfernt man die Zeile wieder aus der Konfiguration und startet den MySQL Server neu