SpringBoot环境-MySQL主从复制,读写分离的实现

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路SpringBoot环境-MySQL主从复制,读写分离的实现,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

概述

环境

主从复制

读写分离


概述

 记录在MySQL数据库中主从复制以及SpringBoot环境操作MySQL数据库读写分离的实现步骤。

 背景 :因为我们在对数据库进行操作时,如果读写操作都由一台数据库承担的话压力会比较大,为了减轻数据库压力,我们可以使用多个数据库一起工作,进行读写的分离操作。

操作 : 利用两台linux主机分别安装MySQL数据库进行模拟测试,一个数据库处理”读”(select)操作,另一个处理”写”(save,update,delete)操作,创建SpringBoot项目利用MyBatisPlus框架对数据库进行简易测试,对读写分离进行测试。

 前提 :虚拟机创建两台linux主机模拟两台不同服务器,两个主机分别安装MySQL数据库模拟主库和从库,以及创建一个简单的SpringBoot项目来对读写分离进行测试。

环境

检查IP地址以及mysql的安装。

主机一:192.168.1.233 简称主机233(作为主库)

SpringBoot环境-MySQL主从复制,读写分离的实现

SpringBoot环境-MySQL主从复制,读写分离的实现

 主机二:192.168.1.234 简称主机234(作为从库)

SpringBoot环境-MySQL主从复制,读写分离的实现

SpringBoot环境-MySQL主从复制,读写分离的实现

主从复制

主从复制原理简介: MySQL主从复制是一个异步复制的过程,底层是基于MySQL数据库自带的二进制日志功能。就是一台或多台MySQL数据库(从库)从另一台MySQL数据库(主库)进行日志的复制再解析日志并应用到自身数据库,最终实现主库和从库可以保持一致。

复制过程

当”主库”的数据发生改变时,会记录到自己的二进制日志中,”从库”会存在一个IO线程,读取”主库”中的二进制日志文件,获取到并写入”从库”二进制文件中,接着另一个SQL线程会执行从”主库”获取来的日志,进行执行相同的操作,使两库的数据始终保持一致。

 主从复制搭建步骤

 主库操作(主机233)

一、在数据库配置文件中启用二进制日志

在linux中输入命令,修改配置文件,将如下配置加进去后保存退出。 

vim /etc/my.cnf
# 开启二进制日志
log-bin=mysql-bin
# 设置二进制唯一ID
server-id=233

SpringBoot环境-MySQL主从复制,读写分离的实现

 二、重启MySQL服务

systemctl restart mysql

 三,添加权限用户,使得从库具有复制主库日志权限 

因为在此使用的MySQL8.0,所以需要先添加用户再赋予权限。 

# 创建用户xiaoming 密码12346
CREATE USER 'xiaoming'@'%' IDENTIFIED BY '123456';

# 给用户xiaoming赋予权限
GRANT ALL PRIVILEGES ON *.* TO 'xiaoming'@'%'WITH GRANT OPTION; 

# 刷新权限
flush privileges;

# 展示master主库的状态
show master status;

SpringBoot环境-MySQL主从复制,读写分离的实现为了保持如上图的File和Position值不变并记下值, 不要再操作此库

  从库操作 (主机234)

一、修改另一台MySQL数据库的配置文件。

vim /etc/my.cnf
# 设置二进制唯一ID
server-id=233

SpringBoot环境-MySQL主从复制,读写分离的实现

 二、重启MySQL服务

systemctl restart mysql

 三、登录上mysql,利用主库信息连接主库

# 停止从库
stop slave;

# 输入主库的IP地址和用户名密码,以及刚才获取到的主库状态File和Position值
change master to master_host='192.168.1.233',master_user='xiaoming',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=1324;

# 开启从库
start slave;

# 展示从库状态
show slave status\G; #\G格式化输出

SpringBoot环境-MySQL主从复制,读写分离的实现 

 如上红框内均为Yes既为成功。

 主从复制测试 

我们会在windows平台上使用navicat分别连接linux上的两台数据库进行测试.

(测试记得关掉防火墙,否则navicat会连接不上)

关闭防火墙命令:systemctl stop firewalld

SpringBoot环境-MySQL主从复制,读写分离的实现

给主库添加一个数据库,观察从库是否会自动创建一个。 

SpringBoot环境-MySQL主从复制,读写分离的实现

 SpringBoot环境-MySQL主从复制,读写分离的实现

 给数据库mydb创建student表并插入一些数据,用于读写分离测试。(给主库创建后,从库数据会与主库跟随自动同步)

CREATE TABLE student(
name VARCHAR(255),
age INT
);

INSERT INTO student VALUES('tom',18);

读写分离

 在设置好数据库的主从复制后,就可以来进行读写分离的编写了。

我们使用框架:Sharding-JDBC进行读写分离的操作。

我们使用SpringBoot项目仅需要导入它的坐标并书写数据库连接配置即可。

 用于SpringBooot测试项目结构预览 

SpringBoot环境-MySQL主从复制,读写分离的实现 

这是一个最简单的SpringBoot项目结构,提供一个实体类Student与数据库中的student表一致,利用MyBatisPlus框架搭建数据层dao,业务层service以及表现层controller进行测试即可。

读写分离步骤(使用框架Sharding-JDBC)

一、导入Sharding-JDBC坐标

<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

二、在配置文件中编写读写分离规则(连接信息)

yml文件中配置,设置两台数据库的IP地址和使用的库

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.1.233:3306/mydb?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
      # 从数据源
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.1.234:3306/mydb?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
    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:
    allow-bean-definition-overriding: true

ps:引入后要是master和slave层级下爆红可以忽略,不影响运行。

=== 测试===

表现层提供两个接口,一个get接口新增数据模拟”写操作” (主库处理),另一个post接口获取数据模拟”读操作”(从库处理)。

SpringBoot环境-MySQL主从复制,读写分离的实现

 使用postman发送get请求访问接口,接口中是新增数据操作,属于写操作,则应该由主库master进行处理,我们请求后观察控制台。

SpringBoot环境-MySQL主从复制,读写分离的实现

  使用postman发送post请求访问接口,接口中是获取数据操作,属于读操作,则应该由从库slave进行处理,我们请求后观察控制台。

SpringBoot环境-MySQL主从复制,读写分离的实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154537.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!