1 基本概念

1.1 ShardingSphere概述

官网:https://shardingsphere.apache.org/index_zh.html

1.2 分库分表概述

分库分表是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

● 水平分表

将一个表的数据按一定规则拆分到多个表结构相同的表中。

● 垂直分表

将一个表按照字段拆分成多个表,每个表存储其中一部分字段。

● 水平分库

同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。

● 垂直分库

按照业务将表分布到不同的数据库上,达到专库专用。

2 简单使用

第一步:创建数据库,执行脚本;

第二步:创建springboot工程,引入依赖;

    <!-- sharding-jdbc依赖 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>

第三步:编写测试相关代码;

第四步:编写配置文件,测试。

2.1 水平分表

策略:cid为偶数数据添加到course_db的course_0表,cid为奇数数据添加到course_db的course_1表。

配置:

# sharding-jdbc 水平分表

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true # 配置数据源,给数据源起名
spring.shardingsphere.datasource.names=ds # 配置数据
spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds.username=root
spring.shardingsphere.datasource.ds.password=1234 # 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 ds.course_0 ds.course_1
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds.course_$->{0..1} # 指定表分片策略
# cid为偶数数据添加到ds(course_db)的course_0表,cid为奇数数据添加到ds(course_db)的course_1表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2} # 指定course表里面主键cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE # 打开sql输出日志
spring.shardingsphere.props.sql.show=true

2.2 垂直分表

可直接手动拆分表实现。

2.3 水平分库

策略:sid是偶数数据添加到course_db_0的course表,sid是奇数数据添加到course_db_1的course表。

配置:

# sharding-jdbc 水平分库

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true # 配置数据源,给数据源起名
spring.shardingsphere.datasource.names=ds0,ds1 # 配置第一个数据源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/course_db_0?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=1234 # 配置第二个数据源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/course_db_1?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=1234 # 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 ds0.course d1.course
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds$->{0..1}.course # 指定数据库分片策略
# sid是偶数数据添加到ds0(course_db_0)的course表,sid是奇数数据添加到ds1(course_db_1)的course表
spring.shardingsphere.sharding.tables.course.database-strategy.inline..sharding-column=cid
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=ds$->{cid % 2} #spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=cid
#spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{cid % 2} # 指定course表里面主键cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE # 打开sql输出日志
spring.shardingsphere.props.sql.show=true

2.4 垂直分库

策略:操作course表调用course_db,操作student表调用student_db。

配置:

# sharding-jdbc 垂直分库

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true # 配置数据源,给数据源起名
spring.shardingsphere.datasource.names=m0,m1 # 配置第一个数据源
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=1234 # 配置第二个数据源
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/student_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=1234 # 操作course表调用m0(course_db),操作student表调用m1(student_db)
# 配置student表分布情况
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m0.course # 指定student表里面主键sid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE # 配置student表分布情况
spring.shardingsphere.sharding.tables.student.actual-data-nodes=m1.student # 指定student表里面主键sid生成策略
spring.shardingsphere.sharding.tables.student.key-generator.column=sid
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE # 打开sql输出日志
spring.shardingsphere.props.sql.show=true

2.5 广播表

策略:添加、删除dictionary表数据时,同时操作course_db中dictionary表与student_db中dictionary表。

配置:

# sharding-jdbc 操作广播表

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true # 配置数据源,给数据源起名
spring.shardingsphere.datasource.names=m0,m1 # 配置第一个数据源
spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=1234 # 配置第二个数据源
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/student_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=1234 # 配置course表分布情况
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m0.course # 指定course表里面主键cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE # 配置student表分布情况
spring.shardingsphere.sharding.tables.student.actual-data-nodes=m1.student # 指定student表里面主键sid生成策略
spring.shardingsphere.sharding.tables.student.key-generator.column=sid
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE # 配置广播表
# 添加、删除dictionary表数据时,同时操作m0(course_db)中dictionary表与m1(student_db)中dictionary表
spring.shardingsphere.sharding.broadcast-tables=dictionary
spring.shardingsphere.sharding.tables.dictionary.key-generator.column=id
spring.shardingsphere.sharding.tables.dictionary.key-generator.type=SNOWFLAKE # 打开sql输出日志
spring.shardingsphere.props.sql.show=true

2.6 读写分离

主从复制通过MySQL自身配置实现,Sharding-JDBC通过对SQL语义的分析,将写操作与读操作分别路由至主库与从库实现读写分离。

策略:写操作course_db(127.0.0.1)从库中course表,读操作course_db(192.168.1.107)主库中course表。

配置:

