一、前言
- 随着业务的迭代发展,并发量逐渐变大,在不考虑缓存等其他方案的前提下,数据库性能就可能出现瓶颈,为了解决并发性能,就需要进行读写分离,将流量进行分流,写操作走主库,读操作走从库,同时伴随着数据的增多,单库单表也会出现性能问题,通过分库分表对数据进行分治,从而提高性能. 不过读写分离和分库分表也会带来其他问题,比如主从延迟,分布式事务,跨库联表查询等等,所以要根据实际情况确定详细的方案.这里就不进行阐述.
二、集成ShardingSphere-JDBC
- ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。ShardingSphere官网
- 在实际的集成过程中,会遇到各种各样的问题,网上的文章大多数版本比较低,ShardingSphere版本更新变化也比较大,会出现各种依赖问题,配置格式不对,功能不生效等等.
- 版本号:spring 3.2.4 + ShardingSphere-JDBC 5.5.0
- pom的引入,shardingsphere-jdbc-core-spring-boot-starter作者不进行维护了,所以按照官网介绍引入指定的依赖.
- application 配置文件
- sharding 配置文件(重点)
yaml
dataSources:
ds0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/demo_ds?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: admin123
poolName: test0
minPoolSize: 2
maxPoolSize: 20
ds1:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: admin123
poolName: test1
minPoolSize: 5
maxPoolSize: 20
ds2:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: admin123
poolName: test2
minPoolSize: 5
maxPoolSize: 20
rules:
# - !SINGLE
# tables:
# - "*.order_*"
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
writeDataSourceName: ds0
readDataSourceNames:
- ds1
- ds2
loadBalancerName: ROUND_ROBIN
loadBalancers:
ROUND_ROBIN:
type: ROUND_ROBIN
- !SHARDING
# autoTables:
# order:
# actualDataSources: ds1,ds2
# shardingStrategy:
# standard:
# shardingColumn: order_id
# shardingAlgorithmName: auto_mod
tables:
order:
actualDataNodes: readwrite_ds.order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: order_inline
# complex:
# shardingColumns: customer_id,order_id
# shardingAlgorithmName: customer
defaultTableStrategy:
none:
shardingAlgorithms:
auto_mod:
type: MOD
props:
sharding-count: 2
order_inline:
type: INLINE
props:
algorithm-expression: order_${order_id % 2}
customer:
type: CLASS_BASED
props:
strategy: COMPLEX
algorithmClassName: com.example.shardingsphere.service.CustomerShardingAlgorithm
- !MASK
tables:
order:
columns:
delivery_address:
maskAlgorithm: keep_first_n_last_m_mask
maskAlgorithms:
keep_first_n_last_m_mask:
type: KEEP_FIRST_N_LAST_M
props:
first-n: 1
last-m: 2
replace-char: '*'
props:
sql-show: true
# sql-simple: true
- 注意点:
- 图中画线的要注意,使用内置的分片策略要配合自动分片标签配置,官网只有简单场景的配置示例,所以在实际业务配置过程中容易出现问题,看了github的issues大多数都是配置不正确导致的,当时觉得官网文档不能覆盖各种场景,配置过于复杂,后来发现作者在examples模块做了说明,并且可以生成各种配置示例.
- demo链接:github.com/huang-xuan/...