ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ShardingSphere学习

2021-10-24 14:32:18  阅读:216  来源: 互联网

标签:spring ShardingSphere db 学习 course datasource shardingsphere sharding


1 基本概念

1.1 ShardingSphere概述

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

image

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

标签:spring,ShardingSphere,db,学习,course,datasource,shardingsphere,sharding
来源: https://www.cnblogs.com/zhanglei-code/p/15450980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有