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.hqwc.cn/news/276440.html

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

相关文章

【C语言】二分查找(详解)

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 一、二分查找的思路 二分查找是一种高效的查找算法&#xff0c;尤其适用于有序数组。它的基本思想是通过将查找区间逐步缩小…

企业打造高产出的新媒体运营团队的步骤有哪些?

企业在搭建新媒体矩阵的过程中&#xff0c;第一步是确定平台&#xff0c;第二步就是组建一个运营团队。 但组建一个高质量的运营团队并非容易的事情&#xff0c;很多企业可能都不知道&#xff1a; 不同规模的企业需要什么样的运营团队&#xff1f;运营团队中的不同岗位需要做哪…

【双十一特辑】爱心代码(程序员的浪漫)-李峋

前言 最近《点燃我温暖你》中李峋的爱心代码超级火&#xff0c;看着特别心动&#xff0c;这不&#xff0c;光棍节快到了&#xff0c;给兄弟们教学一波爱心代码&#xff0c;赶在双十一前表白&#xff0c;让这个双十一不在是孤单一个人&#xff01; 目录 前言 C语言简易爱心代码…

FPGA - 1、Simulink HDL coder模型例化到FPGA

Simulink HDL coder模型例化到FPGA 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右…

YOLOv8原理深度解读,超级详细

整体架构 Backbone&#xff1a; Feature Extractor提取特征的网络&#xff0c;其作用就是提取图片中的信息&#xff0c;供后面的网络使用 Neck &#xff1a; 放在backbone和head之间的&#xff0c;是为了更好的利用backbone提取的特征,起着“特征融合”的作用。 Head&#xf…

ChatGPT对话为什么不用WebSocket而使用EventSource?

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

记录 | ubuntu安装截图工具flameshot

安装步骤&#xff1a; 1、安装 sudo apt install flameshot# 执行程序安装在 /usr/bin/flameshot gui2、然后打开 系统设置 -> 设备 -> 键盘拉到最下方 &#xff0c;此处有个 “” 添加自定义快捷键&#xff0c;自定义完成后就可以进行截图啦;

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

解决Java中GB2312字符集缺失的汉字乱码问题

最近在做一个读取CSV文件&#xff0c;解析其中数据并入库的功能&#xff0c;使用的是OpenCSV组件&#xff0c;CSV文件字符集是GB2312&#xff0c;读取文件流时使用的也是GB2312字符集&#xff0c;但最终测试结果发现写入数据库的中文中存在乱码&#xff0c;奇怪的是同一个字段中…

随笔:AI PC这概念要“跑得快”,可能还是得看英特尔

来源 | 购机帮你评 作者 | 牛大叔 最近&#xff0c;PC圈儿都在热炒AI PC概念&#xff0c;无论是英特尔、AMD&#xff0c;还是PC厂商&#xff0c;都在大力宣传AI PC&#xff0c;意思大概是“AI PC是个人电脑未来的发展方向”。所以自然而然的&#xff0c;大家就开始热议一个话题…

虚拟路由冗余协议VRRP

VRRP简介 定义 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时&#xff0c;VRRP机制能够选…

一分钟带你了解电容

电容器中的电容究竟是怎么定义的&#xff1f; 一个电容器&#xff0c;如果带1库的电量时两级间的电势差是1伏&#xff0c;这个电容器的电容就是1法拉&#xff0c;即&#xff1a;CQ/U 。但电容的大小不是由Q&#xff08;带电量&#xff09;或U&#xff08;电压&#xff09;决定…