文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!!
文章内容将分开发布,便于平时查阅。
基于yaml基本配置
- 在application.yml配置文件中对mybatis-plus做简单的配置,这里不对Mybatis-Plus做主要配置讲解,像@MapperScan其他配置先自行了解。
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印sql,后续可以与sharding打印的sql做对比,更加直观发现区别
mapper-locations: classpath*:mybatis/*.xml # mapper.xml的路径
- 新建一个application-sharding.yml文件,对sharding-jdbc进行配置,然后在application.yml中的active添加进去即可。
Sharding-JDBC简单介绍:定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。更详细的介绍可前往 ShardingSphere官网。
分库分表包含:(垂直分库|垂直分表|水平分库|水平分表)四种类型。需要详细了解可参考其他博主的博客:彻底搞清分库分表。
接下来,将根据不同需求的对sharding进行两种配置方式。
(1) 单库分表
# 单库分表
spring:
shardingsphere:
datasource:
names: db0 # 指定数据源名字,多数据源以逗号分隔
db0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sharding_test1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
sharding:
# default-data-source-name: db0 # 默认数据源
tables: # 具体分片规则配置
t_user: # 逻辑表名
key-generator-column-name: id # 主键
# key-generator: # 使用雪花算法id
# column: id
# type: SNOWFLAKE
actual-data-nodes: db0.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名)
# 分表规则
table-strategy:
inline: # 行表达式
sharding-column: uid
algorithm-expression: t_user_$->{uid%2} # 按模运算分配
# 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...)
binding-tables: t_user
props:
sql.show: true # 是否开启SQL显示
### actual-data-nodes 读取数据分表策略
### table-strategy.inline 添加数据分表策略
### table-strategy.inline.sharding-column 添加数据分表字段(根据哪个字段插入数据到那个表,如:uid)
(2) 分库分表。可先熟悉使用,后续会出集成到多数据源来更好的使用
spring:
shardingsphere:
datasource:
names: db0,db1 # 指定数据源名字,多数据源以逗号分隔
db0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sharding_test_1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
db1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sharding_test_2?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
sharding:
default-data-source-name: db0 # 默认数据源
tables: # 具体分片规则配置
t_user: #逻辑表名
key-generator-column-name: id # 主键
# key-generator: # 使用雪花算法id
# column: id
# type: SNOWFLAKE
actual-data-nodes: db$->{0..1}.t_user_$->{0..1} # 实际的数据节点(数据源名.逻辑表名)
# 分库规则
database-strategy:
inline: # 行表达式
sharding-column: id
algorithm-expression: db$->{id % 2}
# 分表规则
table-strategy:
inline: # 行表达式
sharding-column: uid
algorithm-expression: t_user_$->{uid % 2} # 按模运算分配
# sys_user: # 非设置为默认数据库的,数据库中不需要分表的可以这么配,表多时候会很麻烦,后面会讲一个配置多数据源的方法,更为简便
# actual-data-nodes: db1.sys_user
# table-strategy:
# none:
# any: none
# 绑定表规则,即逻辑表名。(例如t_user代表了t_user_0, t_user_1, t_user_2 ...)
binding-tables: t_user
props:
sql.show: true # 是否开启SQL显示
遇过的坑(注意):
-
原生自增主键有使用限制,不能将原生自增主键同时作为分片键使用。
由于ShardingSphere并不知晓数据库的表结构,而原生自增主键是不包含在原始SQL中内的,因此ShardingSphere无法将该字段解析为分片字段。如自增主键非分片键,则无需关注,可正常返回;若自增主键同时作为分片键使用,ShardingSphere无法解析其分片值,导致SQL路由至多张表,从而影响应用的正确性。
而原生自增主键返回的前提条件是INSERT SQL必须最终路由至一张表,因此,面对返回多表的INSERT SQL,自增主键则会返回零。
-
如果表中没有可以作为分片键的字段,我个人认为可以将表的主键改为成雪花算法id。对于分布式x项目或者分库的情况,则需要自定义分布式主键配置。后续也会出一篇文章专门写道。
-
如果只有部分数据库分库分表,我们是需要将不分库分表的表也配置在分片规则中,就像上面(2)中 被注释掉的sys_user所示那样。对于这部分具体配置说明以及我个人认为更好的配置,将在后续文章中写道。
-
默认的分库分表作者没有调试过,因为感觉自己项目只需要部分表的分库分表,除非你是所有表都都需要分库分表,你可以自己看文档试试。
-
由于MyBatis-Plus和Sharding-JDBC各自都有一套雪花算法来生成ID,下一篇文章将单独说明一下两者之间,作者在配置过程中所遇到的问题,以及解决方案。
-
分片的算法规则,不单只有inline表达式算法,还有像hint算法等等其他,后续会再出一篇文章讲解。
事先说明,该系列下的所有文章均为作者查阅很多配置资料后整理得出,主要用于个人记录学习的配置资料不涉及原理,仅作参考。