Heim  >  Artikel  >  Datenbank  >  Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

步履不停
步履不停Original
2019-07-01 16:17:482603Durchsuche

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Warum es auf Basis von Docker erstellen?

  • Begrenzte Ressourcen
  • Das Erstellen einer virtuellen Maschine erfordert eine Maschinenkonfiguration, und die Schritte zur Installation von MySQL sind umständlich
  • Eine Maschine kann mehrere Docker-Container ausführen
  • Docker-Container sind unabhängig voneinander, haben unabhängige IPs und stehen nicht in Konflikt miteinander
  • Die Schritte zur Verwendung von Docker sind einfach und der Container kann in Sekundenschnelle gestartet werden

Verwenden Sie Docker, um einen Master-Slave-Server zu erstellen

Ziehen Sie zuerst das Docker-Image, wir verwenden hier die 5.7-Version von MySQL:
docker pull mysql:5.7
Dann verwenden Sie dieses Image, um den Container hier zu starten Sie müssen die Master- und Slave-Container separat starten

Master (Master):

docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave (Slave)

docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Der vom Master extern zugeordnete Port ist 3339 und der vom Slave extern zugeordnete Port ist 3340. Da Docker-Container unabhängig voneinander sind, verfügt jeder Container über eine eigene unabhängige IP, sodass es nicht zu Konflikten zwischen verschiedenen Containern kommt, die denselben Port verwenden. Hier sollten wir versuchen, den Standardport 3306 von MySQL zu verwenden, da sonst möglicherweise das Problem besteht, dass keine Verbindung zu MySQL im Docker-Container über IP hergestellt werden kann.
Verwenden Sie den Befehl docker ps, um den laufenden Container anzuzeigen:

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Zu diesem Zeitpunkt können Sie Tools wie Navicat verwenden, um die Verbindung zu MySQL zu testen

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Master (Haupt) konfigurieren

Geben Sie den Master-Container über den Befehl docker exec -it 5ddad8c2f368 /bin/bash ein, oder Sie können ihn über den Befehl docker exec -it mysql-master /bin/bash aufrufen. 5ddad8c2f368 ist die ID des Containers und mysql-master ist der Name des Containers.
cd /etc/mysql/mysql.conf.dWechseln Sie in das Verzeichnis /etc/mysql/mysql.conf.d und vim mysqld.cnfbearbeiten Sie dann my.cnf. Zu diesem Zeitpunkt wird bash: vim: command not found gemeldet und wir müssen vim selbst im Docker-Container installieren. Die Verwendung des Befehls apt-get install vim zum Installieren von vim
führt zu folgenden Problemen:

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Führen Sie apt-get update aus und führen Sie dann apt-get install vim erneut aus, um vim erfolgreich zu installieren. Dann können wir vim verwenden, um my.cnf zu bearbeiten und die folgende Konfiguration zu my.cnf hinzuzufügen:

[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

Nachdem die Konfiguration abgeschlossen ist, müssen Sie den MySQL-Dienst neu starten, damit die Konfiguration wirksam wird. Verwenden Sie service mysql restart, um den Neustart abzuschließen. Durch einen Neustart des MySQL-Dienstes wird der Docker-Container gestoppt, und wir müssen auch docker start mysql-master den Container starten.
Erstellen Sie im nächsten Schritt einen Datensynchronisierungsbenutzer in der Master-Datenbank und erteilen Sie dem Benutzer slave REPLICATION SLAVE Berechtigungen und REPLICATION CLIENT Berechtigungen zum Synchronisieren von Daten zwischen der Master- und der Slave-Datenbank.
Stellen Sie zunächst eine Verbindung zur MySQL-Datenbank her
root@5ddad8c2f368:/# mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

Gewähren Sie dem Kopierkonto REPLICATION CLIENT die Berechtigung zum Kopieren Der Benutzer kann SHOW MASTER STATUS, SHOW SLAVE STATUS und SHOW BINARY LOGS verwenden, um den Replikationsstatus zu ermitteln.
Erteilen Sie dem Kopierkonto REPLICATION SLAVE die Berechtigung, damit das Kopieren wirklich funktionieren kann.

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Das Konfigurieren von Slave (Slave)

ist dasselbe wie das Konfigurieren von Master (Master). Fügen Sie der Slave-Konfigurationsdatei Folgendes hinzu my.cnf-Konfiguration:

[mysqld]  
## 设置server_id,注意要唯一  server-id=101 
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用  
log-bin=mysql-slave-bin 
## relay_log配置中继日志  
relay_log=edu-mysql-relay-bin

Nachdem die Konfiguration abgeschlossen ist, müssen Sie auch den MySQL-Dienst und den Docker-Container neu starten. Der Vorgang stimmt mit dem Konfigurationsmaster überein.

Relay-Protokoll ähnelt in vielerlei Hinsicht dem Binärprotokoll. Der Unterschied besteht darin: Der E/A-Thread des Slave-Servers liest das Binärprotokoll des Master-Servers und zeichnet es in der lokalen Datei des Slave-Servers auf, und dann liest der SQL-Thread den Inhalt des Relay-Log-Protokolls und wendet ihn auf das an Slave-Server, wodurch die Daten des Slave-Servers und des Master-Servers konsistent bleiben.

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Master (Master) und Slave (Slave) verknüpfen

MySQL in Master eingeben und ausführen show master status;
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
在Slave 中进入 mysql,执行

CHANGE MASTER TO master_host = '172.17.0.2',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mysql-bin.000001',
master_log_pos = 617,
master_connect_retry = 30;

命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip

Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从复制排错:
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

  • 网络不通
    检查ip,端口
  • 密码不对
    检查是否创建用于同步的用户和用户密码是否正确
  • pos不对
    检查Master的 Position

测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
Master:
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

Slave:
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

完整的主备流程图

最后让我们来看一下,一个 update 语句在节点 A 执行,然后同步到节点 B的完整流程图。
Aufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker

可以看到:主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写入binlog。
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。
一个事务日志同步的完整过程是这样的:

  • 1、在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码、以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。
  • 2、在备库B上执行start slave命令,这时侯备库会启动两个线程,io_thread 和 sql_thread。其中, io_thread负责与主库建立连接。
  • 3、主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。
  • 4、备库B拿到binlog后,写到本地文件,称为中转日志(relay log)。
  • 5、sql_thread读取中转日志,解析日志里的命令,并执行。

Das obige ist der detaillierte Inhalt vonAufbau und Prinzip der MySQL-Master-Slave-Replikation basierend auf Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:datetime-DatentypNächster Artikel:datetime-Datentyp