Das Replizieren von Datenbanken schafft Redundanz, die vor Datenverlust schützen und eine optimierte Leistung für Anwendungen ermöglichen kann. Dieses Tutorial behandelt die Grundlagen der Replikation einer bestehenden MariaDB 10.0-Master-Datenbank auf einen oder mehrere Slaves. In den folgenden Beispielen ist das Host-Betriebssystem Debian 8.
Diese Anweisungen können auf andere Betriebssysteme angewendet werden, aber beachten Sie, dass einige Befehle und Standarddateispeicherorte anders sein werden. Insbesondere sollten Sie die Pfadnamen von /etc/mysql/my.cnf ersetzen , /var/lib/mysql , den Standardnamen und -pfad Ihrer binären Logdatei und die Befehle zum Starten, Stoppen und Neustarten von mysqld gemäß den Besonderheiten Ihres Systems.
1. Konnektivität überprüfen
Bevor Sie fortfahren, vergewissern Sie sich, dass der Master und der Slave sich gegenseitig im Netzwerk erreichen können und dass jeder einen Eintrag für den anderen in seiner jeweiligen /etc/hosts hat Dateien. Jeder Host sollte pingen können die andere, und Sie sollten ssh können als normaler Benutzer untereinander austauschen.
2. Aktivieren Sie das mysqld-Binärprotokoll auf dem Master
Überprüfen Sie auf dem Master-Host, ob die binäre Protokollierung aktiviert ist. Aufruf von mysqld mit den Schaltern --verbose --help zeigt Betriebswerte für den MariaDB-Daemon an. Als root:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
Der Wert des Eintrags log-bin definiert die Namenskonvention der binären Protokolldateien. Unter Debian befinden sich diese Dateien in /var/lib . Wenn der Wert von log-bin ist (Kein Standardwert) müssen Sie die Protokollierung aktivieren, indem Sie die Konfigurationsdatei my.cnf ändern . Unter Debian my.cnf befindet sich im Verzeichnis /etc/mysql .
Öffnen Sie /etc/mysql/my.cnf in einem Texteditor und suchen Sie [mysqld] Gruppe. Wenn es nicht existiert, erstellen Sie es und geben Sie eine Zeile ein, die einfach log-bin lautet .
[mysqld]
log-bin
Das Einfügen dieses Eintrags aktiviert die binäre Protokollierung, wenn mysqld neu gestartet wird.
Sie können einen Wert für log-bin festlegen , z.B. log-bin=Dateiname , um einen benutzerdefinierten Namen für die binäre Protokolldatei zu definieren. In diesem Tutorial legen wir keinen Wert fest und es werden die standardmäßigen Protokolldateinamen verwendet.
Starten Sie mysqld neu:
service mysql restart
Überprüfen Sie, ob die Änderung wirksam wurde:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
Wie hier gezeigt, beginnt der Standardname der binären Protokolldatei unter Debian mit mysqld-bin , z.B. mysqld-bin.nnnnnn .
3. Gewähren Sie einem Replikationsbenutzer Rechte
Es empfiehlt sich, alle Replikationsaufgaben von einem dedizierten Replikationsbenutzer ausführen zu lassen. In diesen Beispielen nennen wir den Benutzer repluser und setzen Sie das Passwort dieses Benutzers auf die Zeichenfolge replpass .
Gewähren Sie diesem Nutzer die globalen Berechtigungen SUPER , NACHLADEN , und REPLICATION SLAVE . Diese ermöglichen es dem Replikationsbenutzer, Superuser-Befehle auszuführen, Datenbank-Caches zu leeren und Aktualisierungen vom Master-Server abzurufen.
Geben Sie den MariaDB-Client als Datenbankstamm ein:
mysql -u root -p
Geben Sie an der MariaDB-Eingabeaufforderung den Befehl ein:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
Hier wird der Hostname-Platzhalter '% ' ermöglicht dem Replikationsbenutzer, sich von jedem Host aus zu verbinden.
Überprüfen Sie, ob die Rechte gewährt wurden:
SHOW GRANTS FOR 'repluser'\G;
4. Leeren Sie Datenbank-Caches und setzen Sie Tabellen auf schreibgeschützt
Leeren Sie als Vorbereitung für die Erstellung eines Snapshots der Datenbanken alle Tabellen und setzen Sie sie auf READ LOCK . Dies sollte schnell erfolgen, außerhalb der Spitzenzeiten oder während einer Systemwartungsperiode.
Auf dem Master:
FLUSH TABLES WITH READ LOCK;
Nachdem die Tabellen nun gesperrt sind, prüfen Sie den Master-Status:
MASTERSTATUS ANZEIGEN;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
Ihre Informationen werden anders sein, aber notieren Sie sich die Werte von Datei und Position . Sie verwenden diese Informationen in Schritt 7.
Verlassen Sie den MariaDB-Client:
\q
5. Snapshot-Datenbanken für den Slave-Host
Erstellen Sie ein Archiv der Datenbank oder der Datenbanken, die auf dem Master vorhanden sind, den Sie replizieren möchten. Jede dieser Datenbanken hat ihr eigenes Verzeichnis in /var/lib/mysql . In diesem Beispiel werden wir tarieren Erstellen Sie eine einzelne Datenbank, die sich im Pfad /var/lib/mysql/dbname befindet .
Dieser Befehl archiviert eine einzelne Datenbank. Wenn Sie weitere Datenbanken archivieren, hängen Sie deren vollständige Pfadnamen an den Befehl an, z. /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Jetzt als normaler Benutzer username , übertragen Sie diese Datei auf ein normales Benutzerkonto auf dem Slave-Host:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
oder mit scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Dann SSH zum Slave-Host:
ssh [username]@slavehost
Stoppen Sie als root mysqld auf dem Slave:
service mysql stop
...und das Archiv extrahieren:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6. Server-IDs für Master und Slave konfigurieren
Ändern Sie /etc/mysql/my.cnf auf dem Master den Eintrag server-id=n hinzufügen im [mysqld] Gruppe, wobei n ist eine eindeutige Ganzzahl, die den Server identifiziert. Üblicherweise n =1 für den Masterserver, aber n kann eine beliebige eindeutige Ganzzahl im Bereich [1 sein , 2^32-1 ]. Wir werden unseren Master auf server-id=1 setzen , und unser Slave zu server-id=100 .
(Falls my.cnf auf dem Slave nicht existiert, erstellen Sie es. Falls vorhanden, suchen Sie nach einer vorhandenen Server-ID Eintrag und kommentieren/bearbeiten Sie diese Zeile).
In /etc/mysql/my.cnf auf dem Master-Host:
[mysqld]
server-id=1
In /etc/mysql/my.cnf auf dem Slave-Host:
[mysqld]
server-id=100
7. Tabellen entsperren und mysqld auf Master und Slave starten/neu starten
Entsperren Sie auf dem Master-Server im MariaDB-Client als Datenbankstamm die Tabellen:
mysql -u root -p
UNLOCK TABLES;
\q
Starten Sie mysqld auf dem Master neu:
service mysql restart
Und starten Sie es auf dem Slave:
service mysql start
Sie können überprüfen, ob die neue Server-ID -Wert wurde auf jedem Host wirksam. Als root:
mysqld --verbose --help | grep server-id
8. Konfigurieren Sie die Identität des Masters auf dem Slave
Konfigurieren Sie auf dem Slave die Identität des Master-Servers. Geben Sie den MariaDB-Client ein:
mysql -u root -p
Führen Sie den folgenden Befehl aus und ersetzen Sie die Werte von MASTER_LOG_FILE und MASTER_LOG_POS mit der Binärlog Datei und Position die Sie in Schritt 4 aufgezeichnet haben, und die Werte von MASTER_HOST ,MASTER_USER und MASTER_PASSWORD mit Ihren eigenen Werten.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;
9. Slave aktivieren
Auf dem Slave, im MariaDB-Client als Datenbank-Root:
START SLAVE;
Sie können jetzt den Status des Slaves überprüfen:
SHOW SLAVE STATUS \G;
*************************** 1. row ***************************pre> pre>
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
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: 1330
Relay_Log_Space: 2204
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
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Wenn bei den Replikationsvorgängen Fehler auftreten, werden diese hier aufgelistet.
10. Nehmen Sie Änderungen auf dem Master vor und überprüfen Sie die Replikation auf dem Slave
Sie können überprüfen, ob die Replikation stattfindet, indem Sie eine neue Datenbank auf dem Master erstellen und die Änderungen auf dem Slave anzeigen.
mysql -u root -p
Erstellen Sie eine neue Datenbank:
CREATE DATABASE repltest;
USE repltest
Erstellen Sie eine Tabelle und fügen Sie einen Wert ein:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
Geben Sie nun den MariaDB-Client auf dem Slave ein:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11. Vorgang für weitere Slaves wiederholen
Diesen Vorgang können Sie für jeden weiteren Slave wiederholen. Führen Sie insbesondere diese Schritte aus:
11 (ein ). Auf dem Master, im MariaDB-Client als Datenbank-Root, Flush- und Lock-Tabellen:
FLUSH TABLES WITH READ LOCK;
Nach dem Sperren Masterstatus anzeigen:
SHOW MASTER STATUS;
Notieren Sie sich die Datei und Position Werte.
11 (b ). Auf dem Master als root:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11 (c ). Auf dem Master als normaler Benutzer:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11 (d ). Auf dem Slave als root:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11 (e ). In /etc/mysql/my.cnf Fügen Sie auf dem Slave-Host die server-id= hinzu oder bearbeiten Sie sie Zeile in [mysqld] group, wobei der Wert von server-id ist neu und einzigartig:
[mysqld]
server-id=200
11 (f ). Entsperren Sie auf dem Master im MariaDB-Client als Datenbankstamm die Tabellen:
UNLOCK TABLES;
11 (g ). Starten Sie auf dem Master als root mysqld neu:
service mysql restart
11 (h ). Starten Sie auf dem Slave als root mysqld:
service mysql start
11 (ich ). Konfigurieren Sie auf dem Slave im MariaDB-Client als Datenbankstamm die Master-Identität und den Dateinamen und die Position des Binärprotokolls aus Schritt 10(a):
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11 (j ). Aktivieren Sie auf dem Slave im MariaDB-Client als Datenbank-Root die Replikation:
START SLAVE;
12. Fehlerbehebung:Slave kann sich nicht mit Master verbinden
Überprüfen Sie /var/mysql/my.cnf auf dem Master für eine Bind-Adresse Eintrag. Wenn Bindeadresse ist auf 127.0.0.1 eingestellt , akzeptiert der Server nur Verbindungen von localhost. Kommentieren Sie diese Zeile aus oder setzen Sie den Wert auf * um Verbindungen von allen IPv4- und IPv6-Adressen zuzulassen. Wenn Sie my.cnf ändern , vergessen Sie nicht, mysqld neu zu starten.
Wenn die Verbindungen immer noch nicht funktionieren, vergewissern Sie sich, dass Ihr Server Verbindungen auf Port 3306 zulässt . Listen Sie auf dem Master die Kernel-Firewall-Tabellen auf:
iptables -L
Sie können mit dem folgenden Befehl eine Erlaubnis für Verbindungen auf Port 3306 erstellen, indem Sie eth0 durch Ihren Netzwerkschnittstellen-Gerätenamen ersetzen nach Bedarf:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT