问题场景:
最近在学习ShardingSphere,跟着教程一步步做shardingJDBC,但是想在开启数据分片的时候还能使用读写分离,一直失败,开始是一直能读写分离,但是分偏见规则感觉不生效,一直好像是走不进去[sharding]这个配置中,后来debug调试可以找到相关配置,又感觉是什么代码给覆盖了或者不生效了。
问题解决:
后来找资料一直没有,看到教程下有人一直在问读写分离和数据分片没法一起使用吗?我就试了下关闭读写分离,真的就可以数据分片了,后来查资料:
单独的读写分离配置之后,数据分片就无法生效了,是两块分开的单独功能;如果既想使用读写分离又想数据分片,可以使用如下配置,主要看sharding->master-slave-rules设置。
spring:
shardingsphere:
props:
sql:
show: true # 参数配置,显示sql
datasource: # 配置数据源
# 给每个数据源取别名,下面的ds1,ds2,ds3任意取名字
names: master,salve1
# 给master-ds1每个数据源配置数据库连接信息
master:
# 配置druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3307/springboot?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
password: root
maxPoolSize: 100
minPoolSize: 5
# 配置ds2-slave
salve1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3308/springboot?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: root
password: root
maxPoolSize: 100
minPoolSize: 5
# 配置默认数据源
masterslave: # 配置数据源的读写分离,但是数据库一定要做主从复制
# 配置主从名称,可以任意取名字
name: ms
# 配置主库master,负责数据的写入
master-data-source-name: master
# 配置从库slave节点
slave-data-source-names: salve1
# 配置slave节点的负载均衡均衡策略,采用轮询机制
load-balance-algorithm-type: round_robin
sharding:
master-slave-rules: # 在使用数据分片功能情况下,配置读写分离功能
ds0: # 自定义一个虚拟数据源名字,用于自动路由下方主从数据源
masterDataSourceName: master # 指定主数据源
slaveDataSourceNames: # 指定从数据源
- salve1
loadBalanceAlgorithmType: round_robin
binding-tables:
- fa_user # 指明了分库分表要处理的虚拟表名字
tables:
# user_table 逻辑表名
fa_user:
# 数据节点:数据源$->{0..N}.逻辑表名$->{0..N}
actualDataNodes: ds0.fa_user_$->{2022..2023}
# 拆分库策略
# database-strategy:
# standard:
# sharding-column: create_time
# precise-algorithm-class-name: com.wpj.user.shardingSphere.UserDataBaseRule
# 拆分表策略
table-strategy:
standard:
sharding-column: create_time
precise-algorithm-class-name: com.wpj.user.shardingSphere.UserTableRule