老规矩,先列坑
yum install docker -y
systemctl start docker.service
systemctl enable docker.service
docker pull mysql:5.7.13
docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
提一嘴,这里有个坑
mkdir -p /usr/local/mysql/master
mkdir -p /usr/local/mysql/slave1
docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master
vi /usr/local/mysql/master/my.cnf
# 添加下面这两行到 [mysqld] 中
log-bin=mysql-bin
server-id=1
docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf
docker restart master
修改mysql账号密码也可以直接通过navicat进行操作,docker下直接修改root密码我还没找到命令,有知道的可以留言回复告诉我一下~
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';
docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e mysql:5.7.13
docker cp slave1:/etc/mysql/my.cnf /usr/local/mysql/slave1
vi /usr/local/mysql/slave1/my.cnf
# [mysqld ]添加
log-bin=mysql-bin
server-id=2 # 这里的server-id不能和master相同
docker cp /usr/local/mysql/slave1/my.cnf slave1:/etc/mysql/my.cnf
docker restart slave1
通过navicat链接到slave1后,执行:
CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_PORT=3306,
MASTER_USER='backup',
MASTER_PASSWORD='backup';
START SLAVE;
到这里,按照我的步骤的话,都应该是正确的。
老生常谈防火墙~,在查看slave的状态是,发现 Slave_IO_State
的状态一直是connecting而Slave_IO_Running
一直是connecting,后面通过把服务器的防火墙关闭后,就可以了。
/bin/systemctl stop iptables.service
Error response from daemon: driver failed programming external connectivity on endpoint master (817bc6d0cbb1904d02343e35d295281d2c5386e702bd893c770a9d32948ec310): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))
Error: failed to start containers: master
这需要我们对docker进行重启,重启后的docker服务会向iptables注册一个链,以便让docker服务管理的containner所暴露的端口之间进行通信
systemctl restart docker.service
docker restart master
docker restart slave1
这里需要重新清空二进制日志
reset master;
stop slave ;
reset slave;
start slave;
这里需要分析逻辑和主从关系,看一下同步到哪一个库就断了,然后执行reset slave
stop slave;
reset slave;
start slave;
reset slave all;
我们使用reset slave
后不会清空复制信息的master host, master port, master user, or master password等
文章转载自:码农启示录