目录
前言:主从复制原理
一、安装docker
二、安装mysql
三、配置Master(主库)
四、配置Slave(从库)
五、主从切换
六、测试主从复制
一共由三个线程完成
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"]
}
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,所以不同容器使用相同的端口并不会冲突。
5、查看运行中的容器:
docker ps
6、此时可以使用Navicat等工具测试连接mysql
1、修改MySQL配置环境
创建配置文件目录
目录结构如下
拷贝一份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
3、将修改后的文件覆盖Docker中MySQL中的配置文件
docker cp /usr/local/mysql/master/my.cnf mysql-master:/etc/mysql/my.cnf
4、重启 mysql 的docker , 让配置生效
docker restart mysql-master
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_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{ {.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip
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、从库只读设置
-- 显示表的读写属性
show global variables like "%read_only%";
其中 read_only 配置,off--关闭只读,on--开启只读
执行如下命令,开启只读:
-- 使得具有super权限的用户也不能写操作
flush tables with read lock;
-- 确保普通用户不能写操作
set global read_only=1;
关闭只读:
unlock tables;
set global read_only=0;
8、出错清理掉之前的配置,防止同步已经同步了的数据,执行以下命令:
mysql> stop slave;
mysql> reset slave all;
9、开启日志(非必须)
(非必须)开启sql语句的日志,生产环境不建议开启,这里只是为了验证是否达到读写分离的效果。
查看日志目录,并开启sql语句的日志:
mysql> show variables like '%general_log%';
mysql> set global general_log=on;
注:
1、从库切换为主库
-- 查看从库状态
show slave status;
-- 停止从库同步复制
STOP SLAVE;
-- 重置主库配置信息
RESET MASTER;
-- 重置从库配置信息
RESET SLAVE;
-- 查看主库状态
show master status;
显示为:
2、主库切换为从库
show master status;
STOP SLAVE;
RESET MASTER;
RESET SLAVE;
-- 操作和之前的设置从库基本一致
CHANGE MASTER TO MASTER_HOST='ip地址',master_port=3307,MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='log.000002',MASTER_LOG_POS=154;
start slave;
show slave status;
附录:主从复制排错
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
检查ip,端口
检查是否创建用于同步的用户和用户密码是否正确
检查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
●史上最强Tomcat8性能优化
●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路
●B2B电商平台--ChinaPay银联电子支付功能
●学会Zookeeper分布式锁,让面试官对你刮目相看
●SpringCloud电商秒杀微服务-Redisson分布式锁方案
查看更多好文,进入公众号--撩我--往期精彩
一只 有深度 有灵魂 的公众号0.0