MySQL Replikation mit MariaDB

Replikation

Aus gegebenem Anlass widmen wir uns heute der MySQL Replikation. Sinnvoll kann dies sein wenn man nicht seinen ganzen Server Spiegeln möchte oder andere Lösungen nicht in Frage kommen. Zudem benötigen die Slave Server  so gut wie keine Leistung. Hier setzte ich auf 2 vServer mit je 10GB Speicherplatz und 512MB RAM.

Der Artiekl beschreibt die MySQL Replikation eines Master und Slave Server. Ihr könnt aber noch einen zweiten oder dritten Slave Server hinzufügen. Die vorgensweise ist gleich.

Vorraussetung

  • 2 Server (Master/Slave)
  • root Zugang

Installation

Wir installieren MariaDB auf beiden Servern, dem Master und Slave

aptitude install mariadb-server mariadb-client

Nachdem auffordern zur Passwortvergabe, stoppen wir den Slave Server

systemctl stop mariadb

Master Konfiguration

Um den Master Server zu konfigurieren, müssen wir zuerst ein paar Einstellungen in /etc/my.cnf ändern. Dafür öffnen wir die Datei mit einem Editor unserer Wahl.
Hier suchen wir die Sektion [mysqld] heraus und ergänzen es um die folgenden Zeilen.

server_id=1
log_bin = mysql-bin
sync_binlog = 1
bind-address = 1.2.3.4

server_id ist eine fortlaufende ID . Master; 1, Slave; 2 etc. bind-adress ist die IP des Servers. Jetzt starten wir den Master neu.

systemctl restart mariadb

Jetzt prüfen wir die binary logs des masters

mysql -u root -p
 
mysql> show master status;

Wir sollten folgendes Ergebnis erhalten

+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 |      245 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Ist dies der Falls, so legen wir uns einen User für die Replikation an.

mysql> GRANT REPLICATION SLAVE ON *.* TO repl IDENTIFIED BY "SECRET" WITH GRANT OPTION;
mysql> flush privileges;

Der User heißt in diesem Fall repl. SECRET muss noch durch ein Passwort für die Replikation ersetzt werden.

Nun prüfen wir noch den User in der Datenbank.

mysql> select * from mysql.user WHERE user="repl"\G;

Die Ausgabe sollte dann wie folgt aussehen.

*************************** 1. row ***************************
                  Host: %
                  User: repl
              Password: *C7B0F93AB354C7F98949395F70387AE3F79A5549
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: Y
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: Y
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string:

Jetzt müssen wir noch einen Datenbank Dump erstellen, den wir auf dem Slave dann einbinden könne.

Dafür sperren wir zuerst den Zugriff auf die Datenbank

mysql> FLUSH TABLES WITH READ LOCK;

Nun müssen wir noch einen Dump der aktuellen Installation erstellen:

mysqldump -u root -p --events --ignore-table=mysql.events --all-databases > /var/backups/mysqldump.sql

Diesen Dump kopieren wir anschließend auf den Slave in das Homeverzeichnis unseres Users:

scp /var/backups/mysqldump.sql fragz@1.2.3.4:/home/fragz

fragz ist ein auf dem Slave Server angelegter User. 1.2.3.4 die IP des Slave. Auf dem Master Server ausgeführt, kopiert er nun das Backup auf den Slave.

Slave Konfiguration

Auch beim Slave müssen wir als erstes die my.cnf anpassen.

Dem Slave geben wir hier die Server ID 2

server_id = 2
relay_log = mysql-relay-bin
read_only = yes

Danach starten wir mariadb.

systemctl start mariadb

Jetzt spielen wir den zuvor kopierten mysql Dump auf dem Slave ein.

mysql -uroot -p < /home/fragz/mysqldump.sql

Anschließend loggen wir uns in die Datenbank ein

mysql -u -root -p

In der Datenbank muss nun hinterlegt werden, dass die Daten von einem anderen Server komme.

mysql> CHANGE MASTER TO
       MASTER_HOST='IP_Adresse_MASTER',
       MASTER_USER='repl',
       MASTER_PASSWORD='Replikations_Passwort',
       MASTER_LOG_FILE='mariadb-bin.000002.bin',
       MASTER_LOG_POS=245;

Replikation starten

Um die Replikation zu starten, führen wir folgenden Befehl aus.

mysql> slave start;

Diesen prüfen wir anschließend noch.

mysql> show slave status\G;

Die Ausgabe sollte dann wie folgt aussehen:

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 1.2.3.4
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 245
               Relay_Log_File: mysql-relay-bin.000004
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000004
             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: 245
              Relay_Log_Space: 1107
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

Damit haben wir erfolgreich eine Master/Slave Replikation aufgesetzt

Schreibe einen Kommentar

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