docker+mysql配置主从复制

docker+mysql配置主从复制

此文仅做记录,欢迎大佬指正错误,如果能帮到你那就更好啦
此文章是一主二从的配置,下篇文章介绍二主二从

真实项目不适用docker创建多个数据库,这里只是模拟一下多服务器的操作

一、服务器版本

  • CentOS7.6
  • mysql 8.0.21

二、安装mysql

2.1、拉取mysql镜像
docker pull mysql:8.0.21
2.2、创建mysql容器
docker run  --restart=always  --name mysqltest1  -v /data/mysqltest1/conf:/etc/mysql  -v /data/mysqltest1/data:/var/lib/mysql  -v /data/mysqltest1/log:/var/log  -v /data/mysqltest1/mysql-files:/var/lib/mysql-files -p 3308:3306  -e MYSQL_ROOT_PASSWORD='123456'   -d mysql:8.0.21

这里需要修改的内容:
–name 你的mysql名称
-p 3308:3306 3308是自定义的端口,我们使用工具去连接的时候也是这个端口
MYSQL_ROOT_PASSWORD 为root账号设置密码
-v /data/mysqltest1/conf:/etc/mysql :将容器/etc/mysql目录下的数据 复制到主机的/data/mysqltest1/conf

执行docker ps 出现下图说明启动成功。
在这里插入图片描述

2.3、继续创建mysqltest2和mysqltest3
docker run  --restart=always  --name mysqltest2  -v /data/mysqltest2/conf:/etc/mysql  -v /data/mysqltest2/data:/var/lib/mysql  -v /data/mysqltest2/log:/var/log  -v /data/mysqltest2/mysql-files:/var/lib/mysql-files -p 3309:3306  -e MYSQL_ROOT_PASSWORD='123456'   -d mysql:8.0.21
docker run  --restart=always  --name mysqltest3  -v /data/mysqltest3/conf:/etc/mysql  -v /data/mysqltest3/data:/var/lib/mysql  -v /data/mysqltest3/log:/var/log  -v /data/mysqltest3/mysql-files:/var/lib/mysql-files -p 3310:3306  -e MYSQL_ROOT_PASSWORD='123456'   -d mysql:8.0.21

结果如下
在这里插入图片描述

三、配置主库

进入docker容器

docker exec -it mysqltest1 /bin/bash

编辑配置文件,如果vim命令不存在,参考这篇文章,从头到尾执行一次,再执行下面的代码

vim /etc/my.cnf

增加如下配置
log-bin=mysql-bin-3308 启用二进制日志,数据间复制必不可少。mysql-bin-3308自己随便输入的
server-id=3308 服务器唯一ID,随便写。这里写3308是为了跟当前端口一致

[mysqld]
log-bin=mysql-bin-3308 
server-id=3308

输入完成之后,按esc键,然后输入:wq点击回车进行保存

重启mysqltest1容器,由于我们当前是在mysqltest1内部,所以需要exit退出去

//先执行
exit
//后执行
docker restart mysqltest1

登录mysql,-u用户名,-p密码

//进入mysqltest1容器
docker exec -it mysqltest1 /bin/bash
//用root账号登录mysql
mysql -uroot -p123456 

登录成功的样子

在这里插入图片描述

添加具有复制权限的用户。一步一步执行

//slaveuser1:用户名,slaveuser1@qq.com:密码
create user slaveuser1@'%' identified by 'slaveuser1@qq.com';
//REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'%'WITH GRANT OPTION;
//刷新权限
flush privileges;
//查看Master的状态
show master status;

如下图,记录下FilePosition的值,后面要考。
在这里插入图片描述

四、配置从库mysqltest2

进入docker容器

docker exec -it mysqltest2 /bin/bash
//安装vim的过程省略,见上方mysqltest1的vim安装方式

输入vim /etc/my.cnf编辑内容如下

 [mysqld]
server-id=3309

输入完成之后,按esc键,然后输入:wq点击回车进行保存

重启mysqltest2容器,由于我们当前是在mysqltest1内部,所以需要exit退出去

//先执行
exit
//后执行
docker restart mysqltest2

进入mysqltest2容器,并登录root账号配置主从复制的连接信息

docker exec -it mysqltest2 /bin/bash
mysql -uroot -p123456 
 //执行前先停下slave
stop slave; 
//这是从库和主库连接的关键一步,master_host是主库的ip,master_user是前面创建的slaveuser1用户,master_password是密码,master_log_file和master_log_pos是主库show master status的信息,master_port 主数据库的端口
change master to
master_host='162.14.115.68',master_user='slaveuser1',master_password='slaveuser1@qq.com',
master_port=3308,master_log_file='mysql-bin-3308.000001',master_log_pos=886; 
//执行后启动slave。
start slave; 

start slave这里可能会报错“ Slave failed to initialize relay log info structure from the repository”
需要先执行reset slave; 再执行start slave;

//查询状态,出现两个yes就成功。
show slave status\G;

在这里插入图片描述

如果出现Slave_SQL_Running:No,有两种解决方案。第一种不行就用第二种
1、跳过一次错误 :set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
2、手动去主数据库查询出master_log_pos,show master status;然后重新配置主从复制的连接信息
在这里插入图片描述

五、配置从库mysqltest3

按照标题四的步骤进行配置即可,此处省略。不能直接复制标题四的内容去执行哦,要修改对应的内容
master_log_pos取值需要进入mysqltest1,执行show master status;
见下图,已经跟我上面第一次截图不一样了

在这里插入图片描述

当我们所有的都准备好了,来看看结果吧

在这里插入图片描述
在这里插入图片描述

六、其他问题

1、安装vim的时候报了个错,感觉莫名其妙的,解决方案如下
467B942D3A79BD29 就是你的错误代码

在这里插入图片描述

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29

2、另外还发现在使用apt-get程中,容器直接退出的情况,需要重新进入容器,多执行几次,总会成功的,不确定是不是阿里云的那个链接不稳定

3、服务器重启之后,突然发现两个从库的Slave_IO_Running: Connecting,先停止同步,然后在启动就好了。有没有大佬知道是为什么,以及怎么避免
先执行stop slave 再执行start slave

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值