ShardingSphere数据分片之读写分离

1、概述

读写分离是一种常见的数据库架构,它将数据库分为主从库,一个主库(Master)用于写数据,多个从库(Slave)进行轮询读取数据的过程。主从库之间通过某种通讯机制进行数据的同步。
所以,数据的读写分离是在数据库的主从复制基础上建立起来的。

数据库的主从复制可以参考之前的文章:Mysql8.0实现主从复制。

读写分离的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。这样可以有效地减轻主数据库的压力,提高数据库的并发性能和稳定性。

在这里插入图片描述

2、优缺点

优点:

  1. 减轻数据库压力:通过将读操作和写操作分开到不同的数据库服务器上,可以有效地减轻主数据库的压力,提高数据库的并发性能和稳定性。
  2. 提高性能:只读服务器没有写操作,可以大大减轻磁盘IO等性能问题,提高查询效率。同时,读服务器可以采用负载均衡,实现读操作的可伸缩性。
  3. 易于扩展:读写分离可以很容易地扩展到更多的数据库服务器上,以满足不断增长的业务需求。

缺点:

  1. 数据实时性差:数据不是实时同步到只读服务器上的,当数据写入主服务器后,要在下次同步后才能查询到。这可能导致数据不一致的问题。
  2. 数据量大时同步效率差:单表数据量过大时插入和更新因索引、磁盘IO等问题,性能会变的很差。这可能影响到只读服务器的性能和稳定性。
  3. 连接多个数据库:至少要连接到两个数据库,实际的读写操作是在程序代码中完成的,容易引起混乱。这增加了开发和维护的复杂性。

3、SpringBoot整合实现

使用SpringBoot对ShardingSphere的基本整合可以浏览之前的文章:
ShardingSphere数据分片之分表操作。

因为是SpringBoot整合ShardingSphere,所以我们只需要配置Yaml文件便可以轻松的实现数据库的读写分离。

3.1、引入依赖

CSDN上很多博客都使用的是sharding-jdbc-spring-boot-starter依赖,但是这个依赖是很久以前的了,在需求日益增长的现在,还是要紧跟时代比较好,所以我就用了离现在不是很久的依赖。

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

3.2、配置YAML文件

这里结合了读写分离 + 分表的操作,所以YAML文件的配置就比较多。

spring:shardingsphere:props:sql-show: true # 展示shardingSphere对SQL的处理datasource: # 配置真实的数据源master: # 主数据库username: rootpassword: 123456url: jdbc:mysql://wangwu_mysql:3306/mysql_test?serverTimezone=Asia/Shanghai # zhoujn.e3.luyouxia.net:11580type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverslave: # 从数据库username: rootpassword: 123456url: jdbc:mysql://zhangsan_mysql:3306/mysql_test?serverTimezone=Asia/Shanghaitype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Drivernames: masterrules: # 配置路由规则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_ROBIN # 明确的策略sharding: # 数据分片配置sharding-algorithms: # 数据分片算法配置table-inline:type: INLINEprops:algorithm-expression: test_$->{id % 2}tables: # 表的分片配置logic_table_name:actual-data-nodes: read-write-datasource.test_${0..1}table-strategy:standard:sharding-column: idsharding-algorithm-name: table-inlinemode:type: Memoryrepository:type: JDBC

load-balancers.type从库访问策略可以是以下的值:

参数名称描述
ROUND_ROBIN轮询负载均衡器。按照顺序依次将请求分配给每个分片,当所有分片都处理完后再从头开始分配。
LEAST_ACTIVE最少活跃调用负载均衡器。选择当前活跃请求数最少的分片作为目标分片。
LEAST_CONNECTION最少连接负载均衡器。选择当前连接数最少的分片作为目标分片。
RANDOM随机负载均衡器。随机选择一个分片作为目标分片。
LEAST_RESPONSE_TIME最少响应时间负载均衡器。选择当前响应时间最少的分片作为目标分片。

注意点:
在使用读写分离时,actual-data-nodes参数所对应的真是表的名称不再是Master或者Slave,而是rules.readwrite-splitting.data-sources下自定义是读写分离数据库的名称。
否则读写分离不会成功。

其他的分库分表参数请浏览:ShardingSphere数据分片之分表操作。

3.3、代码层面

整合了ShardingSphere后代码层面还是和日常的编写方式一样就可以了。

3.3.1、controller

