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

news2025/4/8 18:12:34

目录

概述

环境

主从复制

读写分离


概述

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

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

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

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

环境

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

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

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

主从复制

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

复制过程

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

 主从复制搭建步骤

 主库操作(主机233)

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

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

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

 二、重启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;

为了保持如上图的File和Position值不变并记下值, 不要再操作此库

  从库操作 (主机234)

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

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

 二、重启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格式化输出

 

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

 主从复制测试 

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

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

关闭防火墙命令:systemctl stop firewalld

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

 

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

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

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

读写分离

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

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

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

 用于SpringBooot测试项目结构预览 

 

这是一个最简单的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接口获取数据模拟"读操作"(从库处理)。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】rsyslog日志服务(配置,测试、日志转储)

一、rsyslog简介 Rsyslog的全称是 rocket-fast system for log ,可用于接受来自各种来源的输入&#xff0c;转换 它们&#xff0c;并将结果输出到不同的目的地。 它提供了高性能、强大的安全功能和模块化设计。虽然rsyslog最初是一个常规的系 统日志&#xff0c;但它已经发展成…

H5APP开发封装流程

1.利用H5写想要的功能 2.打包APP 3.手机安装 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-sca…

【基础】Flink -- Time and Window

Flink -- Time and WindowFlink 时间语义水位线 Watermark水位线的概念有序流中的水位线乱序流中的水位线水位线的特性水位线的基本使用水位线生成策略内置水位线生成器自定义水位线策略在自定义数据源中发送水位线窗口 Window窗口的基本概述窗口的基本概念窗口的分类窗口的 AP…

ccc-Backpropagation-李宏毅(7)

文章目录NotationBackpropagationForward passBackward passSummaryNotation 神经网络求解最优化Loss function时参数非常多&#xff0c;反向传播使用链式求导的方式提升计算梯度向量时的效率&#xff0c;链式法则如下&#xff1a; Backpropagation 损失函数计算为所有样本…

Pulsar

一、简介Apache Pulsar是Apache软件基金会顶级项目&#xff0c;是下一代云原生分布式消息流平台&#xff0c;集消息、存储、轻量化函数式计算为一体&#xff0c;采用计算与存储分离架构设计&#xff0c;支持多租户、持久化存储、多机房跨区域数据复制&#xff0c;具有强一致性、…

常见的函数式编程操作

1、柯里化&#xff1a; (概念 & 应用 & 好处) 柯里化的概念&#xff1a; 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变成接受单一参数的函数&#xff0c;并且返回一个用于接受剩余参数的新函数&#xff0c;当参 数都传递完成后&#xff0c; 则立…

Linux 文件权限讲解

目录 文件的一般权限 一般权限有哪些 使用ls -l查看文件/目录权限 配置一般权限和文件所属信息 chmod 修改文件权限 chown 修改文件所属信息&#xff08;所有者和所属组&#xff09; 文件特殊权限 SUID 针对所有者的特殊权限 SGID SBID 配置特殊权限 文件的隐藏权限…

智能网联汽车ASIL安全等级如何划分

目录一、功能安全标准二、功能安全等级定义三、危险事件的确定四、ASIL安全等级五、危险分析和风险评定六、功能安全目标的分解一、功能安全标准 ISO 26262《道路车辆功能安全》脱胎于IEC 61508《电气/电子/可编程电子安全系统的功能安全》&#xff0c;主要定位在汽车行业&…

qt 配置open3d

一、配置前要先编程open3d二、开始配置新建txt 把txt 修改为 pri在pro 文件中添加 include(F:/xuwanlu/control.pri)重新构建项目然后回多出来pri在pri中添加open3d目录INCLUDEPATH F:\open3d\include\Open3D\3rdparty\GLFW\include \F:\open3d\include\Open3D\3rdparty\gle…

Golang 给视频添加背景音乐 | Golang工具

