Docker+阿里云centos7+MySQL主从环形复制踩坑记

老规矩,先列坑

  • slave链接master的时候,一直提示2003错误
  • 修改了iptables后,docker 下的容器无法正常使用
  • 配置正确后,创建新的db部分机器没有同步
  • Got fatal error 1236 from master when reading data from binary log: 'unknown error reading log event

安装步骤

1. 安装docker

yum install docker -y
systemctl start docker.service
systemctl enable docker.service

2. 安装MySQL 5.7.13,并且运行

2.1 docker安装mysql5.7版本

docker pull mysql:5.7.13
docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13

2.2 开放3306端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

提一嘴,这里有个坑

2.3 在本地创建mysql配置文件路径

mkdir -p /usr/local/mysql/master
mkdir -p /usr/local/mysql/slave1

2.4 把docker下的配置文件复制到本地

docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master

2.5 修改配置文件,在 [ mysqld ] 中添加 server-id

vi /usr/local/mysql/master/my.cnf

# 添加下面这两行到 [mysqld] 中
log-bin=mysql-bin
server-id=1


2.6 再把文件复制到docker下

docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf

docker restart master

2.7 通过 Navicat 等工具,链接mysql-master,并且创建slave用户

修改mysql账号密码也可以直接通过navicat进行操作,docker下直接修改root密码我还没找到命令,有知道的可以留言回复告诉我一下~

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';

2.8 创建slave环境,和master配置基本相同

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

 

2.9 配置slave

通过navicat链接到slave1后,执行:

CHANGE MASTER TO 
MASTER_HOST='ip',
MASTER_PORT=3306,
MASTER_USER='backup',
MASTER_PASSWORD='backup';

START SLAVE;

到这里,按照我的步骤的话,都应该是正确的。


3. 排坑

3.1 防火墙

老生常谈防火墙~,在查看slave的状态是,发现 Slave_IO_State 的状态一直是connecting而Slave_IO_Running一直是connecting,后面通过把服务器的防火墙关闭后,就可以了。
/bin/systemctl stop iptables.service

3.2 关于修改了iptables后,无法使用docker,重启master服务会提示:

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

3.3 部分没有同步问题

这里需要重新清空二进制日志

reset master;
stop slave ;
reset slave;
start slave;

3.4 Got fatal error 1236 from master when reading data from binary log: 'unknown error reading log event

这里需要分析逻辑和主从关系,看一下同步到哪一个库就断了,然后执行reset slave

stop slave;
reset slave;
start slave;

3.5 清空旧的复制信息

reset slave all;

我们使用reset slave后不会清空复制信息的master host, master port, master user, or master password等


4. 延伸

4.1 延伸之 reset master 和reset slave的区别

  • reset master 是用来清空二进制日志中所有的文件,使bin-log从000001开始,而reset slave是用来清空主从的pos位置关系
  • reset master一般用于初始化安装主从的时候使用

文章转载自:码农启示录

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinker.guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值