- 产品介绍
- ShardingJDBC实战
- 垂直分表策略
- 配置真实数据源
- 配置第 1 个数据源
- 指定表的分布情况 配置表在哪个数据库里,表名是什么。水平分表,分两个表:m1.course_1,m1.course_2
- 指定表的主键生成策略
- 雪花算法的一个可选参数
- 使用自定义的主键生成策略
- spring.shardingsphere.sharding.tables.course.key-generator.type=MYKEY
- spring.shardingsphere.sharding.tables.course.key-generator.props.mykey-offset=88
- 指定分片策略 约定cid值为偶数添加到course_1表。如果是奇数添加到course_2表。
- 选定计算的字段
- 根据计算的字段算出对应的表名。
- 打开sql日志输出。
产品介绍

ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多家大型互联网企业的考验,在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。
ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中。
其中,ShardingJDBC是用来做客户端分库分表的产品,而ShardingProxy是用来做服务端分库分表的产品
ShardingJDBC:
shardingJDBC 定位为轻量级 java 框架,在 java 的 JDBC 层提供的额外服务;它使用客户端直接连接数据库,以 jar 包形式提供服务,无需外部部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架;
ShardingProxy:
shardingProxy 定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持;目前提供 mysql 和 postgresql 版本;
ShardingJDBC实战
ShardingJDBC 是整个 ShardingSphere 最早也是最为核心的一个功能模块,主要功能就是数据分片和读写分离,通过 ShardingJDBC,应用可以透明的使用 JDBC 访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布;
核心概念
- 逻辑表:水平拆分的数据库的相同逻辑和数据结构表的总称
- 真实表:在分片的数据库中真实存在的物理表
- 数据节点:数据分片的最小单元;由数据源名称和数据表组成
- 绑定表:分片规则一致的主表和子表
- 广播表:也叫公共表,指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中都完全一致
- 分片键:用于分片的数据库字段,是将数据库(表)进行水平拆分的关键字段;sql 中若没有分片字段,将会执行全路由,性能很差
- 分片算法:通过分片算法将数据进行分片
- 分片策略:真正用于进行分片操作的是分片键+分片算法,也就是分片策略
快速实战
先运行一个简单实例,来看下 ShardingJDBC 是如何工作的;application.properties ```java垂直分表策略
配置真实数据源
spring.shardingsphere.datasource.names=m1
配置第 1 个数据源
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/coursedb?serverTimezone=GMT%2B8 spring.shardingsphere.datasource.m1.username=root spring.shardingsphere.datasource.m1.password=root
指定表的分布情况 配置表在哪个数据库里,表名是什么。水平分表,分两个表:m1.course_1,m1.course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}
指定表的主键生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
雪花算法的一个可选参数
spring.shardingsphere.sharding.tables.course.key-generator.props.worker.id=1
使用自定义的主键生成策略
spring.shardingsphere.sharding.tables.course.key-generator.type=MYKEY
spring.shardingsphere.sharding.tables.course.key-generator.props.mykey-offset=88
指定分片策略 约定cid值为偶数添加到course_1表。如果是奇数添加到course_2表。
选定计算的字段
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column= cid
根据计算的字段算出对应的表名。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid%2+1}
打开sql日志输出。
spring.shardingsphere.props.sql.show=true
spring.main.allow-bean-definition-overriding=true ```
首先定义一个数据源 m1,并对 m1 进行实际的 JDBC 参数配置 spring.shardingsphere.sharding.tables.course 开头的一系列属性即定义了一个名为 course 的逻辑表 actual-data-nodes 属性即定义了 course 逻辑表的实际数据分布情况,分布在m1.course1和 m1.course_2两张表 key-generator 属性配置了它的主键列以及主键生成策略;默认提供了 UUID 和 SNOWFLAK 两种分布式主键生成策略 table-strategy 属性即配置它的分库分表策略;分片键为 cid,分片算法为 course$->{cid%2+1}
