Maison  >  Article  >  base de données  >  Construction et principe de réplication maître-esclave MySQL basés sur Docker

Construction et principe de réplication maître-esclave MySQL basés sur Docker

步履不停
步履不停original
2019-07-01 16:17:482620parcourir

Construction et principe de réplication maître-esclave MySQL basés sur Docker

Pourquoi le construire basé sur Docker ?

  • Ressources limitées
  • La création d'une machine virtuelle nécessite une configuration de la machine, et les étapes d'installation de MySQL sont fastidieuses
  • Une machine peut exécuter plusieurs conteneurs Docker
  • Les conteneurs Docker sont indépendants les uns des autres, ont des adresses IP indépendantes et n'entrent pas en conflit les uns avec les autres
  • Les étapes d'utilisation de Docker sont simples et le conteneur peut être démarré en quelques secondes

Utilisez Docker pour construire un serveur maître-esclave

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

Maître (Maître) :

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

Esclave (Esclave)

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 :

Construction et principe de réplication maître-esclave MySQL basés sur Docker

À ce stade, vous pouvez utiliser des outils tels que Navicat pour tester la connexion à MySQL

Construction et principe de réplication maître-esclave MySQL basés sur Docker

Configurer Master (principal)

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.dBasculez 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 :

Construction et principe de réplication maître-esclave MySQL basés sur Docker

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 utiliser SHOW MASTER STATUS, SHOW SLAVE STATUS et SHOW BINARY LOGS pour déterminer l'état de la réplication.
Accordez au compte de copie REPLICATION SLAVE l'autorisation pour que la copie puisse vraiment fonctionner.

Construction et principe de réplication maître-esclave MySQL basés sur Docker

Configurer l'esclave (esclave)

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.

Construction et principe de réplication maître-esclave MySQL basés sur Docker

Lier Maître (maître) et Esclave (esclave)

Entrez mysql dans Maître et exécutez show master status;
Construction et principe de réplication maître-esclave MySQL basés sur 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

Construction et principe de réplication maître-esclave MySQL basés sur 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;用于查看主从同步状态。
Construction et principe de réplication maître-esclave MySQL basés sur Docker

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;
Construction et principe de réplication maître-esclave MySQL basés sur Docker

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从复制排错:
Construction et principe de réplication maître-esclave MySQL basés sur Docker

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

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

测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
Master:
Construction et principe de réplication maître-esclave MySQL basés sur Docker

Slave:
Construction et principe de réplication maître-esclave MySQL basés sur Docker

完整的主备流程图

最后让我们来看一下,一个 update 语句在节点 A 执行,然后同步到节点 B的完整流程图。
Construction et principe de réplication maître-esclave MySQL basés sur 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读取中转日志,解析日志里的命令,并执行。

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:type de données date/heureArticle suivant:type de données date/heure