MySQL高性能读写分离实战

介绍

我的上一篇文章实现了mysql的主从复制结构,今天这篇继续将如何实现读写分离。

读写分离是指:针对数据库的写操作(插入、更新、删除等)访问主数据库,读操作访问从数据库。

因为一般网站的读请求的数量是远远大于写请求的,所以读写分离模式往往可以有效的提升系统的性能的。

读写分离属于应用层面上的实现,思路也比较简单,就是手动解析数据库请求,如果是读请求就将其转发到从数据库,如果是写请求就将其转发到主数据库。不过要写好还是比较难的,涉及到对JDBC的二次封装、负载均衡等。目前市面上已有比较成熟的方案,比如MySQL Router(官方),Apache shardingsphere 等。

Apache shardingsphere 是目前比较流行的实现方式,本篇文章也使用该框架实现读写分离。

Apache shardingsphere 简介

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。

功能有:读写分离,数据分片、分布式事务、数据迁移、数据加密、联邦查询、影子库等功能。

主要有以下两部分构成:

ShardingSphere-JDBC
ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。是在开发时需要引入的框架。

ShardingSphere-Proxy
ShardingSphere-Proxy 定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。
在这里插入图片描述

官网地址:Apache ShardingSphere

针对 Springboot 项目的实现

引入依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.1.1</version>
</dependency>

这个依赖不止有一种,至少有三种,都可以实现读写分离,可能需要配置的东西不太一样,本文方的是Apache 官方的比较新的版本,老的版本坐标中间没有core

在application.yaml文件中配置

spring:shardingsphere:props:sql-show: true	显示打印sql语句datasource:	# 配置主从数据库names: master, slave # 主从数据库的名字,自定义master:	# 数据库的详细配置,名字跟上面的名字对应username: rootpassword: url: jdbc:mysql://localhost:3306/db_name?serverTimezone=UTC&useSSL=falsetype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverslave:username: rootpassword: url: jdbc:mysql://localhost:3307/db_name?serverTimezone=UTC&useSSL=falsetype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverrules:	# 在这里配置读写分离、数据分片等功能的规则readwrite-splitting:	# 读写分离配置data-sources:	# 配置数据源read-write-datasource:type: Static  # 静态配置,配置的选项来自同一个YAML文件的datasource参数props:write-data-source-name: master	# 配置写库的名字read-data-source-names: slave # 读库的配置,多个从库之间使用逗号进行隔开load-balancer-name: round-robin # 多个读库之间采用的负载均衡策略,这里是轮询策略load-balancers:round-robin:type: ROUND_ROBINmode:type: Memoryrepository:type: JDBC

这样就配置完了,其他业务逻辑代码不需要更改,就跟使用单数据库时一样正常写mapperservicecontroller 等代码。

负载均衡:

验证

本人首先写了一个查询管理员账号的读操作的Controller,验证读请求是否被转发到从库上去。
在这里插入图片描述
在浏览器上输入请求地址,查看控制台日志:
在这里插入图片描述
可以看到日志输出的是 slave,读请求顺利转发到从数据库上。
继续写一个插入管理员表的api,验证写请求:
在这里插入图片描述
日志显示请求的是主库,验证成功。

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

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

相关文章

QLabel 添加滚动条

方式1 直接创建label QLabel *label new QLabel;// 加载图片QPixmap pixmap("path_to_your_image.jpg"); // 替换为你的图片路径label->setPixmap(pixmap);// 创建一个QScrollArea&#xff0c;并设置其为垂直滚动QScrollArea *scrollArea new QScrollArea;scro…

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff…

【Python机器学习】决策树的构造——划分数据集

分类算法除了需要测量信息熵&#xff0c;还需要划分数据集&#xff0c;度量划分数据集的熵&#xff0c;以便判断当前是否正确划分了数据集。 我们将对每个特征划分数据集的结果计算一次信息熵&#xff0c;然后判断按照哪个特征划分数据集是最好的划分方式。 想象一个分部在二…

4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性 这里的 t t t表示层&#xff0c;假设 h t − 1 h^{t-1} ht−1是第 t − 1 t-1 t−1层隐藏层的输出&#xff0c;经过一个 f t f_{t} ft​得到第 t t t层隐藏层的输出 h t h^{t} ht。 y y y表示 x x x进来&#xff0c;第一层一直到第 d d d层&#xff0c;最后到一个损…

域名解析流程:从浏览器输入URL到网页加载的全过程

