Docker部署MySQL主从复制
一、为什么要部署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
四、编写主从复制的配置文件
因为启动主从容器的时候已经把主从容器中的mysql配置目录与宿主机的目录进行挂载了,所以以下操作可以在宿主的目录中进行配置。
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)
这里的File
和Position
需要记录下来,从机设置的时候需要
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