聊聊 Sharding-JDBC 分库分表(三)
Sharding-JDBC 实战
上述内容基本介绍了Sharding-JDBC的基本知识点,下面通过 Spring Boot + Sharding-JDBC 的方式实战演示一下。
1. Sharding-JDBC 的 pom 依赖
想要使用Sharding-JDBC只需要添加一个maven依赖即可,如下:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
“笔者这里使用的版本为:4.1.1”
“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9532 获取!”
2. 垂直分表、分库
垂直切分一般针对数据行数不大,但是单行的某些字段数据很大,表占用空间很大,检索的时候需要执行大量的IO,严重降低性能,此时需要将拆分到另外一张表,且与原表是一对一的关系,这就是垂直分表。
比如商品表中的商品描述数据很大,严重影响查询性能,可以将商品描述这个字段单独抽离出来存储,这样就拆分成了两张表(垂直分表),如下图:
垂直分表
通过垂直分表性能得到了一定程度的提升,但是还没有达到要求,并且磁盘空间也快不够了,因为数据还是始终限 制在一台服务器,库内垂直分表只解决了单一表数据量过大的问题,但没有将表分布到不同的服务器上,因此每个 表还是竞争同一个物理机的CPU、内存、网络IO、磁盘。
此时就需要进行垂直分库,如下之前是在单独的卖家库存储的,现在需要将商品的信息给垂直切分出去,分成了两个库:商品库product_db、店铺库shop_db:
垂直分库
方案已经有了,那么现在就需要用Sharding-JDBC去实现。
“product_db和shop_db的SQL会放在源码中,这里就不再贴了”
Sharding-JDBC 使用非常简单,只需要在配置文件中指定数据源信息和切片规则即可实现分库分表。
这里支持三种配置,如下:
- yml配置文件
- properties配置文件
- Java Config 编码配置
这里笔者使用的是第一种yml配置方式,详细配置如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
datasource:
# 数据源,这里配置两个,分别是ds1,ds2
names: ds1,ds2
# ds1的配置信息,product_db1
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/product_db?useUnicode=true&characterEncoding=utf-8
username: root
password: Nov2014
# ds2的配置信息,shop_db
ds2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf-8
username: root
password: Nov2014
# 分片的配置
sharding:
# 表的分片策略
tables:
## product_base是逻辑表的名称
product_base:
# 数据节点配置,采用Groovy表达式,切分之后的真实表所在的节点
actual-data-nodes: ds$->{1}.product_base
# 主键生成策略
key-generator:
# 主键
column: product_id
# 生成算法
type: SNOWFLAKE
product_description:
# 数据节点配置,采用Groovy表达式
actual-data-nodes: ds$->{1}.product_description
shop:
# 数据节点配置,采用Groovy表达式
actual-data-nodes: ds$->{2}.shop
# 主键生成策略
key-generator:
# 主键
column: shop_id
# 生成算法
type: SNOWFLAKE
props:
sql:
# 日志显示具体的SQL
show: true
上述配置非常简单,分为如下几个步骤:
1、数据源配置
由于垂直分库涉及到shop_db,product_db,肯定是要配置两个数据源,如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
datasource:
# 数据源,这里配置两个,分别是ds1,ds2
names: ds1,ds2
# ds1的配置信息,product_db1
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/product_db?useUnicode=true&characterEncoding=utf-8
username: root
password: Nov2014
# ds2的配置信息,shop_db
ds2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop_db?useUnicode=true&characterEncoding=utf-8
username: root
password: Nov2014
这个很好理解,两个数据源名称分别为ds1,ds2,自己任意取名,然后配置相关信息。
2、数据节点配置
这里数据节点很重要,你要告诉Sharding-JDBC 你要操作的那张表在哪个库中,对应表的名称。
上述涉及到三张表,分别是shop、product_base、product_description,因此需要配置三个数据节点,如下:
spring:
# Sharding-JDBC的配置
shardingsphere:
# 分片的配置
sharding:
# 表的分片策略
tables:
## product_base是逻辑表的名称
product_base:
# 数据节点配置,采用Groovy表达式,切分之后的真实表所在的节点
actual-data-nodes: ds$->{1}.product_base
product_description:
# 数据节点配置,采用Groovy表达式
actual-data-nodes: ds$->{1}.product_description
shop:
# 数据节点配置,采用Groovy表达式
actual-data-nodes: ds$->{2}.shop
ds$->{1} 采用的是Groovy表达式,表示ds1
数据节点要具体到指定的数据库、表名。
“spring.shardingsphere.sharding.default-data-source-name=ds1可以指定默认的数据源”
文章转自公众号:码猿技术专栏