ShardingSphere分库分表实战之广播表

在这里插入图片描述

🚀 ShardingSphere 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 ShardingSphere 🚀

在这里插入图片描述
在这里插入图片描述

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

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

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

🍀 二.ShardingSphere分库分表实战之广播表

🥦 2.1 广播表概念

    广播表指所有的分片数据源中都存在的表,表结构及其数据在每个数据库中均完全一致。
    广播表属于系统中数据量较小,变动少,而且属于高频联合查询的依赖表。适用于数据量不大且需要与海量数据的表进行关联查询的场景。参数表、数据字典表等属于此类型。
    可以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。接下来看一下如何使用Sharding-JDBC实现公共表的数据维护。

🥦 2.2 数据库创建

分别在node1-shardingsphere服务器上的ljw_course_db1数据库和node2-shardingsphere服务器上的ljw_course_db2数据库上创建user表

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

表结构创建完成:

在这里插入图片描述

🍀 三.SpringBoot项目中广播表的配置

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

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

在这里插入图片描述

# 标准分片表配置  -  配置数据节点
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
# 数据节点可不配置,默认情况下,向所有数据源广播
spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=db$->{1..2}.user

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

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

🥦 3.4 配置文件 - 广播表配置

该实战只配置了一个广播表,可以配置多个广播表

#  广播表规则列表
spring.shardingsphere.rules.sharding.broadcast-tables[0]=user

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

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

注意:下面俩种分布式ID的配置方案主要是对表user,之前文章中也讲过很多遍,,此处不做过多演示。

🍈 3.5.1 UUID

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

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

	// 省略部分代码

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

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

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

配置文件:

# 表主键生成策略
# 分布式序列配置
# 分布式序列的列名
spring.shardingsphere.rules.sharding.tables.user.key-generate-strategy.column=id
# 分布式序列-算法名称
spring.shardingsphere.rules.sharding.tables.user.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 id;
    
    // 省略部分代码

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

🥦 4.1 实体类编写

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

@TableName("user")
@Data
@ToString
public class User {

    @TableId(value="id",type = IdType.ASSIGN_ID)
    private Long id;

    private String name;

    private Integer age;

    private String email;
}

🥦 4.2 Mapper编写

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

🍀 五.ShardingSphere分库分表实战之广播表测试

🥦 5.1 添加数据测试

	@Autowired(required = false)
    UserMapper userMapper;

    @Test
    public void testInsert(){
        User user=new User();
        user.setName("硕风和炜");
        user.setAge(18);
        user.setEmail("xxxxxxx@qq.com");
        userMapper.insert(user);
    }

结果查询

在这里插入图片描述

数据库表查询:

在这里插入图片描述

在这里插入图片描述

🥦 5.2 广播表查询数据测试

	@Test
    public void testSelect(){
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

结果查询

在这里插入图片描述

🍀 六.总结

本篇文章主要讲解了ShardingSphere分库分表实战之广播表:
    广播表指所有的分片数据源中都存在的表,表结构及其数据在每个数据库中均完全一致。
    广播表属于系统中数据量较小,变动少,而且属于高频联合查询的依赖表。适用于数据量不大且需要与海量数据的表进行关联查询的场景。参数表、数据字典表等属于此类型。
    可以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。下节预告,ShardingSphere分库分表实战之读写分离应用方案,敬请期待。

💬 七.共勉

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

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
ShardingSphere是一个开源的分布式数据库中间件,用于实现分库分表分库分表是将一个数据库按照一定的规则分成多个库或者多个,从而达到提高数据库性能和扩展性的目的。 在ShardingSphere中,可以通过配置公共的方式来实现分库分表。通过设置配置文件中的参数,指定需要进行分库分表以及相应的规则和算法。例如,在配置文件中可以设置公共分库分表的策略,如分库数量、分数量、分片键的生成策略等。引用 同时,在使用ShardingSphere进行分库分表时,需要进行综合评估确定分库分表的数量。一般建议初次分库分表时,将数据库分为4-8个库。引用 分库分表可以解决一些问题,例如垂直分可以将热门数据和冷门数据分开存储,同时将大字段放在冷门数据中。垂直分库可以按照业务进行拆分,将不同的业务放在不同的库中,解决单一服务器性能的瓶颈,提升整体架构的业务清晰度。水平分可以解决单一数据量过大的问题,而水平分库可以将一个的数据分别分到不同的库中,解决单一服务器数据量过大的问题。引用 总结来说,ShardingSphere是一个用于实现分库分表的分布式数据库中间件,通过配置公共分库分表的策略,可以将数据库按照一定规则进行分割,从而提高数据库性能和扩展性。分库分表的选择需要综合评估,并根据实际业务需求来确定分库分表的数量和策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值