产品介绍

image.png
ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数科等多家大型互联网企业的考验,在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。

ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中。

其中,ShardingJDBC是用来做客户端分库分表的产品,而ShardingProxy是用来做服务端分库分表的产品

ShardingJDBC:
image.png
shardingJDBC 定位为轻量级 java 框架,在 java 的 JDBC 层提供的额外服务;它使用客户端直接连接数据库,以 jar 包形式提供服务,无需外部部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架;

ShardingProxy:
image.png
shardingProxy 定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持;目前提供 mysql 和 postgresql 版本;

ShardingJDBC实战

ShardingJDBC 是整个 ShardingSphere 最早也是最为核心的一个功能模块,主要功能就是数据分片和读写分离,通过 ShardingJDBC,应用可以透明的使用 JDBC 访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布;

核心概念

  1. 逻辑表:水平拆分的数据库的相同逻辑和数据结构表的总称
  2. 真实表:在分片的数据库中真实存在的物理表
  3. 数据节点:数据分片的最小单元;由数据源名称和数据表组成
  4. 绑定表:分片规则一致的主表和子表
  5. 广播表:也叫公共表,指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中都完全一致
  6. 分片键:用于分片的数据库字段,是将数据库(表)进行水平拆分的关键字段;sql 中若没有分片字段,将会执行全路由,性能很差
  7. 分片算法:通过分片算法将数据进行分片
  8. 分片策略:真正用于进行分片操作的是分片键+分片算法,也就是分片策略

    快速实战

    先运行一个简单实例,来看下 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}