docker搭建mysql的主从复制架构

本教程环境

服务器:CentOS7.7(推荐使用该版本)
需安装docker,安装docker环境教程请移步 https://blog.csdn.net/weixin_44790046/article/details/105612438

一、搭建主数据库

注意:主从复制需要注意的地方
	● 主DB server和从DB server数据库的版本一致
	● 主DB server和从DB server数据库数据一致
	● 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

1)创建目录

#进入根目录
cd /
#创建目录
mkdir -p mysql/master
cd mysql/master
mkdir conf data

在这里插入图片描述
2)创建配置文件

cd conf/
#创建配置文件
vim my.cnf

#在里面写入如下内容
[mysqld]
server-id	= 1	#服务id,不可重复
log-bin		= mysql-bin	#开启二进制日志

3)拉取mysql5.7镜像

docker pull mysql:5.7

镜像已拉取
在这里插入图片描述
4)创建mysql容器

docker run -d \
--name mysql_master \
-v /mysql/master/data:/var/lib/mysql \
-v /mysql/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7

在这里插入图片描述
5)查看目录是否挂载成功(重要),如果/mysql/master/data目录有如下文件说明挂载成功
在这里插入图片描述
6)进入容器登录mysql(可以用远程连接工具连接)

docker exec -it mysql_master /bin/bash

在这里插入图片描述
7)创建一个同步用户以及授权

create user 'admin'@'%' identified by '362623';

grant replication slave on *.* to 'admin'@'%';

flush privileges;

看到mysql数据库中多了一个admin用户
在这里插入图片描述
如果执行过程中出现[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误

#解决方案,在my.cnf配置文件中添加如下设置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

8)查看mysql二进制日志功能是否开启

#查看mysql二进制日志功能是否开启
show variables like '%log_bin%';

在这里插入图片描述

#查看master状态
show master status;

#查看二进制日志相关的配置项
show global variables like 'binlog%';

#查看s erver相关的配置项
show global variables like 'server%';

在这里插入图片描述
出现这个日志文件就可以了,后面要用这两个信息

二、搭建从数据库

1)创建目录

#进入根目录
cd /
#创建目录
mkdir -p mysql/slave01
cd mysql/slave01
mkdir conf data

在这里插入图片描述
2)创建配置文件

cd conf/
#创建配置文件
vim my.cnf

#在里面写入如下内容
[mysqld]
server-id	= 2	#服务id,不可重复

创建mysql从数据库容器

#创建容器
docker run -d \
--name mysql_slave01 \
-v /mysql/slave01/data:/var/lib/mysql \
-v /mysql/slave01/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7

在这里插入图片描述
4)查看目录是否挂载成功(重要),如果/mysql/slave01/data目录有如下文件说明挂载成功
在这里插入图片描述
5)进入容器登录mysql(可以用远程连接工具连接)

docker exec -it mysql_slave01 /bin/bash

在这里插入图片描述
6)设置主库master的相关信息(注意:以下执行sql都是在从库中执行

#设置主库master的相关信息
CHANGE MASTER TO
 master_host='192.168.200.131',	#你的宿主机ip
 master_user='admin',	#上面在主数据库添加的用户名
 master_password= '362623',	#上面在主数据库添加的用户名密码
 master_port=3306,	#主数据库端口
 master_log_file='mysql-bin.000003',	#主数据库搭建最后一步的那两个信息
 master_log_pos=741;	#主数据库搭建最后一步的那两个信息

在这里插入图片描述
7)启动同步

start slave;

注意:这里如果执行start slave 命令出现 Slave failed to initialize relay log info structure from the repository 错误,那么就是执行 reset slave; 命令清除记录再次执行第6步设置主库master的相关信息

在这里插入图片描述
8)查看master状态,如果红框两项都为yes那么恭喜你搭建成功

show slave status;

在这里插入图片描述

三、修改主从复制模式

#查看mysql_master二进制日志相关的配置项
show global variables like 'binlog%';

可以看到当前模式默认为ROW(基于行的复制)
在这里插入图片描述

在查看二进制日志相关参数内容中,会发现默认的模式为ROW ,其实在MySQL中提供了有3种模式,基于SQL语句的复制(statement-based replication, SBR) ,基于行的复制(row-based replication, RBR) ,混合模式复制(mixed-based replication, MBR)。对应的, binlog的格式也有三种: STATEMENT , ROW , MIXED。

STATEMENT模式(SBR)

  • 优点是并不需要记录每一条sql语句和每一 行的数据变化 ,减少了binlog日志量,节约IO ,提高性能。
  • 缺点是在某些情况下会导致master-slave中的数据不一致(如sleep)函数 ,last_insert_id() ,以及user-defined functions(udf)等会出现问题

ROW模式( RBR )

  • 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下
    的存储过程、或function、 或trgger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是
    alter table的时候会让日志暴涨。

MIXED模式( MBR )

  • 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog ,对于STATEMENT模式无法复制的操作使
    用ROW模式保存binlog , MySQL会根据执行的SQL语句选择日志保存方式。
    建议使用MIXED模式。

修改主库配置文件my.cnf

#追加下面配置
binlog_format	= MIXED

#重启并查看日志
docker restart mysql_master && docker logs -f mysql_master

#再次查看二进制日志相关的配置项
show global variables like 'binlog%';

在这里插入图片描述
在这里插入图片描述

测试

在主库中新建ceshi数据库并创建user表,在里面添加一条记录
在这里插入图片描述
我们发现从库也有了这张表和数据
在这里插入图片描述

至此,我们就实现了主从复制,当我们去执行写入的操作就可以写入到主库中,当执行查的操作就去从库查询,这样就节省了主库的压力。

猜你喜欢

转载自blog.csdn.net/weixin_44790046/article/details/106853163