老规矩,先列坑
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一般用于初始化安装主从的时候使用