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

Posted 阿甘正专

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mycat系列一基于 Docker 搭建 MySQL 主从复制的详细教程相关的知识,希望对你有一定的参考价值。

点击关注“阿甘正专”,设为星标

奇迹每天都在发生,等你而来


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

目录

前言:主从复制原理

一、安装docker

二、安装mysql

三、配置Master(主)

四、配置Slave(从库)

五、测试主从复制


前言:主从复制原理

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

一共由三个线程完成

  1. 主服务将数据的更新记录保存到二进制日志--主服务器线程

  2. 从服务将主服务的二进制日志复制到本地中继日志--从服务IO线程

  3. 从服务读取中继日志,更新本地数据--从服务SQL线程

一、安装docker

1、安装docker

yum install docker

2、安装成功启动Docker后,查看版本

docker version

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

3、启动Docker并设置为开机自启动


  
    
    
  
  1. systemct1 start docker.service


  2. systemct1 enable docker.service

4、配置docker镜像加速器(阿里云)

参考:https://blog.csdn.net/weixin_43569697/article/details/89279225

vim /etc/docker/daemon.json

增加如下配置:


  
    
    
  
  1. {

  2. "registry-mirrors": ["https://4ssnelcv.mirror.aliyuncs.com"]



  3. }

二、安装mysql

1、查询镜像

docker search mysql

2、下载mysql 5.7.13镜像

docker pull mysql:5.7.13

3、查看下载的镜像

docker images

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

4、使用此镜像启动容器,这里需要分别启动一主两从3个容器

一主两从:分别执行以下3条指令


  
    
    
  
  1. docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13


  2. docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13


  3. 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

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

6、此时可以使用Navicat等工具测试连接mysql

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

【mycat系列一】基于 Docker 搭建 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

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

2、修改my.cnf,在 [mysqld] 节点最后加上后保存:


  
    
    
  
  1. # 局域网内保证唯一

  2. server-id=1

  3. # bin日志,后缀 mysql-bin

  4. 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

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

四、配置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中添加如下配置:


  
    
    
  
  1. ## 设置server_id,注意要唯一

  2. server-id=2

  3. ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用,如果不需要可不配置


  4. log-bin=mysql-slave-bin

  5. ## relay_log配置中继日志

  6. 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

创建主从复制账号:


  
    
    
  
  1. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';


  2. GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

如果报错,可以先在master主库执行如下删除原有账户:

drop user 'slave'@'%';

具体如下:

连接mysql-master,创建同步复制账号

mysql -u root -p123456 -h192.168.239.128 -P3307

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

3、链接Master(主)和Slave(从)

在Master进入mysql,执行

show master status;

如下:

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

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;

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

命令说明:

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

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 ;用于查看主从同步状态。

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

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。

6、使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status ;

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

看到如下红框,Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失败了,建议重新检查下配置,具体失败的原因可以查看日志追踪。

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

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

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

7、从库只读设置

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


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

其中 read_only 配置off--关闭只读,on--开启只读
执行如下命令,开启只读:

 

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

关闭只读:

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


主从复制排错:

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

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

  • 网络不通:检查ip,端口

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

  • pos不对:检查Master的 Position

五、测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。

create database test;

在3307主库新建一个数据库,会自动同步到3308的slave1从库。

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

同理,按上面步骤可配置另外一个从库mysql-slave2。

参考资料:

https://www.jianshu.com/p/3eb1e178f51b

https://www.cnblogs.com/songwenjie/p/9371422.html

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

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

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

右上角按钮分享给更多人哦~【mycat系列一】基于 Docker 搭建 MySQL 主从复制的详细教程

来都来了,点个在看再走吧~~~



以上是关于mycat系列一基于 Docker 搭建 MySQL 主从复制的详细教程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(18) 通过Docker搭建Mycat实现读写分离

mycat系列三SpringBoot + mybatisPlus + Mycat + Mysql (多主多从) 整合

mycat系列二Docker安装mycat并实现MySQL的读写分离

redis优化系列基于docker搭建Redis主从

docker应用-6(mysql+mycat 搭建数据库集群)

构建mycat docker镜像