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一般用于初始化安装主从的时候使用

文章转载自:码农启示录

你可能感兴趣的:(踩坑,MySQL)