So implementieren Sie eine MySQL-Master-Slave-Replikation basierend auf Docker

So implementieren Sie eine MySQL-Master-Slave-Replikation basierend auf Docker

Vorwort

Die MySQL Master-Slave-Replikation ist die Grundlage für die Erzielung einer hohen Leistung und Verfügbarkeit von Anwendungen. Bei Anwendungen mit intensiven Datenbank-Lesevorgängen kann der Datenbankdruck durch die Lastverteilung der Datenbankanforderungen auf verschiedene MySQL-Server effektiv reduziert werden. Wenn in MySQL ein einzelner Punktfehler auftritt, kann innerhalb kurzer Zeit ein Failover durchgeführt werden. Dieser Artikel erläutert die integrierte Replikationsfunktion von MySQL.

Version

  • MySQl: 5.7.17
  • CentOS: 7.4.1708
  • Docker: 1.13.1

Überblick

MySQL-Replikationsdatenprozess:

  1. Bevor die Masterdatenbank nach einer Datenaktualisierung eine Transaktion festschreibt, zeichnet sie das Ereignis asynchron in der binären Protokolldatei binlog auf. Nachdem der Protokolldatensatz abgeschlossen ist, schreibt die Speicher-Engine die Transaktion fest.
  2. Der Slave startet einen E/A-Thread, um eine Verbindung mit dem Master herzustellen und die Aktualisierung des Binärprotokolls im Master anzufordern. Zu diesem Zeitpunkt ist der von der Hauptbibliothek erstellte Binärprotokoll-Dump-Thread ein Binärprotokoll-Dump-Thread. Wenn ein neues Aktualisierungsereignis vorliegt, wird der E/A-Thread benachrichtigt. Wenn der Thread das Dumping des Binärprotokolls abgeschlossen hat und kein neues Protokoll vorliegt, wechselt der Thread in den Ruhezustand.
  3. Nachdem Sie das neue Ereignisprotokoll vom E/A-Thread der Bibliothek erhalten haben, speichern Sie es in seinem eigenen Relay-Protokoll.
  4. Der Slave-SQL-Thread liest Ereignisse aus dem Relay-Protokoll, führt Aktualisierungen durch und speichert sie.

Konfigurieren Sie die Master-Slave-Bibliothek

Hauptbibliothek my.cnf-Konfiguration

Aktivieren Sie die binäre Protokollierung in der my.cnf-Datei der Masterdatenbank und legen Sie die Service-ID fest.

log-bin = mysql-bin
Server-ID = 1

Beachten Sie, dass die Server-ID eine eindeutige Nummer sein muss, zwischen Master und Slave unterschiedlich sein muss und für die Master- und Slave-Datenbanken festgelegt werden muss.

Konfigurieren aus der Bibliothek my.cnf

log-bin = mysql-bin
Server-ID = 2
log-slave-updates = 1
schreibgeschützt = 1

Die Slave-Bibliothek öffnet außerdem log-bin und setzt log-slave-updates, um die Relay-Protokolle in ihrem eigenen Binärprotokoll aufzuzeichnen, wenn die Slave-Bibliothek sie wiedergibt. Dadurch kann die Slave-Bibliothek als Master-Bibliothek für andere Server dienen und die Binärprotokolle an andere Slave-Bibliotheken weiterleiten. Diese Lösung kann bei einer Ein-Master-Mehrere-Slave-Lösung in Betracht gezogen werden.

Dockerfile erstellt MySQL-Image

Erstellen Sie die erforderlichen Dateien

Hier werden die Master- und Slave-Dateien separat gespeichert und nicht gemeinsam genutzt. Erstellen Sie zuerst den Ordner /usr/local/mysql, erstellen Sie dann zwei Verzeichnisse, Master und Slave, im Verzeichnis und erstellen Sie dann für jedes einen Datenordner.

  • Das Datenverzeichnis wird zum Speichern von Datendateien verwendet
  • Dockerfile speichert den Dockerfile-Inhalt
  • init.sql SQL zum Initialisieren der Datenbank
  • my.cnf Datenbankkonfigurationsdatei, die Konfigurationsmethode wurde oben erwähnt
  • start.sh Dockerfile-Skript zum Erstellen von MySQL

Dockerfile-Inhalt

# Erstellen Sie ein neues Bild mit dem MySQL-Bild FROM mysql:5.7.17

