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;
如下图,记录下File
和Position
的值,后面要考。
四、配置从库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