基于Docker搭建MySQL实现主从复制


前言

在我们的项目有这样的场景,数据库要实现主从复制,读写分离的时候,主从复制是数据库自身去实现的,读写分离是通过代码配置不同的数据源去实现的,本篇内容是实现前者,基于MySQL实现主从复制的,后续会再出一篇读写分离的代码。

一、数据库的主从复制是什么?

通俗的来说,就是有多个数据库,一个主数据库,多个从数据库,当我们在操作主数据库的时候(往往是增删改),从数据库的数据也会同步变化。
其实这个原理很简单,master主库在提交事务时会把数据库变更的事件记录到二进制文件binlog中,然后主库推送二进制文件binlog中的事件,从库读取主库推送的二进制文件binlog内容并写入relay log中,最后从库读取relay log内容(指定位置),写入到从库的数据库中。

二、使用步骤

1.创建MySQL主数据库节点

在linux环境下,确保有安装Docker,执行命令。

# 1.下载mysql-5.7版本镜像
docker pull mysql:5.7
# 注意:因为要修改mysql服务的my.cnf配置文件,通过docker运行的容器,在容器内操作文件不太方便,所以此处使用了docker的挂载。
# 2.创建文件夹,来挂载mysql的日志和配置文件
mkdir docker-mysql-conf
# 进入docker-mysql-conf目录创建文件夹,存放mysql的master数据库日志
mkdir master-mysql
# 进入docker-mysql-conf目录创建文件,来挂载mysql的配置文件
vim master-mysql.cnf
# 文件内容如下
------------------------
[mysqld]
## 注意要唯一
server-id=1
## 开启二进制日志功能
log-bin=mysql-bin
------------------------
# 3.运行mysql镜像
docker run --name master-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /usr/local/docker-mysql-conf/master-mysql:/var/lib/mysql -v /usr/local/docker-mysql-conf/master-mysql.cnf:/etc/mysql/my.cnf -p 3306:3306 -d mysql:5.7
# 解释:--name 容器名称;-v 对目录进行挂载;-p 指定端口映射;-d 指定镜像
# 4.到此为止,mysql的主库就创建完成了

2.连接主数据库

同步骤一的操作,命令如下:

-- 给master主数据库创建一个用户,只用来为slave从数据库做数据同步用
-- 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
-- 给用户赋权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-- 刷新MySQL的系统权限相关表­
flush privileges;
-- 查看主库的状态在配置slave从数据库时会用到,读取的文件(File)和位置(Position),如下图
show master status;

查询结果:
在这里插入图片描述

3.创建MySQL从数据库节点

本人使用的时Navicat连接的数据库,进行数据库的操作。

# 1.进入docker-mysql-conf目录创建文件夹,存放mysql的slave01数据库日志
mkdir slave01-mysql
# 2.进入docker-mysql-conf目录创建文件,来挂载mysql的配置文件
vim slave01-mysql.cnf
# 文件内容如下
------------------------
[mysqld]
## 设置server_id,注意要唯一
server-id=2
### 开启二进制日志功能
log-bin=mysql-slave01-bin
relay_log=edu-mysql-relay-bin
------------------------
# 3.运行mysql镜像
docker run --name slave01-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /usr/local/docker-mysql-conf/slave01-mysql:/var/lib/mysql -v /usr/local/docker-mysql-conf/slave01-mysql.cnf:/etc/mysql/my.cnf -p 3307:3306 -d mysql:5.7
# 解释:--name 容器名称;-v 对目录进行挂载;-p 指定端口映射;-d 指定镜像
# 4.到此为止,mysql的从库就创建完成了

4.连接从数据库

同步骤2的操作,命令如下:

-- 在slave库中执行下面SQL语句
change master to master_host='39.103.217.114', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos= 968, master_connect_retry=30;
-- master_host:主数据库的ip地址;master_user:主数据刚创建的用户;master_password:密码;master_port:端口;
-- master_log_file:slave从主数据库的那个文件复制数据,即步骤2查询出来的;
-- master_log_pos:从哪个Position开始读,即步骤2查询出来的;master_connect_retry:如果连接失败,重试的时间间隔,单位是秒

-- 开始启动主从复制
start slave;
-- 查询从库状态
show slave status;
-- 主要关注Slave_IO_Running和Slave_SQL_Running这两个字段,都是Yes就配置ok了

查询结果:
在这里插入图片描述

三、温馨提示

1.本人只配置了一主一从,若是配置多从,只需要重复3,4步骤即可实现,全都配置好之后,在主库上创建一个数据库,从库上也会出现对应的数据库。
2.本人是在同一个Linux服务器上(别问为什么,问就是穷),使用Docker启动多个mysql节点,指定不同的端口,若不想使用Docker,可以安装多个mysql节点,去对应的目录修改配置文件,即可实现。多种方式都可以实现,主要使用Docker容器太方便了(手动狗头)。
3.如果是使用的ECS云服务器,要去配置安全组,把相应的端口打开,才能通过外部的客户端连接mysql服务器。

博主不易,如若对你有帮助记得点赞哦!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值