ENV MYSQL_ROOT_PASSWORD ytao

KOPIEREN Sie start.sh /mysql/start.sh
KOPIEREN Sie my.cnf /etc/mysql/my.cnf 
KOPIEREN Sie init.sql /mysql/init.sql

EXPOSE 3306
CMD ["sh", "/mysql/start.sh"]

Master und Slave werden hierbei auf Basis desselben Images erstellt und auch die verwendete Speicher-Engine und weitere Komponenten sollten identisch sein, da es sonst beim Replikationsprozess zu Ausnahmen kommen kann.

init.sql initialisiert Daten

- Erstellen Sie eine data_copy-Datenbank. DROP DATABASE, WENN „data_copy“ EXISTIERT;
DATENBANK ERSTELLEN `data_copy` /*!40100 STANDARDZEICHENSATZ utf8mb4 sortieren utf8mb4_general_ci */;

-- Personentabelle erstellen. VERWENDEN SIE „data_copy“.
Tabelle löschen, wenn `Person` vorhanden ist;
CREATE TABLE `Person` (
 `id` int(32) NICHT NULL,
 `name` varchar(255) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;

Erstellen Sie die data_copy-Datenbank und die person-Tabelle.

start.sh-Skript

#!/bin/sh
echo 'MySQL starten'
Dienst MySQL starten
Schlaf 5

echo 'Datenbank initialisieren'
mysql -uroot -pytao < /mysql/init.sql
echo 'Initialisierung abgeschlossen! '
tail -f /dev/null

Erstellen Sie die Master- und Slave-Images und führen Sie die Container aus

Erstellen des Masterimages

docker build -t master/mysql.

Slave-Image erstellen

Docker-Build -t Slave/MySQL.

Wenn der Build erfolgreich ist, wird Successfuly zurückgegeben, oder Sie können das Image über den Befehl docker images anzeigen.

Führen Sie den Container mit dem soeben erstellten Image aus

# Master-Container Docker ausführen --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql

# Slave-Container Docker ausführen --name Slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d Slave/mysql

Geben Sie den Master-Port als 3306 und den Slave-Port als 3307 an und mounten Sie das Datenverzeichnis als das Verzeichnis, in dem die Daten gespeichert sind.

Überprüfen Sie nach dem Herstellen der Verbindung zur Datenbank, ob die Datenbank erfolgreich initialisiert wurde

Überprüfen Sie, ob Log-Bin aktiviert ist

Erstellen eines Replikationskontos

Wie bereits erwähnt, muss der Slave-E/A-Thread eine Verbindung mit dem Master herstellen, sodass zur Überprüfung ein Konto erforderlich ist. Zusätzlich zur Verbindungsberechtigung (REPLICATION CLIENT) muss das Konto auch über die Replikationsberechtigung (REPLICATION SLAVE) verfügen.

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* AN muser@'%' IDENTIFIZIERT DURCH 'ytao';

Die hier eingestellte Zugangsadresse ist offen. Aus Sicherheitsgründen müssen Sie bei der tatsächlichen Nutzung die Zugangsadresse angeben.

Beginnen Sie mit dem Kopieren aus dem Repository

Verbinden Sie die Slave-Datenbank mit der Master-Datenbank, rufen Sie das Binärprotokoll ab und spielen Sie es erneut ab. Hier müssen wir zunächst den oben erstellten Account für die Verbindung konfigurieren und mit dem Befehl die entsprechenden Einstellungen vornehmen.

ÄNDERN SIE MASTER IN 
MASTER_HOST = '47.107.xx.xxx',
MASTER_PORT = 3306,
MASTER_USER = 'muser',
MASTER_PASSWORD = "ytao",
MASTER_LOG_FILE = "mysql-bin.000006";

Zu diesem Zeitpunkt wurde der Kopiervorgang noch nicht gestartet, Sie müssen ihn also erneut aus der Bibliothek starten

SLAVE STARTEN;

Verwenden Sie SHOW SLAVE STATUS\G; um den Status nach dem Start anzuzeigen

Die oben mit „Slave_IO_Running: Yes“ und „Slave_SQL_Running: Yes“ gekennzeichneten Ausgabeinformationen zeigen an, dass der I/O-Thread und der SQL-Thread gestartet wurden und ausgeführt werden.

Testen der Synchronisationsdaten

Wenn Daten in der Masterdatenbank hinzugefügt, aktualisiert oder gelöscht werden, sollte die Slavedatenbank auch entsprechende Datenänderungen an der Masterdatenbank vornehmen.

Fügen Sie der Hauptdatenbank Daten hinzu

INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');

Fragen Sie die Slave-Datenbankdaten ab, die Daten wurden synchronisiert.

Zusammenfassen

Das Obige ist die einfachste und grundlegendste Konfiguration. Wenn Sie jedoch den obigen Konfigurationsprozess verstehen, können Sie verschiedene Lösungen entsprechend Ihrer eigenen Situation anpassen, einen Master und mehrere Slaves, Master-Master-Replikation (Aktiv-Aktiv- oder Aktiv-Passiv-Modus) usw. implementieren, um Ihren eigenen Anforderungen gerecht zu werden.

Obwohl die MySQL-Replikation einfach und bequem zu verwenden ist, bringt sie auch einige Probleme mit sich, die wir während der Verwendung lösen müssen, z. B.: Unfähigkeit zur Wiederherstellung nach einem abnormalen Server-Shutdown, Verzögerungen bei der Datensynchronisierung usw. Glücklicherweise wurden die meisten der inzwischen aufgetretenen Probleme in der Branche entsprechend gelöst. Wer sich für diesen Aspekt interessiert, kann sich über die Middleware-Implementierungslösungen informieren, die diese Probleme derzeit lösen.

Das ist alles für diesen Artikel. Ich hoffe, dass der Inhalt dieses Artikels für Ihr Studium oder Ihre Arbeit von gewissem Referenzwert ist. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Implementierungsschritte zum Erstellen einer MySQL Master-Slave-Replikationsumgebung basierend auf Docker
  • Detaillierte Erläuterung der Docker-Methode zur Implementierung der MySql-Master-Slave-Replikation (praktischer Teil)
  • Detaillierte Erläuterung zur Verwendung von Docker zum schnellen Erstellen einer MySQL-Master-Slave-Replikationsumgebung
  • Verwenden von Docker-Containern zum Erstellen einer MySql-Master-Slave-Replikation
  • Tutorial zum Erstellen einer Master-Slave-Replikationsarchitektur für MySQL 5.7 Docker
  • Beispielcode zur Implementierung der MySQL-Master-Slave-Replikation in Docker

<<:  So verwenden Sie JavaScript, um mehrere gängige Browser über userAgent zu bestimmen

>>:  MySQL implementiert eine Lösung ähnlich der Oracle-Sequenz

Artikel empfehlen

Zusammenfassung von über 50 Hilfsfunktionen in JavaScript

JavaScript kann viele tolle Dinge. Dieser Artikel...

So migrieren Sie SQLite zu einem MySQL-Skript

Ohne weitere Umschweife werde ich den Code direkt...

Schritte zur Überprüfung der MySQL InnoDB-Row_ID-Grenzwertüberschreitung

Hintergrund Ich habe mit meinen Klassenkameraden ...

Grafisches Tutorial zur MySQL 5.7-Konfiguration ohne Installation

Mysql ist eine beliebte und einfach zu bedienende...

Mehrere Methoden zur Lösung des Problems des MySQL-Fuzzy-Abfrageindexfehlers

Wenn wir das Platzhalterzeichen „like %“ verwende...

Eine vollständige Anleitung zu CSS-Stilattributen css() und width() in jQuery

Inhaltsverzeichnis 1. Grundlegende Verwendung von...

Detaillierte Erklärung der CSS-Hintergrund- und Rahmen-Tag-Beispiele

1. CSS-Hintergrund-Tag 1. Stellen Sie die Hinterg...

So verwenden Sie griechische Buchstaben in HTML-Seiten

Griechische Buchstaben sind eine sehr häufig verw...

Auswahl der MySQL-Tabellentyp-Speicher-Engine

Inhaltsverzeichnis 1. Zeigen Sie die Speicher-Eng...

So erzielen Sie mit CSS einen Daten-Hotspot-Effekt

Die Wirkung ist wie folgt: analysieren 1. Hier se...

Zusammenfassung zur Anwendung dekorativer Elemente im Webdesign

<br />Vorwort: Bevor Sie dieses Tutorial les...

So konfigurieren Sie den Whitelist-Zugriff in MySQL

Schritte zum Konfigurieren des Whitelist-Zugriffs...