👩🏽💻个人主页:阿木木AEcru
🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》
💹每一次技术突破,都是对自我能力的挑战和超越。
Docker部署MYSQL主从详细教程-阿木木AEcru-CSDN
那天写了 部署mysql主从后,想了想,还是有必要出多一篇关于ShardingSphere-JDBC 读写分离、分库分表的文章,做就得做全套,那么今天就来实现一下。
目录
一、前言
首先我们得知道读写分离以及分库分表的基本概念。
1.1 读写分离是什么?
读写分离其核心思想是将数据库的读操作(查询)和写操作(插入、更新、删除)分离到不同的数据库服务器上。这样做是为了提高数据库系统的处理能力和伸缩性,同时减轻单个数据库服务器的负载。
这就是为什么需要主库和从库的原因了,大部分的写操作都是在 主库进行操作的,而从库则承担了读操作,如果说需要更加的高可用的话,可以部署多出多从的架构。将读写操作分担导了不同的节点,更有利于服务的稳定性。不会说某一台的负载特别高。
1.2 分库分表是什么?
分库就是根据根据业务耦合性将一个库中的多张表拆分出来独立到另外一个库。例如在微服务结构中就需要分库,因为一个服务就需要一个库,而分库的粒度也是取决于你服务的粒度。
分表有两种分表的方式,垂直分表以及水平分表。
垂直分表:是将一个表中的一部分字段抽离出来做一个冗余的表,当一个表的字段非常多,且某些字段的访问频率较低或字段较大时,这时就非常适合使用垂直分表,将访问频率大的字段、或者较大(存储字符较多) 的字段抽离出来独立一张表。这样单张表的数据量就不会太大,从而提高查询效率
水平分表:当单表行数非常大,导致查询和更新操作变慢时,这时就适合使用水平分表, 将表的数据按照某种规则(如用户ID、时间等)分散到多个表中,每个表包含完整的表结构,但是数据是分散的。 这样单张表的行数就不会太大,一般单张表建议是在500w行左右。
总的来说,其实分表就是为了使得单张表的数据量不会过大而影响查询效率,当然最佳优化肯定还是需要优化查询SQL以及索引等方式来进行调优。
好了,了解了什么是读写分离以及分库分表后,就进入了今天的主题了,我们接着往下看。
二、ShardingSphere-JDBC 实现 读写分离
ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。ShardingSphere官网
2.1 读写分离逻辑
读写分离则是根据 SQL 语义的分析,将读操作和写操作分别路由至主库与从库。需要注意的是,shardingSphere 不会帮你实现数据库的主从同步,这个就需要你自己去配置数据库了,文章开头也有mysql配置主从的教程链接,感兴趣的小伙伴可以去看看。
与ShardingSphere-proxy对比
这里简单讲讲ShardingSphere-proxy,它实际上是再请求到实际的数据库之前做了一层代理,请求先到了ShardingSphere-proxy 上,然后通过一系列的算法将sql分散在不同的数据库节点。这样的好处也就是不用每个服务都独立配置,只需要配置这一层代理就行了。坏处就是需要独立占用服务器的资源,处理请求的瓶颈也会转移到它这里。 这就有点像 Mycat了,感兴趣的小伙伴可以去了解一下。
2.2 实现读写分离
下面我将会通过一个demo来演示。主要代码我会在后面的贴出来。需要源码的可以私信博主。
这是demo的项目结构。
2.3 pom文件
<dependencies>
<!--SpringBoot相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--Shardingjdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core</artifactId