Detaillierte Erläuterung des Prinzips und der Praxis der MySQL-Master-Slave-Replikation

Detaillierte Erläuterung des Prinzips und der Praxis der MySQL-Master-Slave-Replikation

Dieser Artikel veranschaulicht anhand von Beispielen die Prinzipien und Praktiken der MySQL Master-Slave-Replikation. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Einführung

Die MySQL Master-Slave-Replikation wird auch Replikation und AB-Replikation genannt. Es sind mindestens zwei MySQL-Server erforderlich (sie können sich auf derselben oder auf verschiedenen Maschinen befinden).

Beispielsweise ist Server A der Masterserver und Server B der Slaveserver. Daten werden auf Server A aktualisiert und über Binärprotokolldatensätze mit Server B synchronisiert. Die synchronisierten Binärprotokolldaten werden dann erneut ausgeführt, um Datenkonsistenz auf beiden Servern zu erreichen.

Das Master-Slave-Replikationsschema der MySQL-Datenbank ähnelt der Replikation auf Dateiebene mit Befehlen wie scp/rsync, bei der es sich um die Remote-Übertragung von Daten handelt.

Die Master-Slave-Replikation von MySQL ist jedoch eine integrierte Funktion, für die keine Tools von Drittanbietern erforderlich sind. Darüber hinaus kopiert die Master-Slave-Replikation von MySQL die Dateien auf der Datenbankfestplatte nicht direkt, sondern kopiert das logische Binlog-Protokoll zur Synchronisierung auf den lokalen Server. Anschließend liest der lokale Thread die SQL-Anweisungen im Protokoll und wendet sie erneut auf die MySQL-Datenbank an.

Wirkung

1. Notfallwiederherstellung und Failover in Echtzeit;

2. Trennung von Lesen und Schreiben, Bereitstellung von Abfragediensten und Erreichen eines Lastenausgleichs;

3. Hot-Backup von Daten, um Geschäftsbeeinträchtigungen zu vermeiden.

Prinzip

1. Der MySQL-Dienst des Masterservers zeichnet alle Schreibvorgänge im Binlog-Protokoll auf, generiert einen Protokoll-Dump-Thread und übergibt das Binlog-Protokoll an den E/A-Thread des MySQL-Dienstes des Slaveservers.

2. Generieren Sie zwei Threads aus dem MySQL-Dienst des Servers, einen ist der E/A-Thread und den anderen ist der SQL-Thread.

3. Der Slave-E/A-Thread fordert das Binlog-Protokoll des Masters an und schreibt die Dateien im Binlog-Protokoll in das Relaylog.

4. Der SQL-Thread der Slave-Datenbank liest den Inhalt des Relaylogs und zerlegt ihn in bestimmte Vorgänge, um Konsistenz zwischen den Vorgängen des Masters und des Slaves zu erreichen und letztendlich Datenkonsistenz zwischen den beiden Datenbanken zu erreichen.

Notiz:
- Master-Slave-Replikation ist eine asynchrone und logische Replikation auf SQL-Anweisungsebene;
– Während der Replikation verfügt der Master über einen E/A-Thread und der Slave über zwei Threads, den E/A- und den SQL-Thread.
– Die notwendige Voraussetzung für die Implementierung der Master-Slave-Replikation ist, dass die Masterdatenbank die Binlog-Funktion aktivieren muss.
- Die Server-ID aller als Replikation verwendeten MySQL-Knoten kann nicht dieselbe sein;
- Die Binärlogdatei zeichnet nur SQL-Anweisungen auf, die den Dateninhalt ändern, und zeichnet keine Abfrageanweisungen auf.

bilden

Ein Master und ein Slave

Master-Master-Replikation

Ein Herr, viele Sklaven

Mehrere Master und ein Slave (unterstützt ab 5.7)

Kaskadierende Replikation

üben

brauchen

Implementieren Sie einen Master-Slave-Replikationsmodus, zwei MySQL-Instanzen auf demselben Host

Umfeld

Mac: 10.15.1
Docker: 2.0.0.3 // Die Verwendung von Docker zur Installation von MySQL dient hauptsächlich der einfachen Verwaltung und Wartung, der unabhängigen IP und dem sekundenschnellen Start MySQL-Master: 5.7.29 // Hauptserver MySQL-Master-IP: 172.17.0.3
MySQL-Slave: 5.7.29 // MySQL-Slave-IP vom Server: 172.17.0.4

Schritt