本文概括了用户从在浏览器中输入一个网址到最终浏览器加载并显示网页的整个流程&#xff0c;特别强调了DNS解析的关键作用。 当用户在浏览器中输入一个网址&#xff08;HTTP请求&#xff09;并寻找对应的IP地址时&#xff0c;会经历以下流程&#xff1a; 1. **输入URL**&…

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;产品经理可以学学Axure快…

vscode远程免密登入

1、windows (1) 点击左下角 ->将当前窗口连接到主机…->&#xff08;配置ssh文件&#xff0c;点击或者指定&#xff09;->按这个格式添加 (2) 在cmd命令窗口&#xff1a;ssh-keygen -t rsa (-C “name”) #这个name是远程linux的用户名&#xff0c;这里也可以不加-C…

H264编码器实现-帧内预测之像素值预测

前言 本文所介绍的像素值预测&#xff0c;是指在帧内预测总体流程中的预测块每个像素值的推导过程。当我们已知向量像素的重建值的时候&#xff0c;我们就可以对当前预测块进行像素值预测。该过程得到的结果将与源像素值相减得到残差&#xff0c;为后续变换量化提供数据来源。…

Godot入门 04平台设计

新建创景&#xff0c;添加AnimatableBody2D节点。 添加Sprite2D节点 拖动图片 剪裁图片&#xff0c;吸附模式&#xff1a;像素吸附 添加CollisionShape2D&#xff0c;设置实际形状为矩形 重命名AnimatableBody2D节点为Platform&#xff0c;保存场景&#xff0c;拖动platform场景…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

Python——Pandas(第一讲)

文章目录 安装设定系统环境 Series对象创建DataFrame对象创建Pandas中的Index导入Excel文件导入csv文件导入txt文件保存数据保存数据至外部文件 了解数据head()与 tail()info()shapedescribe() 列操作修改变量列筛选变量列删除变量列添加变量列根据新数据添加根据原数据添加 Pa…

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…

计算机概述

1.1 计算机的发展历程 工认的第一台计算机ENIAC于1946年诞生。计算机的发展一般分为四个阶段&#xff1a;第一阶段为电子管计算机时代&#xff1b;第二阶段为晶体管计算机时代&#xff1b;第三阶段为集成电路计算机时代&#xff1b;第四阶段为大规模集成电路时代…

软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能…

“消费增值风暴:百万业绩背后的创新电商模式“

今日&#xff0c;我怀着无比激动的心情&#xff0c;向您揭示一个激励人心的成长篇章。我们的战略伙伴在短短一个月内&#xff0c;业绩如火箭般攀升&#xff0c;成功跨越百万销售额大关&#xff0c;同时&#xff0c;其用户活跃度居高不下&#xff0c;日均在线用户数稳稳占据8至1…

[Unity] ShaderGraph实现镜头加速线/残血效果 URP

效果如下所示&#xff1a;残血状态时&#xff0c;画面会压暗角&#xff0c;并出现速度线营造紧迫感。 使用到的素材如下&#xff0c;换别的当然也可以。[这是张白色的png放射图&#xff0c;并非皇帝的新图hhh] 这个效果的实现逻辑&#xff0c;其实就是利用time向圆心做透明度的…

【ai】Easy-RAG 3: ImportError: cannot import name ‘BaseModel‘ from ‘pydantic‘

[Bug]: cannot import name ‘RootModel’ from ‘pydantic’ #1237 版本不匹配导致 ImportError: cannot import name ‘BaseModel’ from ‘pydantic’ /home/zhangbin/miniconda3/envs/Easy-RAG/bin/python /home/zhangbin/proj/06_rag/02_Easy-RAG/webui.py /home/zhangbi…

HAL库源码移植与使用之低功耗模式

低功耗特性对用电池供电的产品&#xff1a; 更小电池体积&#xff08;降低了大小和成本&#xff09; 延长电池寿命 电磁干扰更小&#xff0c;提高无线通信质量 电源设计更简单&#xff0c;无需过多考虑散热问题 电源供电区分为&#xff1a; 分为VDD供电区…

友思特应用 | 硅片上的光影贴合:UV-LED曝光系统在晶圆边缘曝光中的高效应用

导读 晶圆边缘曝光是帮助减少晶圆涂布过程中多余的光刻胶对电子器件影响的重要步骤。友思特 ALE/1 和 ALE/3 UV-LED 高性能点光源&#xff0c;作为唯一可用于宽带晶圆边缘曝光的 i、h 和 g 线的 LED 解决方案&#xff0c;可高效实现WEE系统设计和曝光需求。 晶圆边缘曝光及处…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统&#xff0c;和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…