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;让我们谈谈可变和不可…

【INTEL(ALTERA)】 quartus使用Nios® V 处理器系统仿真失败,没有打印输出消息

说明 在 Synopsys* VCS* 和 VCS* MX 仿真器中模拟由以下位置生成的 Nios V 处理器系统时&#xff0c;可能会出现该问题&#xff1a; 英特尔 Quartus Prime Pro Edition 软件版本 23.1 至 23.4&#xff0c;或 英特尔 Quartus Prime Standard Edition 软件版本 23.1std 这是由…

位运算技巧

获取某个10进制数值的二进制最高位 public class Main {public static void main(String[] args) {// 调用 highBit 函数&#xff0c;传入参数 67int result highBit(67);// 输出结果的二进制表示System.out.println(Integer.toBinaryString(result)); // 输出 1000000}/***…

打工人副业变现秘籍,某多/某手变现底层引擎-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…

调用接口 Promise.all的简单使用方式

created() {const requests [axios.get(/api/data1),axios.get(/api/data2),axios.get(/api/data3)];Promise.all(requests).then(responses > {// 处理响应数据const data1 responses[0].data;const data2 responses[1].data;const data3 responses[2].data;// ...}).c…

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

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

【Python基础】线程

文章目录 [toc]线程与进程的区别与联系同步任务示例 并发任务示例 线程方法thread_object.start()thread_object.join()thread_object.setDaemon()thread_object.current_thread() 线程与进程的区别与联系 线程是可以被计算机CPU调度的最小单元进程是计算机分配资源&#xff0…

和利时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;传输不可靠。…

成绩分析。

成绩分析 题目描述 小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100分&#xff0c;每个学生的得分都是一个0到100的整数。 请计算这次考试的最高分、最低分和平均分 输入描述 输入的第一行包含一个整数n(1n104)&#xff0c;表示考试人数。 接下来n行&#xff0c;每行包含…

K8S 常用命令

获取所有的pod资源&#xff1a; kubectl get pod 获取所有的命名空间&#xff1a; kubectl get namespace 获取所有的Deployment资源&#xff1a; kubectl get deployment 删除指定的deploy: kubectl delete deploy nginx 获取所有的服务&#xff1a; kubectl get serv…

用liblas将点云写入las文件

用liblas将点云写入las文件 首先配置liblas库&#xff0c;可以见上一篇博客 inline int writeLas(string lasPath, Points3Ds pt3Ds) {//point3ds是我自己定义的结构std::ofstream ofs;ofs.open(lasPath, std::ios::out | std::ios::binary);if (!ofs.is_open()) {std::cerr …