host: 192.168.0.105
问题:在docker安装mysql容器后,在同一节点上使用两个mysql容器建立主从复制,其中主mysql容器映射到13306,从mysql容器映射到13307
按Ubuntu中通过Docker安装配置MySQL主从节点 - 大杂草 - 博客园 (cnblogs.com)完成主从配置之后 使用show slave status \G;查看,发现:
Slave_IO_State: Connecting to master
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
正确应该是都为YES,这之后通过验证也发现了主从复制没有成功
尝试以下方法均失败:
1.检查server-id确保了是不相同的
2.确保了防火墙是关闭的
3.确保配置时从容器的MASTER_LOG_FILE='xxxx',MASTER_LOG_POS=xxx;与主容器一致
4.确保了slave账号权限密码之类的设置正确
5.确保mysql配置文件正确
6:确保13307和13306端口在被正常监听:sudo netstat -tuln | grep 13306/sudo netstat -tuln | grep 13307,并且0.0.0.0表示接受来自任意ip的请求
解决:
测试13306端口
telenet localhost 13306
发现可以连通,
telenet 192.168.0.105 13306
发现不能连通
但192.168.0.105就是主机节点的ip地址
使用ifconfig 发现没有docker0网卡,使用ifconfig docker0发现网卡没有分配地址
尝试手动创建一条docker0网卡配置连接
查看所有网络连接的详细信息,发现有多个无用的docker0连接
nmcli connection show
将其全部删除
nmcli connection delete uuid 98a9e3a3-cb78-43be-9cf3-d612d5c7fb36
nmcli connection delete uuid 0f02cb43-0b28-4103-a883-07f5c7b9bd6e
然后手动创建一条 建议使用 172.17.0.1/16
sudo nmcli connection add type bridge ifname docker0 con-name docker0 ip4 172.17.0.1/16 autoconnect true
重启docker和网络服务
sudo systemctl restart NetworkManager
sudo systemctl restart docker
ifconfig查看 发现成功启动
在docker中启动之前mysql的两个主从容器 并对主从复制信息重新配置
在maste容器:
进入主容器中 (mysql-master为容器名称)
docker exec -it mysql-master mysql -u root -p
查看容器状态
show master status;
在slave容器:
另开一个会话窗口进入从容器中 (mysql-slave为容器名称)
docker exec -it mysql-slave mysql -u root -p
关闭主从复制线程
stop slave;
根据主容器的status信息,完成主从复制的重新配置
CHANGE MASTER TO MASTER_HOST='192.168.0.105',MASTER_PORT=13306,MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='log.000004',MASTER_LOG_POS=154;
重新启动线程
start slave;
查看主从复制状态 发现信息正确都为YES 主从复制功能正常
show slave status \G;
总结:docker0网卡丢失,导致docker给容器分配地址后 两个容器直接不能正常通信以完成mysql的主从复制。