mycat系列一基于 Docker 搭建 MySQL 主从复制的详细教程
Posted 阿甘正专
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mycat系列一基于 Docker 搭建 MySQL 主从复制的详细教程相关的知识,希望对你有一定的参考价值。
点击关注“阿甘正专”,设为星标
奇迹每天都在发生,等你而来
目录
前言:主从复制原理
一、安装docker
二、安装mysql
三、配置Master(主)
四、配置Slave(从库)
五、测试主从复制
前言:主从复制原理
一共由三个线程完成
主服务将数据的更新记录保存到二进制日志--主服务器线程
从服务将主服务的二进制日志复制到本地中继日志--从服务IO线程
从服务读取中继日志,更新本地数据--从服务SQL线程
一、安装docker
1、安装docker
yum install docker
2、安装成功启动Docker后,查看版本
docker version
3、启动Docker并设置为开机自启动
systemct1 start docker.service
systemct1 enable docker.service
4、配置docker镜像加速器(阿里云)
参考:https://blog.csdn.net/weixin_43569697/article/details/89279225
vim /etc/docker/daemon.json
增加如下配置:
{
"registry-mirrors": ["https://4ssnelcv.mirror.aliyuncs.com"]
}
二、安装mysql
1、查询镜像
docker search mysql
2、下载mysql 5.7.13镜像
docker pull mysql:5.7.13
3、查看下载的镜像
docker images
4、使用此镜像启动容器,这里需要分别启动一主两从3个容器
一主两从:分别执行以下3条指令
docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3309:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
Master对外映射的端口是3307,Slave1对外映射的端口是3308,Slave2对外映射的端口是3309。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。
--name mysql-master :设置容器名称;
-d :设置容器在在后台一直运行;
-p 3307:3306 :设置端口映射,把容器3306端口映射到宿主机的3307端口。
5、查看运行中的容器:
docker ps
6、此时可以使用Navicat等工具测试连接mysql
三、配置Master(主)
1、修改MySQL配置环境
创建配置文件目录
目录结构如下
/usr/local/mysql/master
/usr/local/mysql/slave1
/usr/local/mysql/slave2
拷贝一份MySQL配置文件
docker cp mysql-master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf
进到master目录下,已存在拷贝的my.cnf
2、修改my.cnf,在 [mysqld] 节点最后加上后保存:
# 局域网内保证唯一
server-id=1
# bin日志,后缀 mysql-bin
log-bin=mysql-bin
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀;
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复;
3、将修改后的文件覆盖Docker中MySQL中的配置文件
docker cp /usr/local/mysql/master/my.cnf mysql-master:/etc/mysql/my.cnf
4、重启 mysql 的docker , 让配置生效
docker restart mysql-master
四、配置Slave(从库)
1、如果之前没运行mysql-slave1,首先运行从容器
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
与主容器相似,拷贝配置文件至slave1目录修改后覆盖回Docker中.
docker cp mysql-slave1:/etc/mysql/my.cnf /usr/local/mysql/slave1/my.cnf
vim my.cnf
和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:
## 设置server_id,注意要唯一
server-id=2
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用,如果不需要可不配置
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
docker cp /usr/local/mysql/slave1/my.cnf mysql-slave1:/etc/mysql/my.cnf
别忘记,重启slave1容器,使配置生效
docker restart mysql-slave1
2、配置同步复制账号
下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
【注意】最好在mysql命令行终端执行下面的命令,不要使用Navicat等工具,可能报错。
docker 中进入mysql-master 容器:
docker exec -it mysql-master /bin/bash
登录mysql-master:
mysql -uroot -p123456
创建主从复制账号:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
如果报错,可以先在master主库执行如下删除原有账户:
drop user 'slave'@'%';
具体如下:
连接mysql-master,创建同步复制账号
mysql -u root -p123456 -h192.168.239.128 -P3307
3、链接Master(主)和Slave(从)
在Master进入mysql,执行
show master status;
如下:
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
4、在Slave 中进入 mysql,先在Slave执行如下,停止复制:
docker 中进入mysql-slave1容器:
docker exec -it mysql-slave1 /bin/bash
登录 mysql-slave1:
mysql -uroot -p123456
先停止从库复制:
stop slave;
然后,执行:
change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 1522, master_connect_retry=30;
命令说明:
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
5、在Slave 中的mysql终端执行show slave status ;用于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
6、使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status ;
看到如下红框,Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失败了,建议重新检查下配置,具体失败的原因可以查看日志追踪。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
7、从库只读设置
其中 read_only 配置,off--关闭只读,on--开启只读
执行如下命令,开启只读:
关闭只读:
主从复制排错:
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
网络不通:检查ip,端口
密码不对:检查是否创建用于同步的用户和用户密码是否正确
pos不对:检查Master的 Position
五、测试主从复制
测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
create database test;
在3307主库新建一个数据库,会自动同步到3308的slave1从库。
同理,按上面步骤可配置另外一个从库mysql-slave2。
参考资料:
https://www.jianshu.com/p/3eb1e178f51b
https://www.cnblogs.com/songwenjie/p/9371422.html
●
●
●
●
●
右上角按钮分享给更多人哦~
来都来了,点个在看再走吧~~~
以上是关于mycat系列一基于 Docker 搭建 MySQL 主从复制的详细教程的主要内容,如果未能解决你的问题,请参考以下文章
MySQL(18) 通过Docker搭建Mycat实现读写分离
mycat系列三SpringBoot + mybatisPlus + Mycat + Mysql (多主多从) 整合
mycat系列二Docker安装mycat并实现MySQL的读写分离