ShardingSphere 5.0.0-alpha 分库分表解决方案(一)——分表

ShardingSphere 5.0.0-alpha 分库分表解决方案(一)——分表,第1张

ShardingSphere 5.0.0-alpha 分库分表解决方案(一)——分表

文章目录
  • 1. 基本概念
    • 1.1 什么是ShardingSphere
    • 1.2 什么是分库分表
      • 1.2.1 垂直分库
      • 1.2.2 垂直分表
      • 1.2.3 水平分库
      • 1.2.4 水平分表
    • 1.3 分库分表应用及问题
  • 2. ShardingSphere-JDBC
    • 2.1 基本介绍
    • 2.2 环境搭建
      • 2.2.1 pom.xml
      • 2.2.2 创建数据库和表
      • 2.2.3 编写业务代码
      • 2.2.4 配置文件
      • 2.2.5 测试结果
  • 3. 说明

1. 基本概念 1.1 什么是ShardingSphere

ShardingSphere一套开源的分布式数据中间件解决方案,定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库 *** 作。

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

1.2 什么是分库分表

随着时间和业务发展,数据库数据量不可控的,造成表里面数据越来越多,如果再去对数据库表curd *** 作时候,造成性能问题。为了解决由于数据量过大而造成数据库性能降低问题。

分库分表有两种方式:

  • 垂直切分:垂直分库、垂直分表
  • 水平切分:水平分库、水平分表
1.2.1 垂直分库

把单一数据库按照业务进行划分,专库专表。

1.2.2 垂直分表

*** 作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一部分字段数据存到另外一张表里面,把一张表拆成多张表。

1.2.3 水平分库

复制多个相同的库,可以根据配置规则让不同的数据进入不同的数据库。

1.2.4 水平分表

在同一个库里,赋值多个相同的表结构,根据配置规则,让不同的数据进入不同的表。

1.3 分库分表应用及问题
  • 分库分表应用
    • 在数据库设计时候考虑垂直分库和垂直分表
    • 随着数据库数据量增加,不要马上考虑做水平切分,首先考虑缓存处理,读写分离,使用索引等等方式,如果这些方式不能根本解决问题了,再考虑做水平分库和水平分表
  • 分库分表问题
    • 跨节点连接查询问题(分页、排序)
    • 多数据源管理问题
2. ShardingSphere-JDBC 2.1 基本介绍

Sharding-JDBC是当当网研发的开源分布式数据库中间件,从 3.0开始Sharding-JDBC被包含在 ShardingSphere中,之后该项目进入进入Apache孵化器,4.0版本之后的版本为Apache版本。

Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。 它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

Sharding-JDBC的核心功能为数据分片和读写分离,通过Sharding-JDBC,应用可以透明的使用JDBC访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

2.2 环境搭建

环境说明:SpringBoot 2.5.7+ MyBatisPlus + ShardingSphere-JDBC 5.0.0-alpha + Druid+ MySQL 8.0

2.2.1 pom.xml

    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.projectlombok
        lombok
        true
    
    
        io.springfox
        springfox-swagger2
        2.9.2
    
    
        io.springfox
        springfox-swagger-ui
        2.9.2
    
    
        com.alibaba
        druid
        1.1.13
    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.4.3
    
    
        mysql
        mysql-connector-java
        8.0.27
    
    
        org.apache.shardingsphere
        shardingsphere-jdbc-core-spring-boot-starter
        5.0.0-alpha
    
    
        org.springframework.boot
        spring-boot-starter-test
        test
    

2.2.2 创建数据库和表

按照水平分表的方式,创建数据库和数据库表

  • 创建数据库:ss_course_db_1(为后面分库做准备,另一个数据库名:ss_course_db_2)
  • 在数据库创建两张表:t_course_1、t_course_2
  • 约定规则:如果cid是偶数把数据添加t_course_1,如果cid奇数添加到t_course_2
drop table if EXISTS t_course_1;
create table t_course_1(
   cid BIGINT(20) PRIMARY KEY,
   cname VARCHAR(50) NOT NULL,
   user_id BIGINT(20) NOT NULL,
   cstatus VARCHAR(10) NOT NULL
);

drop table if EXISTS t_course_2;
create table t_course_2(
   cid BIGINT(20) PRIMARY KEY,
   cname VARCHAR(50) NOT NULL,
   user_id BIGINT(20) NOT NULL,
   cstatus VARCHAR(10) NOT NULL
);
2.2.3 编写业务代码

此处编写业务代码略,具体代码可以下面的源码地址,经过本人调试过。代码里集成了Swagger,用于方便测试。

2.2.4 配置文件
server.port=8001

spring.shardingsphere.enabled=true

# 配置数据源,给数据源起名称
spring.shardingsphere.datasource.names=m0
# 打开sql输出日志
spring.shardingsphere.props.sql-show=true

# 配置第一个数据源具体内容,包含连接池,驱动,地址,用户名和密码
spring.shardingsphere.datasource.common.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.common.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m0.url=jdbc:mysql://127.0.0.1:3306/ss_course_db_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
spring.shardingsphere.datasource.m0.username=root
spring.shardingsphere.datasource.m0.password=123456

# 指定course表里面主键cid 生成策略  SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=123

# 指定course表分布情况,配置表在哪个数据库里面,表名称都是什么 m0.t_course_1 , m0.t_course_2
spring.shardingsphere.rules.sharding.tables.t_course.actual-data-nodes=m0.t_course_$->{1..2}

# 指定表分片策略  约定cid值偶数添加到t_course_1表,如果cid是奇数添加到t_course_2表
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-column=cid
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-algorithm-name=table-inline
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=t_course_$->{cid % 2 + 1}
2.2.5 测试结果

启动程序,在浏览器输入:http://localhost:8001/swagger-ui.html

添加课程

查看数据库表数据

查看所有课程数据

3. 说明

源码地址:https://github.com/Hofanking/springboot-shardingsphere-example

源代码目录结构说明:

springboot-shardingsphere-example

​ |— shardingsphere-database (分库分表)

​ |— shardingsphere-database-table-write-read (分库分表读写分离)

​ |— shardingsphere-proxy-table (使用proxy分表)

​ |— shardingsphere-public (公共表)

​ |— shardingsphere-table (分表)

​ |— shardingsphere-write-read (读写分离)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存