ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Docker部署MySQL主从复制

2022-05-17 09:33:12  阅读:149  来源: 互联网

标签:主从复制 MySQL slave1 172.17 mysql master Docker root docker


一、为什么要部署MySQL的主从复制

关于这方面的理论网上可查询,这里可以参考的链接 https://blog.51cto.com/zkhylt/1773679

二、MySQL主从同步复制原理

https://blog.51cto.com/zkhylt/1773679

三、实验环境的部署

环境:

  • VMware workstation --> centos7 IP:192.168.86.130
  • CentOS7 --> Docker

3.1 拉取镜像

docker pull mysql:5.7

因为我之前拉取过镜像所以有下面的显示

[root@tiger hongwei]# docker pull mysql:5.7
5.7: Pulling from library/mysql
Digest: sha256:16e159331007eccc069822f7b731272043ed572a79a196a05ffa2ea127caaf67
Status: Image is up to date for mysql:5.7
docker.io/library/mysql:5.7

查看镜像

[root@tiger hongwei]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
mysql        5.7       a3d35804fa37   5 days ago   462MB

3.2 启动容器

启动mysql的master容器

docker run -d -p 3310:3306 -v /home/mysql/master/config:/etc/mysql/ -v/home/mysql/master/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql_master mysql:5.7
[root@tiger ~]# docker run -d -p 3310:3306 -v /home/mysql/master/config:/etc/mysql/ -v/home/mysql/master/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql_master mysql:5.7
c7b1ad38770bc62d9d95dbdaaaef9a73173a8f8858a1c2a4fd93ea35f1185e6e

启动mysql的slave容器

docker run -d -p 3311:3306 -v /home/mysql/slave1/config:/etc/mysql/ -v/home/mysql/slave1/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql_slave1 mysql:5.7
[root@tiger ~]# docker run -d -p 3311:3306 -v /home/mysql/slave1/config:/etc/mysql/ -v/home/mysql/slave1/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456  --name mysql_slave1 mysql:5.7
3d0489188d1919e9ef20f3c5dc88cdeda4e4870171ef4bf4ea3d79dd70af5d55

命令解释:

  • -d: 后台运行容器,并返回容器ID
  • -p 3311:3306 :将容器的3306端口映射到宿主机3311端口
  • -e MYSQL_ROOT_PASSWORD=123456 :环境变量配置数据库连接密码
  • -v /home/mysql/slave1/config:/etc/mysql/ :将配置文件夹挂载到宿主机
  • --name mysql_slave1:将容器命名为 mysql_slave1

查看运行的容器

[root@tiger ~]# docker container ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
3d0489188d19   mysql:5.7   "docker-entrypoint.s…"   5 minutes ago   Up 4 minutes   33060/tcp, 0.0.0.0:3311->3306/tcp, :::3311->3306/tcp   mysql_slave1
c7b1ad38770b   mysql:5.7   "docker-entrypoint.s…"   9 minutes ago   Up 9 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql_master

测试mysql_master容器与mysql_slave1容器的网络互连

测试前分别给mysql_master,mysql_salve容器安装ping工具

apt-get update && apt-get install iputils-ping

查看网桥bridge信息

[root@tiger ~]# docker network inspect bridge
...
这里省略了打印的信息,
查看到mysql_master与mysql_slave1是同一网桥,
mysql_master --> "IPv4Address":"172.17.0.2/16"
mysql_slave1 --> "IPv4Address":"172.17.0.3/16"

这里关于docker的网络知识就不详细展开,请另外自行学习!

[root@tiger ~]# docker exec -it mysql_master /bin/bash
root@c7b1ad38770b:/# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.250 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.296 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.238 ms
^C
--- 172.17.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 0.238/0.261/0.296/0.028 ms
[root@tiger ~]# docker exec -it mysql_slave1 /bin/bash
root@3d0489188d19:/# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=3.24 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.375 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.238 ms
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 13ms
rtt min/avg/max/mdev = 0.238/1.285/3.243/1.385 ms

四、编写主从复制的配置文件

4.1 编写mysql_master配置文件

[root@tiger config]# cd /home/mysql/master/config
[root@tiger config]# vim my.cnf

my.cnf的配置如下

[mysqld]
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT

4.2 编写mysql_slave1配置文件

[root@tiger config]# cd /home/mysql/slave1/config
[root@tiger config]# vim my.cnf
[mysqld]
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

4.3 重启容器

[root@tiger config]# docker restart mysql_master mysql_slave1

五、 主从机设置

5.1 主机设置

docker exec -it mysql_master /bin/bash #进入容器
mysql -uroot -p123456 #连接mysql

5.2 在主机上建立账户并授权slave

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 |      438 | testdb       | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)

这里的FilePosition需要记录下来,从机设置的时候需要

Binlog_Do_DB:需要复制的数据库。

Binlog_Ignore_DB:不需要复制的数据库。

注意:此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化

5.4 从机设置

docker exec -it mysql_slave1 /bin/bash
mysql -uroot -p123456
CHANGE MASTER TO MASTER_HOST='192.168.86.130',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3310, 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=438;

如果上面出现的故障执行下面两条命令

stop slave;
reset slave;
然后重新配置CHANGE MASTER......

启动从服务器的复制功能

start slave;

查看从服务器的状态

show slave status\G
这里省略了打印...
主要看到Slave_IO_Running: Yes和Slave_SQL_Running: Yes就代表成功了。

疑难杂症

  • 导致Slave_IO_Running: Connecting问题,可以自行查询百度,谷歌搜索引擎,

我这里的问题是MASTER_HOST填了master容器的IP,这里应该填的是宿主(Centos)的IP,如果是云服务器,那么就是云服务器的IP

  • 导致Slave_SQL_Running: No问题,就是操作了主服务器MySQL新建一个库,导致从服务器的失去一些状态找不到这个库,我这里解决的方法是在主服务器show master status查看Position,然后从服务器执行CHANGE MASTER....MASTER_LOG_POS=具体值回到新建库的时候的指向。

六、测试

在主服务器中新建一个数据库testdb,然后查看从服务器的状态是否也有testdb,接下来在主服务器中新建表和插入几条记录,观察从服务器的状态是否同步,如果从服务器跟主服务器的状态一致,那么就成功了。

参考

https://blog.51cto.com/zkhylt/1773679

https://blog.csdn.net/m0_57711043/article/details/120015999?utm_source=app&app_version=5.3.1

标签:主从复制,MySQL,slave1,172.17,mysql,master,Docker,root,docker
来源: https://www.cnblogs.com/tiger-yam/p/16279548.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有