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
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
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:
Zu diesem Zeitpunkt können Sie Tools wie Navicat verwenden, um die Verbindung zu MySQL zu testen
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.d
Wechseln Sie in das Verzeichnis /etc/mysql/mysql.conf.d und vim mysqld.cnf
bearbeiten 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:
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 kannSHOW MASTER STATUS, SHOW SLAVE STATUS
undSHOW BINARY LOGS
verwenden, um den Replikationsstatus zu ermitteln.
Erteilen Sie dem KopierkontoREPLICATION SLAVE
die Berechtigung, damit das Kopieren wirklich funktionieren kann.
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.
MySQL in Master eingeben und ausführen show master status;
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
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;
用于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;
。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从复制排错:
使用start slave
开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
Master:
Slave:
最后让我们来看一下,一个 update 语句在节点 A 执行,然后同步到节点 B的完整流程图。
可以看到:主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写入binlog。
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。
一个事务日志同步的完整过程是这样的:
change master
命令,设置主库A的IP、端口、用户名、密码、以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。start slave
命令,这时侯备库会启动两个线程,io_thread 和 sql_thread。其中, io_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!