Docker部署Mysql主从复制实现Springboot读写分离案例

一、Docker部署Mysql主从复制

1、拉取镜像

docker pull mysql:5.7

在这里插入图片描述

  • 查看镜像
docker images # 查看镜像

在这里插入图片描述

2、启动镜像

要实现主从复制,那么需要有两个MySQL服务,所以我们启动两个容器

先启动mysql01容器:(即之后的主机) 主机端口为 3310

docker run -d -p 3310:3306 -v /home/mysql/node-1/config:/etc/mysql/conf.d -v /home/mysql/node-1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

再启动mysql02容器:(即之后的从机) 从机端口为 3311

docker run -d -p 3311:3306 -v /home/mysql/node-2/config:/etc/mysql/conf.d -v /home/mysql/node-2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7

在这里插入图片描述

命令解释:
-d: 后台运行容器,并返回容器ID
-p 3311:3306 :将容器的3306端口映射到宿主机3310端口
-e MYSQL_ROOT_PASSWORD=123456 :配置数据库连接密码
-v /home/mysql/node-2/config:/etc/mysql/ :将配置文件夹挂载到宿主机
–name mysql01(02):将容器命名为 mysql01(02)

  • 查看全部容器
docker ps -a #查看全部容器(运行中加未运行的)

在这里插入图片描述
正常启动!!

3、连接测试

在这里插入图片描述
测试启动成功后,我们再来进行下一步。

4、编写主从复制配置文件

之前我们启动的时候写了这句-v /home/mysql/node-1/config:/etc/mysql/,将mysql
的配置文件夹和宿主机的文件夹挂载起来的。
那么我们就可以直接在宿主机下的/home/mysql/node-1/config/编写配置文件了。

4.1、编写主机配置文件

我们先编写主机上的配置文件:

vim my.cnf

然后直接将下面主机的配置文件复制上去即可:

[mysqld]
#修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
#binlog-do-db=testdb  #可以不配置,默认所有的数据库都可以复制
#设置logbin格式
binlog_format=STATEMENT

4.2、编写从机配置文件

从机上的my.cnf也是同样的方式

[mysqld]
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

重新启动mysql容器

docker restart mysql01  mysql02	

在这里插入图片描述
接下来就是搭建主从复制了!!

5、搭建主从复制

5.1、主机设置

进入容器mysql01

docker exec -it mysql01 /bin/bash #进入容器
mysql -uroot -p123456 #连接mysql

在这里插入图片描述

5.2、主机上建立帐户并授权 slave

给从机授权,为了让从机能够和主机连接起来

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

在这里插入图片描述

5.3、查询master状态

show master status; #查询master的状态

在这里插入图片描述
把这里的File和Position记下来哈,等下在从机上要用到哈

File: mysql-bin.000001
Position: 438

Binlog_Do_DB:需要复制的数据库。
Binlog_Ignore_DB:不需要复制的数据库。


5.4、从机设置

进入容器mysql02

docker exec -it mysql02 /bin/bash #进入容器
mysql -uroot -p123456 #连接mysql

复制主机的命令:

CHANGE MASTER TO MASTER_HOST='主机的ip地址',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3310, 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=438;
#解释:
# 	CHANGE MASTER TO MASTER_HOST='主机的IP地址',
#	MASTER_USER='slave'(刚刚配置的用户名),
#	MASTER_PASSWORD='123456'(刚刚授权的密码),
#	master_port=主机开放的端口 我这里是3310端口,
#	MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值(之前的Position);

在这里插入图片描述

**注意:**如果在这里出现错误,先重置。执行完下面两条命令。

stop slave;
reset master;

启动从服务器复制功能

start slave;

在这里插入图片描述

查看从服务器状态

show slave status\G

在这里插入图片描述
Slave_IO_RunningSlave_SQL_Running参数都是Yes,则说明主从配置成功!

二、读写分离案例

1、背景

面对日益增加的系统访问量,数据库的吞吐量面临着巨大的瓶颈。
对于同一时刻有大量并发读操作和较少的写操作类型的应用系统来说,将数据库拆分为主库和从库 主库主要负责处理事务性的增删改操作
从库主要负责查询操作 这样就能有效避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善

2、Sharding-JDBC介绍

  • Sharding-JDBC定位为轻量级的JAVA框架,在JAVA的JDBC层提供额外的服务,它使得客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架
  • 使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离
    • 适用于任何基于JDBC的ORM框架
    • 支持任何第三方的数据库连接池
    • 支持任意实现JDBC规范的数据库
  • 使用Sharding-JDBC框架的步骤
    1. 导入对应的maven坐标
    2. 在配置文件中配置读写分离规则
    3. 在配置文件中配置允许bean定义覆盖配置项

3、项目案例

前面我们已经配置好了主从数据库,那么我们现在就用瑞吉外卖试试读写分离
1.导入瑞吉外卖的SQL数据
2.Git创建一个新分支v1.1,便于我们提交维护
3.导入Sharding-JDBC的maven坐标

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

4.在配置文件中配置读写分离规则,配置允许bean定义覆盖配置项
配置项可能会爆红,但是不影响影响项目启动,是IDEA的问题

spring:
  shardingsphere:
    datasource:
      names:
        master,slave
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.xxx.xxx:3310/reggie?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.xxx.xxx:3311/reggie?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false
  main:   # 配置允许bean定义覆盖配置项
    allow-bean-definition-overriding: true  

可能遇到的问题:
启动时不报错,但是登陆功能报500异常
查看控制台出现SQLFeatureNotSupportedException异常
解决方案: 修改pom.xml中druid的maven坐标为

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.20</version>
</dependency>

参考博客:
https://cloud.tencent.com/developer/article/2145753

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值