Schritt 1: Zwei MySQL-Server vorbereiten
mysql-master (Masterserver):
1. Erstellen Sie die Verzeichnisstruktur:
Master/Conf, Master/Daten, Master/Protokolle
2. Starten Sie den laufenden Instanzcontainer:
docker run --name mysql-master
> -p 3310:3306
> -v ~/docker/master/conf:/etc/mysql/conf.d
> -v ~/docker/master/data:/var/lib/mysql
> -v ~/docker/master/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. Geben Sie den Container docker exec -it mysql-master bash ein
4. Melden Sie sich bei MySQL an
mysql -uroot -p
mysql-slave (Slave-Server):
1. Erstellen Sie die Verzeichnisstruktur:
Slave/Conf, Slave/Daten, Slave/Protokolle
2. Starten Sie den laufenden Instanzcontainer:
docker run --name mysql-slave
> -p 3310:3306
> -v ~/docker/slave/conf:/etc/mysql/conf.d
> -v ~/docker/slave/data:/var/lib/mysql
> -v ~/docker/slave/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. Geben Sie den Container docker exec -it mysql-slave bash ein
4. Melden Sie sich bei MySQL an
mysql -uroot -p
Schritt 2: Ändern der Konfigurationsdatei (my.cnf)
Primärer Server:

[mysqld]
Port = 3306
Server-ID = 1
#Zu synchronisierende Datenbank binlog-do-db = Schule
#Um binäre Protokolldateien zu generieren, muss der Masterserver log-bin = mysql-bin aktivieren

MySQL neu starten: docker restart mysql-master
Vom Server:

[mysqld]
Port = 3306
Server-ID = 2
#Zu synchronisierende Datenbank binlog-do-db = Schule
#Um binäre Logdateien zu erzeugen (optional vom Server)
log-bin = mysql-bin

MySQL neu starten: docker restart mysql-slave
Schritt 3: Erstellen eines Masterserver-Replikationsbenutzers und der zugehörigen Berechtigungen
Benutzer „Slave“@„%“ erstellen, identifiziert durch „123456“; //Benutzerberechtigung für Replikations-Slave erstellen, Replikationsclient auf *.* auf „Slave“@„%“; //Benutzerberechtigungen festlegen, Berechtigungen leeren; //Berechtigungen aktualisieren, Berechtigungen für „Slave“@„%“ anzeigen; //Benutzerberechtigungen anzeigen
Schritt 4: Datensicherung und Synchronisation
1. Melden Sie sich beim Master an und führen Sie den Sperrtabellenvorgang mysql -uroot -p aus
FLUSH-TABELLEN MIT LESE-SPERRE;
2. Dumpen Sie die Daten der Datenbank, die im Master synchronisiert werden muss: mysqldump -uroot -p school > school.dump
3. Daten in den Slave importieren
mysql -uroot -h172.17.0.4 -p Schule < Schule.dump
4. Entsperren Sie den Master
TABELLEN ENTSPERREN;
Schritt 5: Replikationsstatus des Masterservers
1. Erstellen Sie eine neue Datentabelle und fügen Sie Daten hinzu. create table user( id int(10) auto_increment, name varchar(30), primary key (id) )charset=utf8mb4;
in Benutzer(name)-Werte einfügen (222);
2. Binärprotokoll des Masterservers zeichnet den Status mysql auf > Masterstatus anzeigen;
+------------------+----------+--------------+------------------+-------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 769 | Schule | | |
+------------------+----------+--------------+------------------+-------------------+

