Docker搭建Mysql主从复制

本文详细介绍了如何使用Docker搭建MySQL主从复制环境,包括配置my.cnf文件、解决UUID冲突问题以及连接错误等常见问题。

Docker搭建Mysql主从复制

前言

相信我,看完这一篇,mysql主从复制能遇到的错误在我这里都遇到了,docker能遇到的错误在我这里也遇到了,包括centos的错误,看吧,都是成长
docker基础教程:https://blog.youkuaiyun.com/hello_list/article/details/124221409
Linux基础教程:https://blog.youkuaiyun.com/hello_list/article/details/123977208
Linux安装mysql:https://blog.youkuaiyun.com/hello_list/article/details/124761680

如果你还没有用docker搭建过mysql先不要急着搭建集群,可以显示着用docker搭建一个mysql,这里有教程,可以先试着去搭建一个mysql:

之前我们使用docker搭建了一个Mysql,那既然一个Mysql我们可以搭建成功,集群还不是分分钟,今天我们就简单搭建一个Mysql集群,就搭建一个最简单的一主一从的主从复制吧,如果一个搭建成功一主多从也是很简单,废话不多说,直接开始

这里我们只说安装啊,不说什么原理:

在这里插入图片描述

我们首先就是安装Mysql一样;其实就相当于虚拟机跑了两个mysql而且,平常怎么搭建Mysql就怎么搭建,这里如果不是学习不建议mysql用docker容器搭建,因为我们知道一个容器可以被删除卸载,而数据库作为保存数据的,跑在docker上还是不安全,虽然有挂载,还是不建议;

配置Mysql-master

启动容器

docker run -p 3308:3306 --name mysql-master \            # -p 映射端口 --name 取容器名字
-v /mydata/mysql-master/log:/var/log/mysql \             # 这三个都是挂载目录
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
–privileged=true \                                  # 提升容器权限
-e MYSQL_ROOT_PASSWORD=root  \                      # 初始化密码
-d mysql:5.7                                        # 后台运行容器

启动成功

在这里插入图片描述

配置master的my.cnf文件

> vim /mydata/mysql-master/conf/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=1
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed

配置成功

在这里插入图片描述

查看下主机是有的:

在这里插入图片描述

这里重启下记得,重新加载下配置文件;

到后面进入容器的时候,才发现容器有问题,就是做的时候先把自己环境清理赶紧,然后重新执行,这次容器启动起来了,配置文件那个目录什么的都清理干净

在这里插入图片描述

开启从机Mysql-slave01

启动容器

配置slave01的my.cnf文件

cd /   
mkdir mydata 
cd mydata 
mkdir mysql-slave01
cd mysql-slave01
mkdir conf 
cd conf 
vim my.cnf 
> vim /mydata/mysql-slave01/conf/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

与第一步一样:

在这里插入图片描述

在这里插入图片描述

废了九牛二虎之劲把两个容器启动起来了,主要是我的虚拟机存储满了,第二个容器一直启动不起来:
在这里插入图片描述

可以看到虚拟机启动起来,用的是我们的配置文件

在这里插入图片描述

但是还要从启动下,加载下配置文件,之后查看,是否是我们自己配置的id:

SHOW VARIABLES LIKE 'server_id';  

在这里插入图片描述

查看下,我们两台容器的IP地址

docker inspect mysql-master

master地址是0.2

在这里插入图片描述

docker inspect mysql-slave01   # 03

在这里插入图片描述

进入master容器,执行以下命令

docker exec -it mysql-master /bin/bash

mysql > mysql -uroot -pmaster的密码
# 授予slave服务器可以同步master服务
mysql > grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码';
#这里是grant replication slave, replication client on *.* to 'root'@'172.17.0.3' identified by 'root';
mysql > flush privileges;
# 查看MySQL现在有哪些用户及对应的IP权限(可以不执行,只是一个查看)
mysql > select user,host from mysql.user;

在这里插入图片描述

查询下当前结点位置

mysql > show master status;

在这里插入图片描述

进入从mysql-slave01,这里我直接开启了两个终端,这样方便:

docker exec -it mysql-slave01 /bin/bash

在这里插入图片描述

绑定主mysql

mysql> change master to master_host='master服务器ip', master_user='root', master_password='master密码', master_port=3306, master_log_file='mysql-bin.000003(这里跟前面我画箭头那对应起来)',master_log_pos=618(这里也是);

最后是

change master to master_host='172.17.0.2', master_user='root', master_password='root', master_port=3308, master_log_file='mysql-bin.000003',master_log_pos=618;

在这里插入图片描述

在从mysql slave下开启主从复制功能:

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看状态:

mysql> show slave status\G

一直显示连接中,证明没有开启成功

在这里插入图片描述

看错误提示:

在这里插入图片描述

这个错误我找了差不都两个小时,然后我尝试着链接不上?我用本机也就是虚拟机然后链接,一下就连上了

在这里插入图片描述

容器内我怎么也连接不上,但是

ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (111)
root@d6b141ceb723:/# mysql -uslave -h 172.17.0.2 -p -P3308

我发现我通过虚拟机ip可以连接,突然想明白了,我们是在容器内和容器外做的端口映射,而映射到虚拟机也就是本机是3308,容器内端口还是3306,然后就,之前写草稿的时候我还括号了这点,坑死了,啊~,可以说我这篇是把遇到的问题都遇到了,我成长了,成长了太多了,啊!!!

在这里插入图片描述

在这里插入图片描述

解决完之后又遇到一个错误:

在这里插入图片描述

uuid重复了,查看:确实重复了,我感觉这些错误,可以了

show variables like '%server_uuid%';

在这里插入图片描述

在主机中的文件,找到任意一个

vim /mydata/mysql-slave01/data/auto.cnf

修改一下,保存,重新启动mysql-slave容器:

在这里插入图片描述

然后我们在执行:

1、查看master节点

2、查看授权信息

3、进行授权

4、绑定主mysql

5、开启主从复制

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_host='172.17.0.2', master_user='root', master_password='root', master_port=3306, master_log_file='mysql-bin.000008',master_log_pos=1210;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.04 sec)

搞定,两个yes连接成功

在这里插入图片描述

测试

在开发中主从复制之后不可以随意新增数据库,但是今天我们就尝试下,可以看到我们已经完成了主从复制:

在这里插入图片描述

这个之外的,我遇到的问题

启动第二个容器老是失败,提示我centos虚拟机存储快满了,我一看,确实满了,安装了不少东西,而且docker也挺费的,当初就是使用的20G,已经可以了,扩容到了30G,哈哈,看着这个教程扩容的,它的虚拟机跟我的一模一样,真好,直接看着就做下来了,扩容成功:https://www.cnblogs.com/friendwang1001/p/15725732.html

在这里插入图片描述

但是扩容之后,网络启动失败,可能是扩容的时候什么文件的原因吧,然后又找到一篇博客,就搞定了,这里,报错就是这个报错:(2条消息) Job for network.service failed because the control process exited with error code.报错解决方法_如是我愿的博客-优快云博客

service NetworkManager stop 关闭 NetworkManger 服务
chkconfig NetworkManager off 永久关闭 Manager网卡
service network restart 重启network网卡
评论 62
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习日记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值