@RestController
@RequiredArgsConstructor
public class shardingController {private final TestServiceImpl testService;@GetMapping(value = "/add")public String addData(){for(int i = 1; i <= 10; i++){// 此处的操作一定是在Master库中执行的testService.save(new Test().setTestName("data_" + i).setId(i));}return "插入完成";}@GetMapping(value = "/list")public List<Test> list(){// 此处的操作一定是在Slave库中执行return testService.list();}}

3.3.2、service

@Service
public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements IService<Test> {
} 

3.3.3、mapper

@Mapper
public interface TestMapper extends BaseMapper<Test> {
}

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

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

相关文章

React Native android环境搭建,使用夜神模拟器进行开发(适用于0.73+版本)

前言 本文基于&#xff1a;“react-native” : “^0.73.0” 1.安装 Node Node.js&#xff0c;下载时选择 > 18 版本 2.下载并安装 JDK Java SE Development Kit (JDK)&#xff0c;下载时选择 17 版本 安装 验证是否安装成功 打开命令提示符输入 javac -version 回车 3.…

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09;。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中&#xff0c;对于可变和不可变对象的行为差异是一个重要概念&#xff0c;特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先&#xff0c;让我们谈谈可变和不可…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion替换背景

在Stable Diffusion软件中,使用ControlNet+模型实现固定物体批量替换背景 出图的流程。 一、准备好图片 1.你需要准备好一些白底图或者透明底图用于训练模型。 2.你需要准备同样角度的其他背景色底图用于ControlNet勾线 3.注意检查你的图片尺寸,是否为1:1,…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

svn使用步骤

服务器端主要用来创建仓库&#xff0c;然后供客户端去访问与下载。 客户端&#xff1a; 图形化界面的使用&#xff1a;这里使用的是tortoise工具 1.创建一个文件夹作为自己的本地仓库目录 2.鼠标右键文件夹&#xff0c;在菜单中点击SVN checkout 3.找个图 这一步骤相当于git中…

最新版xposed编写教程

环境&#xff1a; andriod studio2023.1.1 jdk17 gradle8.2 流程&#xff1a; 1.新建项目&#xff0c;选empty views activity即可&#xff08;其他也可&#xff09; 2.语言选java&#xff0c;其他路径名称等暗战自己需要随便改&#xff0c;然后点击finish 3.修改AndroidMan…

茶室茶楼计时计费软件,软件中的商品管理计时操作教程

一、前言 茶室在营业的时候&#xff0c;不但需要计时间&#xff0c;同时还需要管理商品入库出库库存等管理。这就需要一款实用的操作简单的管理软件。 下面以 佳易王茶社计时计费软件V18.0为例说明&#xff0c;其他版本可以参考本教程。 软件下载或技术支持可以点击最下方官…

和利时DCS数据采集

在工业自动化领域&#xff0c;和利时DCS&#xff08;分布式控制系统&#xff09;被广泛应用&#xff0c;它对于工厂的生产过程和设备管理起到了重要的作用。然而&#xff0c;对于和利时DCS数据的采集&#xff0c;很多工厂面临着一些难点。本文将介绍和利时DCS的概述&#xff0c…

C语言—每日选择题—Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

智慧港口解决方案:PPT全文69页,附下载

关键词&#xff1a;智慧港口解决方案&#xff0c;数字化港口&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头&#xff0c;智慧港口发展趋势 一、智慧港口建设背景 随着数字经济、智慧交通发展&#xff0c;强调“要大力发展智慧交通和智慧物流”“努力打造世界一流的…

LAMP与LNMP架构

目录 一、概述 二、各组件的主要作用 一. 编译安装Apache httpd服务 二. 编译安装mysqld 服务 三. 编译安装PHP 解析环境 四. 安装论坛 LNMP架构 一、编译安装Nginx 二、编译安装MySQL服务 三、安装配置php文件 四、部署论坛 扩展 fpm参数优化 一、概述 LAMP架构是…

TCP/IP详解——UDP 协议

文章目录 1. UDP1.1 UDP 头部1.2 UDP 校验和1.3 UDP 传输过程1.4 UDP-Lite1.5 最大 UDP 数据报长度1.6 UDP 输入队列 1. UDP UDP&#xff1a;用户数据报协议&#xff08;User Datagram Protocol&#xff09;面向无连接的&#xff0c;也就是无需建立连接&#xff0c;传输不可靠。…

宏景eHR SQL 注入漏洞复现(CVE-2023-6655)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 中发现了一种被分类为关键的漏洞,该漏洞影响了Login Interface组件中/w_selfservice/oauthservlet/%2e../.%2e/genera…

ICV:2023 年上半年全球量子计算的进展

​ 2023年上半年&#xff0c;量子计算&#xff08;QC&#xff09;领域取得了一系列重要进展和突破&#xff0c;显示出量子计算技术的快速发展和商业应用的不断拓展。本报告从制度进步、产业生态、投融资形势、总结与展望四个方面对量子计算领域进行了系统而详细的分析。报告不仅…

每天一点python——day94

#每天一点Python——94 #面向对象的三大特征——封装 封装&#xff1a;隐藏内部细节&#xff0c;对外提供操作方式。【提高程序的安全性】 继承&#xff1a;在函数调用时&#xff0c;使用’形参名称值‘的方式进行传参&#xff0c;传递参数的顺序可以与定义时参数顺序不同【提高…

push和扩展运算符...引发的问题

文章目录 一、问题二、原因三、解决3.1、使用拓展运算符...合并&#xff08;推荐使用&#xff09;3.2、使用concat合并3.3、循环push 四、最后 一、问题 const items [] const newItems new Array(1000000) items.push(...newItems)上面代码会出现如下错误&#xff1a; Unc…

从零开始搭建企业管理系统(七):RBAC 之用户管理

RBAC 之用户管理 创建表&#xff08;Entity&#xff09;用户表角色表权限表用户角色表关系注解ManyToMany 角色权限表 接口开发UserControllerUserServiceUserServiceImplUserRepository 问题解决update 更新问题懒加载问题JSON 循环依赖问题 根据上一小结对表的设计&#xff0…

【面试】测试/测开(NIG2)

145. linux打印前row行日志 参考&#xff1a;linux日志打印 前10行日志 head -n 10 xx.log后10行日志 tail -n 10 xx.log tail -10f xx.log使用sed命令 sed -n 9,10p xx.log #打印第9、10行使用awk命令 awk NR10 xx.log #打印第10行 awk NR>7 && NR<10 xx.log …

H3C ER G2系列路由器信息泄露漏洞

H3C ER G2系列路由器信息泄露漏洞 免责声明漏洞描述漏洞影响漏洞危害漏洞页面漏洞复现1. 构造poc2. 发生数据包&#xff0c;获取密码3. 登录系统 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平。 任何人不得利用该文章…