目录 前言 环境依赖 代码 总结 前言 本文提供给视频添加背景音乐&#xff0c;一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装&#xff0c;可以参考我的另一篇文章&#xff1a;windows ffmpeg安装部署_阿良的博客-CSDN博客 …

当你按下方向键,电视是如何寻找下一个焦点的

我工作的第一家公司主要做的是一个在智能电视上面运行的APP&#xff0c;其实就是一个安卓APP&#xff0c;也是混合开发的应用&#xff0c;里面很多页面是H5开发的。 电视我们都知道&#xff0c;是通过遥控器来操作的&#xff0c;没有鼠标也不能触屏&#xff0c;所以“点击”的…

ChatGPT已应用到跨境电商领域,规模化运营指日可待

最近各大平台都卷起了一股“ChatGPT”的热潮&#xff0c;论坛、贴吧、微博甚至短视频都对这个新兴的东西津津乐道&#xff0c;在这些评论区里我们可以发现&#xff0c;不管说什么职业&#xff0c;不管年龄性别&#xff0c;ChatGPT都开始被许多人关注。那么ChatGPT到底是个什么东…

大数据框架之Hadoop:HDFS(五)NameNode和SecondaryNameNode(面试开发重点)

5.1NN和2NN工作机制 5.1.1思考&#xff1a;NameNode中的元数据是存储在哪里的&#xff1f; 首先&#xff0c;我们做个假设&#xff0c;如果存储在NameNode节点的磁盘中&#xff0c;因为经常需要进行随机访问&#xff0c;还有响应客户请求&#xff0c;必然是效率过低。因此&am…

FPGA入门系列17--task

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

如何选择传感器输出模式——电流输出还是电压输出?

一 背景及挑战 传感器在汽车测试系统中发挥着信息的采集和传输作用&#xff0c;可以称为汽车的“神经元”。 按照功能可以将传感器分为压力传感器、流量传感器、温湿度传感器和电流传感器等。传感器的主要指标是精度、测量范围和响应时间等。在满足指标的情况下&#xff0c;通…

御黑行动来袭--助力三月重保,构筑安全防线!

三月重保在即&#xff0c;重要网站及业务系统“零风险 零事故”是终极目标&#xff0c;作为业界网络安全实战派“老兵”--知道创宇将一如既往&#xff0c;为您提供重保期间“万无一失”的重要网站及业务系统防护。 值此三月重保的重要备战期&#xff0c;知道创宇推出由主力产品…

高灵敏度压电传感器频率温度特性测量中的TEC型精密温控系统

摘要&#xff1a;为解决石英晶体微量天平这类压电传感器频率温度特性全自动测量中存在的温度控制精度差和测试效率低的问题&#xff0c;本文在TEC半导体制冷技术基础上&#xff0c;提出了小尺寸、高精度和全自动程序温控的解决方案&#xff0c;给出了温控装置的详细结构和实现高…

计算机网络常见面试题总结

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。 TCP/IP五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&#xff1a;为应用程序提供交互服务。在互联网中的…

一、产品经理——【岗位和能力要求】【项目流程】【产品体验报告】

0. 产品经理课程路线图 产品基础阶段&#xff1a;核心目的是了解行业、掌握技能 1. 认识互联网行业 1.1. 传统行业 vs 互联网行业 1.2. 互联网行业概念 1.3. 小结 2. 认识产品经理 2.1. 不同场景下的产品经理的职责差异 公司团队、领导对产品经理的期望不同&#xff0c;做的…

交叉编译的概念及交叉编译工具的安装

目录 一.什么是交叉编译 二.为什么要交叉编译&#xff1f; 三.交叉编译链的安装 四.相关使用方法 五.软连接 一.什么是交叉编译 交叉编译是指将一种编程语言编写的程序编译成另一种编程语言的程序&#xff0c;通常是在不同的操作系统或硬件环境中使用的。这种编译过程会产…