脚本宝典收集整理的这篇文章主要介绍了Docker部署MySQL主从复制,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
关于这方面的理论网上可查询,这里可以参考的链接 https://blog.51cto.COM/zkhylt/1773679
https://bLOG.51cto.com/zkhylt/1773679
环境:
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
启动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
命令解释:
查看运行的容器
[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_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 statusG
这里省略了打印...
主要看到Slave_IO_Running: Yes和Slave_SQL_Running: Yes就代表成功了。
疑难杂症
我这里的问题是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
以上是脚本宝典为你收集整理的Docker部署MySQL主从复制全部内容,希望文章能够帮你解决Docker部署MySQL主从复制所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。