ShardingSphere分库分表实战之水平分库和水平分表

举报
硕风和炜 发表于 2023/07/30 08:43:13 2023/07/30
【摘要】 本篇文章主要讲解了ShardingSphere分库分表实战之水平分库和水平分表,下节预告,ShardingSphere分库分表实战之绑定表,敬请期待。

image.png

🍀 一.ShardingSphere项目实战集群环境准备

关于项目启动需要提前准备并进行配置的环境我在上一篇文章中做了详细的讲解,如果还有问题的同学可以参考上一篇文章进行学习。

ShardingSphere项目实战集群环境准备
ShardingSphere分库分表实战之水平分表

🍀 二.水平分库 & 水平分表之数据库配置

这篇文章是在实现了水平分库后,又加入了水平分表,更加综合,如果有问题的同学可以参考我上一篇文章进行学习!
ShardingSphere分库分表实战之水平分表

🥦 2.1 需求分析说明

  1. 在node1-shardingsphere 192.168.10.132服务器上, 创建数据库 ljw_course_db1;然后创建表 t_course_1 、 t_course_2;
  2. 在node2-shardingsphere 192.168.10.133服务器上, 创建数据库 ljw_course_db2;然后创建表 t_course_1 、 t_course_2;
  3. 约定规则:
  • 水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • 水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2

🥦 2.2 数据库创建

CREATE TABLE `t_course_1` (
  `cid` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `cname` varchar(50) DEFAULT NULL,
  `brief` varchar(50) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t_course_2` (
  `cid` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `cname` varchar(50) DEFAULT NULL,
  `brief` varchar(50) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

image.png

🍀 三.SpringBoot项目中水平分表的配置

sharding-jdbc进行分库分表的配置,主要包括:数据源、分片键、主键生成策略、分片策略等。

注意:项目实战过程中有不熟的概念可以参考对应的官方网站,因为内容较多,本篇文章不做过多详细的说明,包括使用到的很多知识内容,官网开发手册都有更加详细的指导说明。

ShardingSphere开发者手册

🥦 3.1 配置文件 - 基本配置

# 应用名称
spring.application.name=sharding-jdbc-demo
# 打印SQL语句
spring.shardingsphere.props.sql-show=true
# SQL输出日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

🥦 3.2 配置文件 - 数据源

# 定义多个数据源
spring.shardingsphere.datasource.names = db1,db2

# 数据源1连接信息配置
spring.shardingsphere.datasource.db1.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db1.url = jdbc:mysql://192.168.10.132:3306/ljw_course_db1?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db1.username = root
spring.shardingsphere.datasource.db1.password = root

# 数据源2连接信息配置
spring.shardingsphere.datasource.db2.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db2.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db2.url = jdbc:mysql://192.168.10.133:3306/ljw_course_db2?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db2.username = root
spring.shardingsphere.datasource.db2.password = root

🥦 3.3 配置文件 - 配置数据节点

表达式 db1.t_course_$->{1..2}

​ $ 会被大括号中的 {1..2} 所替换, ${begin..end} 表示范围区间

​ 会有两种选择: db1.t_course_1db1.t_course_2

image.png

# 标准分片表配置  -  配置数据节点
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
spring.shardingsphere.rules.sharding.tables.t_course.actual-data-nodes=db$->{1..2}.t_course_$->{1..2}

注意:此处使用了行表达式,想深入了解的同学可以参考官网进行学习!

行表达式官方网站学习手册

🥦 3.4 配置文件 - 配置分片策略(包括分片键和分片算法)

分片相关内容官方网站学习手册

🍈 3.4.1 分片键配置

# 水平分库配置
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.database-strategy.standard.sharding-column=user_id

# 水平分表配置
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-column=cid

🍈 3.4.2 分片算法配置

在配置分片算法之前,我们做如下的约定:

  • 水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • 水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2
# 水平分库配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.database-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=db$->{user_id % 2 + 1}

# 水平分表配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-algorithm-name=inline-hash-mod
# 分片算法类型  --> hash取模算法
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.type=INLINE
# 分片算法的属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.props.algorithm-expression=t_course_$->{Math.abs(cid.hashCode()) % 2 + 1}

🥦 3.5 配置文件 - 分布式序列配置

分布式主键相关内容官方网站学习手册

🍈 3.5.1 UUID

采用 UUID.randomUUID() 的方式产生分布式主键。

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    //通过MyBatisPlus生成主键
    @TableId(value="cid",type = IdType.ASSIGN_ID)
    private Long cid;
    
    // 省略部分代码

🍈 3.5.2 SNOWFLAKE

在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成 64bit 的长整型数据。

雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。

配置文件:

# 分布式序列配置
# 分布式序列的列名
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.column=cid
# 分布式序列-算法名称
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.key-generator-name=alg-snowflake
# 分布式序列-算法类型
spring.shardingsphere.rules.sharding.key-generators.alg-snowflake.type=SNOWFLAKE

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    @TableId(type = IdType.AUTO)
    private Long cid;
    
    // 省略部分代码

🍀 四.SpringBoot项目相关代码准备

🥦 4.1 实体类编写

编写与数据库表对应的实体类

@TableName("t_course")
@Data
@ToString
public class Course {

    @TableId(type = IdType.AUTO)
    private Long cid;

    private Long userId;

    private Long corderNo;

    private String cname;

    private String brief;

    private Double price;

    private Integer status;

}

🍀 五.水平分库 & 水平分表测试

🥦 5.1 水平分库 & 水平分表测试

	@Autowired(required = false)
    private CourseMapper courseMapper;

    @Test
    public void testInsertCourse(){
        for (int i = 0; i < 30; i++) {
            Course course = new Course();
            // 注意: cid使用雪花算法配置了(还可以使用MybatisPlus UUID),此处不用配置
            course.setUserId(1000L+i);
            course.setCname("ShardingSphere");
            course.setBrief("ShardingSphere保姆级学习教程!!!");
            course.setPrice(99L);
            course.setStatus(1);
            courseMapper.insert(course);
        }
    }

🥦 5.2 结果查询

项目运行成功 !

image.png

db1数据库中course1表插入数据成功!

image.png

db1数据库中course2表插入数据成功!

image.png

db2数据库中course1表插入数据成功!
image.png

db2数据库中course2表插入数据成功!

image.png

🍀 六.总结

本篇文章主要讲解了ShardingSphere分库分表实战之水平分库和水平分表,下节预告,ShardingSphere分库分表实战之绑定表,敬请期待。

💬 七.共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。