# sharding-jdbc 读写分离

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true # 配置数据源,给数据源起名
spring.shardingsphere.datasource.names=s0,s1 # 配置主库数据源
spring.shardingsphere.datasource.s0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s0.username=root
spring.shardingsphere.datasource.s0.password=1234 # 配置从库数据源
spring.shardingsphere.datasource.s1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s1.url=jdbc:mysql://192.168.1.107:3306/course_db?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.s1.username=root
spring.shardingsphere.datasource.s1.password=root # 主库从库逻辑数据源定义
# 写操作s0(course_db)主库中course表,读操作s1(course_db)从库中course表
spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=s0
spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=s1 # 配置course表分布情况
spring.shardingsphere.sharding.tables.course.actual-data-nodes=ds0.course # 指定course表里面主键cid生成策略
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE # 打开sql输出日志
spring.shardingsphere.props.sql.show=true

ShardingSphere学习的更多相关文章

  1. 【ShardingSphere】ShardingSphere学习(三)-数据分片-分片

    分片键 分片算法 分片策略 SQL Hint 分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段.例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段. SQL中如果无分片字段, ...

  2. 【ShardingSphere】ShardingSphere学习(二)-核心概念-SQL

    逻辑表 水平拆分的数据库(表)的相同逻辑和数据结构表的总称. 例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order. 真实表 在分片的数 ...

  3. 【ShardingSphere】ShardingSphere学习(一)

    参考官方文档:http://shardingsphere.apache.org/ ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sha ...

  4. 分库分表框架ShardingSphere入门学习1

    背景 传统的将数据集中存储至单一数据节点的解决方案,在性能.可用性和运维成本这三方面已经难于满足互联网的海量数据场景. 从性能方面来说,由于关系型数据库大多采用 B+ 树类型的索引,在数据量超过阈值的 ...

  5. 分库分表利器——sharding-sphere

    背景 得不到的东西让你彻夜难眠,没有尝试过的技术让我跃跃欲试. 本着杀鸡焉用牛刀的准则,我们倡导够用就行,不跟风,不盲从. 所以,结果就是我们一直没有真正使用分库分表.曾经好几次,感觉没有分库分表(起 ...

  6. springboot + sharding-jdbc 学习

    官网地址:http://shardingsphere.io/document/current/cn/overview/ sharding-jdbc事务:https://blog.csdn.net/ya ...

  7. Sharding-JDBC 学习资料

    学习资料 网站 官网 https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/ 基于 Docker 的 M ...

  8. sharding-JDBC学习笔记

    sharding-JDBC学习笔记 ShardingSphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Pr ...

  9. JAVA全栈工程师学习线路(建议收藏)

    互联网技术,更新迭代迅速,用日新月异来说也不为过,所以,面对这这种大环境,对于码农尤其是那些对于初入职场的新手来说,该如何自我学习升级,往方向发展,这一点是大家都经常困惑的. 大部分人,刚开始学习的J ...

随机推荐

  1. MyBatis学习总结(一)——MyBatis入门学习

    一.MyBatis 简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...

  2. mac、ip、udp头解析

    一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6];    // ...

  3. C# AutoMaper使用自定义主键

    有时候实际业务中主键不一定叫Id,比如示例数据库Northwind中的RegionID,TerritoryID等,本示例用Abp框架并以Northwind数据库Region表为数据依据 一.在Core ...

  4. java9的JShell小工具和编译器两种自动优化

    一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先 ...

  5. jooq使用示例

    一.说明 最近使用的项目,采用了jooq. 通过学习api文档和自我调试,写了一些代码,在此处进行记录. 二.代码 一切尽在代码中-- 参考文档:http://www.jooq.org/doc/3.1 ...

  6. 本地Markdown文件上传到博客

    本地Markdown文件上传到博客 参考:https://www.cnblogs.com/ccylhw/p/13954153.html 1.Typora 最漂亮的写作APPhttps://www.ty ...

  7. Spring Boot 2.x 之 H2 数据库

    1. Spring Boot下H2数据库的常用配置项 # 指定数据库的类型 spring.datasource.platform=h2 # 数据库连接地址(文件模式) ## AUTO_SERVER=T ...

  8. vue-router路由钩子

    路由跳转前后,需要做某些操作,这时就可以使用路由钩子来监听路由的变化. 接收三个参数: to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: F ...

  9. 前端框架VUE——数据绑定及模板语法

    一.数据绑定 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ msg }} </di ...

  10. PTA 面向对象程序设计 6-3 面积计算器(函数重载)

    6-3 面积计算器(函数重载) 实现一个面积计算器,它能够计算矩形或长方体的面积. 函数接口定义: int area(int x, int y); int area(int x, int y, int ...