Schritt 6: Kopieren vom Server starten
1. Verbinden Sie sich mit dem Master-Server und legen Sie den Startknoten für die Replikation fest mysql> ändern Sie master in master_host='172.17.0.3',
-> Master-Port = 3306,
-> Master-Benutzer = "Sklave",
-> Master-Passwort = '123456',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=769;
2. Replikation starten, Slave starten;
3. Überprüfen Sie den Replikationsstatus mysql> show slave status \G
*************************** 1. Reihe ***************************
Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet
Master_Host: 172.17.0.3
Master_User: Sklave
Master_Port: 3306
Verbindungswiederholung: 60
Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos: 961
Relay_Log_File: 87dc5224655d-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Ja //Zeigt an, dass der E/A-Thread erfolgreich liest. Slave_SQL_Running: Ja //Zeigt an, dass der SQL-Thread erfolgreich ausgeführt wird. Replicate_Do_DB:
Replikat_Ignorieren_DB:
Tabelle_replizieren:
Tabelle_Ignorieren_replizieren:
Wild_Do_Tabelle replizieren:
Tabelle_Wild_Ignore_replizieren:
Last_Errno: 0
Letzter_Fehler:
Skip_Counter: 0
Exec_Master_Log_Pos: 961
Relay_Log_Space: 892
Until_Condition: Keine
Bis_Log_Datei:
Bis_Log_Pos: 0
Master_SSL_Allowed: Nein
Master_SSL_CA_Datei:
Master_SSL_CA_Pfad:
Master_SSL_Zertifikat:
Master_SSL_Chiffre:
Master_SSL_Schlüssel:
Sekunden_Hinter_Master: 0
Master_SSL_Verify_Server_Cert: Nein
Last_IO_Errno: 0
Letzter_E/A-Fehler:
Last_SQL_Errno: 0
Letzter_SQL_Fehler:
Server-IDs replizieren_ignorieren:
Master_Server_Id: 1
Master_UUID: 45540733-4e0c-11ea-b0ac-0242ac110003
Master_Info_Datei: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave hat alle Relay-Logs gelesen; wartet auf weitere Updates
Master_Retry_Count: 86400
Master_Bind:
Zeitstempel des letzten IO-Fehlers:
Letzter_SQL_Fehler_Zeitstempel:
Master_SSL_Crl:
Master_SSL_Crlpfad:
Abgerufenes_Gtid_Set:
Ausgeführtes_Gtid_Set:
Auto_Position: 0
DB replizieren_neu schreiben:
Kanalname:
Master_TLS_Version:
4. Zeigen Sie die Datentabelle datamysql> show create table user\G an
*************************** 1. Reihe ***************************
Tabelle: Benutzer
Tabelle erstellen: CREATE TABLE `user` (
`id` int(10) NICHT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4

mysql> wähle * vom Benutzer aus;
+----+------+
| Ich würde | Name |
+----+------+
| 1 | 222 |
+----+------+
Mit der Kopiersteuerung verbundene Befehle:
stop salve //Slave-Verbindung stoppen reset slave //Slave-Verbindung zurücksetzen start slave //Slave-Verbindung öffnen stop master //Master-Verbindung stoppen reset master //Master-Verbindung zurücksetzen start master //Master-Verbindung öffnen
Schritt 7: Überprüfen Sie den Prozess der Master- und Slave-Server
MySQL-Master:

MySQL-Slave:

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • Das Implementierungsprinzip der MySQL-Master-Slave-Synchronisation
  • Interpretation der MySQL Master-Slave-Konfiguration und deren prinzipielle Analyse (Master-Slave)
  • Detaillierte Erläuterung der Rolle und des Funktionsprinzips der MySQL-Master-Slave-Replikation
  • MySQL Master-Slave-Prinzip und Konfigurationsdetails
  • Einführung in das MySQL-Master-Slave-Synchronisationsprinzip
  • Analyse des MySQL-Beispiels DTID Master-Slave-Prinzip

<<:  vue3.0 + echarts realisiert dreidimensionales Säulendiagramm

>>:  Zusammenfassung von Beispielen gängiger Methoden von JavaScript-Arrays

Artikel empfehlen

MySQL-Joinpufferprinzip

Inhaltsverzeichnis 1. MySQL-Joinpuffer 2. JoinBuf...

Wissen Sie, wie man Mock in einem Vue-Projekt verwendet?

Inhaltsverzeichnis Erster Schritt: Der zweite Sch...

So lernen Sie algorithmische Komplexität mit JavaScript

Inhaltsverzeichnis Überblick Was ist die O-Notati...

Dockers Mechanismus zur Integritätserkennung

Für Container ist die einfachste Integritätsprüfu...

Zweistündiges Docker-Einführungstutorial

Inhaltsverzeichnis 1.0 Einleitung 2.0 Docker-Inst...

CSS zum Erzielen eines dynamischen Schaltflächeneffekts mit Partikeln

Ursprünglicher Link https://github.com/XboxYan/no...

So optimieren Sie den Logikbeurteilungscode in JavaScript

Vorwort Zu den logischen Urteilsaussagen, die wir...

Detaillierte Erklärung des JS-Speicherplatzes

Inhaltsverzeichnis Überblick 1. Stapeln und Aufhä...

So installieren Sie nginx unter Linux

Nginx wurde in der Programmiersprache C entwickel...

Beispiel für die MySQL-Methode zum Löschen von Daten und Datentabellen

Es ist sehr einfach, Daten und Tabellen in MySQL ...

Die neueste Installations- und Konfigurationsmethode für MySQL-5.7.21

1. Entpacken Sie das heruntergeladene MySQL-Kompr...

Vor- und Nachteile gängiger MySQL-Speicher-Engines

Inhaltsverzeichnis Alle Speicher-Engines anzeigen...