Maison > Article > base de données > Construction et principe de réplication maître-esclave MySQL basés sur Docker
Tirez d'abord l'image docker, nous utilisons la version 5.7 de mysql ici : docker pull mysql:5.7
Ensuite, utilisez cette image pour démarrer le conteneur, ici vous devez démarrer les conteneurs maître et esclave séparément
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
Le port mappé en externe par le maître est 3339 et le port mappé en externe par l'esclave est 3340. Étant donné que les conteneurs Docker sont indépendants les uns des autres, chaque conteneur possède sa propre adresse IP indépendante. Il n'y aura donc aucun conflit entre différents conteneurs utilisant le même port. Ici, nous devrions essayer d'utiliser le port 3306 par défaut de MySQL, sinon il pourrait y avoir un problème d'impossibilité de se connecter à MySQL dans le conteneur Docker via IP.
Utilisez la commande docker ps
pour afficher le conteneur en cours d'exécution :
À ce stade, vous pouvez utiliser des outils tels que Navicat pour tester la connexion à MySQL
Entrez dans le conteneur Master via la commande docker exec -it 5ddad8c2f368 /bin/bash
, ou vous pouvez entrer via la commande docker exec -it mysql-master /bin/bash
. 5ddad8c2f368 est l'identifiant du conteneur et mysql-master est le nom du conteneur. cd /etc/mysql/mysql.conf.d
Basculez vers le répertoire /etc/mysql/mysql.conf.d, puis vim mysqld.cnf
éditez my.cnf. À ce moment-là, bash: vim: command not found
sera signalé et nous devons installer vim nous-mêmes à l'intérieur du conteneur Docker. L'utilisation de la commande apt-get install vim
pour installer vim
entraînera les problèmes suivants :
Exécutez apt-get update
, puis exécutez à nouveau apt-get install vim
pour installer vim avec succès. Ensuite, nous pouvons utiliser vim pour éditer my.cnf et ajouter la configuration suivante à my.cnf :
[mysqld] ## 同一局域网内注意要唯一 server-id=100 ## 开启二进制日志功能,可以随便取(关键) log-bin=mysql-bin
Une fois la configuration terminée, vous devez redémarrer le service mysql pour que la configuration prenne effet. Utilisez service mysql restart
pour terminer le redémarrage. Le redémarrage du service MySQL arrêtera le conteneur Docker, et nous devons également docker start mysql-master
démarrer le conteneur.
Étape suivante, créez un utilisateur de synchronisation de données dans la base de données maître et accordez à l'utilisateur les autorisations slave REPLICATION SLAVE
et REPLICATION CLIENT
pour synchroniser les données entre les bases de données maître et esclave.
Connectez-vous d'abord à la base de données mysql root@5ddad8c2f368:/# mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Accordez au compte de copie
REPLICATION CLIENT
l'autorisation, la copie l'utilisateur peut utiliserSHOW MASTER STATUS, SHOW SLAVE STATUS
etSHOW BINARY LOGS
pour déterminer l'état de la réplication.
Accordez au compte de copieREPLICATION SLAVE
l'autorisation pour que la copie puisse vraiment fonctionner.
est identique à la configuration du maître (maître), ajoutez ce qui suit au fichier de configuration de l'esclave Configuration my.cnf :
[mysqld] ## 设置server_id,注意要唯一 server-id=101 ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log-bin=mysql-slave-bin ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin
Une fois la configuration terminée, vous devez également redémarrer le service mysql et le conteneur docker. L'opération est cohérente avec la configuration principale.
Le journal de relais est similaire au journal binaire à bien des égards. La différence est la suivante : le thread d'E/S du serveur esclave lit le journal binaire du serveur maître et l'enregistre dans le fichier local du serveur esclave, puis le thread SQL lit le contenu du journal du journal de relais et l'applique au serveur esclave. serveur esclave, ce qui permet aux données du serveur esclave et du serveur maître de rester cohérentes.
Entrez mysql dans Maître et exécutez 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负责与主库建立连接。Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!