【mycat系列一】基于 Docker 搭建 MySQL 主从复制的详细教程

目录

前言:主从复制原理

一、安装docker

二、安装mysql

三、配置Master(主库)

四、配置Slave(从库)

五、主从切换

六、测试主从复制


前言:主从复制原理

image20200421100525819

一共由三个线程完成

  1. 主服务将数据的更新记录保存到二进制日志--主服务器线程
  2. 从服务将主服务的二进制日志复制到本地中继日志--从服务IO线程
  3. 从服务读取中继日志,更新本地数据--从服务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_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;

注:

  • 分别连接进入到上面配置的3个数据库中,执行上述命令,开启sql日志记录(无需重启,即可生效)。
  • 当重启Mysql ,上述开启日志配置将失效。

五、主从切换

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,端口

  • 密码不对

检查是否创建用于同步的用户和用户密码是否正确

  • 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

史上最强Tomcat8性能优化

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

一只 有深度 有灵魂 的公众号0.0

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值