【ShardingSphere专题】SpringBoot整合ShardingSphere(一)

目录

  • 前言
  • 阅读对象
  • 笔记正文
    • 一、ShardingSphere介绍
      • 1.1 ShardingSphere-JDBC:代码级别
      • 1.2 ShardingSphere-Proxy:应用级别
      • 1.3 横向对比图
    • 二、ShardingSphere之——数据分片
      • 2.1 基本介绍
      • 2.2 分片的形式
        • 2.2.1 垂直分片
        • 2.2.2 水平分片
      • 2.3 数据分片核心概念
        • 2.3.1 表
        • 2.3.2 数据节点
        • 2.3.3 分片概念集合
    • 三、下载
    • 四、配置启动
      • 步骤1:下载ShardingSphere-Proxy
      • 步骤2:认识一下conf目录
      • 步骤3:规则配置:YAML配置
        • 1. 认证和授权
        • 2. 属性配置
        • 3. 模式配置
        • *4. 数据源配置
        • *5. 规则配置(功能配置)
      • 步骤4:启动服务
    • 五、SpringBoot整合ShardingSphere-Proxy
  • 学习总结
  • 感谢

前言

最近线上的项目部分数据表增量速度比较快,可以预见的是,个把月后数据量会急剧增长至千万级,所以只是简单的使用索引等已经无法满足业务需求了,分库分表势在必行!于是着手研究如何整合ShardingSphere到现有项目中,顺带记录一下实验过程吧。

特别声明:这边是实验配置阶段,还没有完成整合到项目、以及测试联调阶段,所以不敢保证实验过程是否正确。 而且,在我的业务中,还涉及到【普通单表】与【分片表】之间的联表查询,所以需要后期比较严谨的测试才能知道最终效果。不过我自己对比了站内其他大佬的教程,大体是没问题的。

阅读对象

笔记正文

一、ShardingSphere介绍

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。
Apache ShardingSphere 设计哲学为 Database Plus,旨在构建【异构数据库】上层的标准和生态。 它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。 它站在数据库的上层视角,关注它们之间的协作多于数据库自身。

说人话:ShadingSphere并非是一个数据库,而是数据库上层应用,关注于多数据库之间的分布式协作问题。
所谓【异构数据库】:多种不同类型的数据库产品

ShardingSphere目前有2个独立的产品:ShardingSphere-JDBC、ShardingSphere-Proxy。他们提供的服务是相同的,如下:
在这里插入图片描述
一张图给大家介绍一下ShardingSphere的生态结构图:
在这里插入图片描述

1.1 ShardingSphere-JDBC:代码级别

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。他有如下特点:

JDBC(Java Database Connectivity)是Java中用于连接和操作数据库的一组API,是Java数据库连接的标准,它为Java应用程序连接数据库提供了一种标准的接口。JDBC API可以连接几乎所有的主流数据库,如Oracle、MySQL、PostgreSQL、DB2等。
JDBC API由一组Java类和接口组成,这些类和接口定义了Java应用程序与数据库之间的通信方式。通过使用JDBC API,Java应用程序可以执行SQL语句、查询数据库、插入数据、更新数据等操作。

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template,或直接使用 JDBC
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP,Druid等
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库

结构示意图如下:
在这里插入图片描述

1.2 ShardingSphere-Proxy:应用级别

ShardingSphere-Proxy 定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。 目前提供 MySQL 和 PostgreSQL 协议,透明化数据库操作,对 DBA 更加友好。

  • 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用
  • 兼容 MariaDB 等基于 MySQL 协议的数据库,以及 openGauss 等基于 PostgreSQL 协议的数据库
  • 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端,如:MySQL Command Client, MySQL Workbench, Navicat 等

结构示意图如下:
在这里插入图片描述

1.3 横向对比图

在这里插入图片描述

二、ShardingSphere之——数据分片

由于我的需求只是需要使用ShardingSphere的数据分片能力,所以为了节省时间我直接进入正题学习它了。

2.1 基本介绍

什么是数据分片?
数据分片是指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果

为什么需要数据分片?
突破单点数据阈值限制。无论再牛逼的机器配置,随着数据量的增大,一定会出现性能瓶颈

如何实现数据分片?
分库和分表。分库除了能在数据层面将数据分散开来以外,还能够有效地分散对数据库单点的访问量。而分表虽然无法直接缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能

讲人话:分表通常都是发生在单库下面的,单库单点之下当然避免了分布式事务。 分表还有另一个特点,那就是减少了检索深度。单表的时候,随着数据量增大,哪怕在B+树结构下,树的深度也会不可避免地增加,进而导致检索深度增加,IO次数也增加,最后检索时间增大

2.2 分片的形式

分片的形式通常有两种,称为:垂直分片、水平分片

2.2.1 垂直分片

按照业务拆分的方式称为垂直分片,它的核心理念是专库专用
在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。 下图展示了根据业务需要,将用户表和订单表垂直分片到不同的数据库的方案。
在这里插入图片描述
垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对互联网业务需求快速变化的;而且,它也并无法真正的解决单点瓶颈。 垂直拆分可以缓解数据量和访问量带来的问题,但无法根治。如果垂直拆分之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。

2.2.2 水平分片

水平分片相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。
例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表),如下图所示:
在这里插入图片描述
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是数据分片的标准解决方案。

2.3 数据分片核心概念

2.3.1 表

表是透明化数据分片的关键概念。ShardingSphere 通过提供多样化的表类型,适配不同场景下的数据分片需求。在ShardingSphere 中有如下类型的表:

  • 逻辑表:被水平拆分后,有相同数据库结构的多个不同表的逻辑名称,并不真实存在。

例:订单数据根据主键尾数拆分为 10 张表,分别是 t_order_0 到 t_order_9,他们的逻辑表名为 t_order。

  • 真实表:在水平拆分的数据库中真实存在的物理表。 即上个示例中的 t_order_0 到 t_order_9
  • 绑定表(比较难理解):指分片规则一致的一组分片表。使用绑定表进行多表关联查询时,必须使用【分片键】进行关联,否则会出现笛卡尔积关联或跨库关联,从而影响查询效率。

例:t_order 表和 t_order_item 表,均按照 order_id 分片,并且使用 order_id 进行关联,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。 举例说明,如果 SQL 为:
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在不配置绑定表关系时,假设分片键 order_id 将数值 10 路由至第 0 片,将数值 11 路由至第 1 片,那么路由后的 SQL 应该为 4 条,它们呈现为笛卡尔积:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在配置绑定表关系,并且使用 order_id 进行关联后,路由的 SQL 应该为 2 条:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
其中 t_order 表由于指定了分片条件,ShardingSphere 将会以它作为整个绑定表的主表。 所有路由计算将会只使用主表的策略,那么 t_order_item 表的分片计算将会使用 t_order 的条件。
注意:绑定表中的多个分片规则,需要按照逻辑表前缀组合分片后缀的方式进行配置,例如:
在这里插入图片描述

  • 广播表:指所有的数据源中都存在的表,表结构及其数据在每个数据库中均完全一致。 适用于数据量不大且需要与海量数据的表进行关联查询的场景

例如:字典表

  • 单表:指所有的分片数据源中仅唯一存在的表。 适用于数据量不大且无需分片的表。
2.3.2 数据节点

数据分片的最小单元,由数据源名称和真实表组成。 例:ds_0.t_order_0。逻辑表与真实表的映射关系,可分为均匀分布和自定义分布两种形式。

均匀分布:
指数据表在每个数据源内呈现均匀分布的态势, 例如:
在这里插入图片描述

自定义分布:
指数据表呈现有特定规则的分布, 例如:
在这里插入图片描述

2.3.3 分片概念集合
  • 分片键:用于将数据库(表)水平拆分的数据库字段。SQL 中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,Apache ShardingSphere 也支持根据多个字段进行分片。

例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。

  • 分片算法:用于将数据分片的算法,支持 =、>=、<=、>、<、BETWEEN 和 IN 进行分片。 分片算法可由开发者自行实现,也可使用 Apache ShardingSphere 内置的分片算法语法糖,灵活度非常高
  • 自动化分片算法:分片算法语法糖,用于便捷的托管所有数据节点,使用者无需关注真实表的物理分布。 算法包括取模、哈希、范围、时间等常用分片算法的实现
  • 自定义分片算法:提供接口让应用开发者自行实现与业务实现紧密相关的分片算法,并允许使用者自行管理真实表的物理分布。 自定义分片算法又分为:
    • 标准分片算法:用于处理使用单一键作为分片键的 =、IN、BETWEEN AND、>、<、>=、<= 进行分片的场景
    • 复合分片算法:用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度
    • Hint分片算法:用于处理使用 Hint 行分片的场景
  • 分片策略:包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。 真正可用于分片操作的是分片键 + 分片算法,也就是分片策略

讲人话:分片策略即:分片键+分片算法。分片策略只是一种逻辑叫法而已

  • 强制分片路由:对于分片字段并非由 SQL 而是其他外置条件决定的场景,可使用 SQL Hint 注入分片值

例:按照员工登录主键分库,而数据库中并无此字段。 SQL Hint 支持通过 Java API 和 SQL 注释两种方式使用。 详情请参见强制分片路由

  • 分布式主键:传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如 MySQL 的自增键,Oracle 的自增序列等。 数据分片后,不同数据节点生成全局唯一主键是非常棘手的问题。同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。 虽然可通过约束自增主键初始值和步长的方式避免碰撞,但需引入额外的运维规则,使解决方案缺乏完整性和可扩展性。
    目前有许多第三方解决方案可以完美解决这个问题,如 UUID 等依靠特定算法自生成不重复键,或者通过引入主键生成服务等。为了方便用户使用、满足不同用户不同使用场景的需求, Apache ShardingSphere 不仅提供了内置的分布式主键生成器,例如 UUID、SNOWFLAKE,还抽离出分布式主键生成器的接口,方便用户自行实现自定义的自增主键生成器
  • 行表达式:行表达式是为了解决【配置的简化】与【一体化】这两个主要问题。在繁琐的数据分片规则配置中,随着数据节点的增多,大量的重复配置使得配置本身不易被维护。 通过行表达式可以有效地简化数据节点配置工作量。
    对于常见的分片算法,使用 Java 代码实现并不有助于配置的统一管理。 通过行表达式书写分片算法,可以有效地将规则配置一同存放,更加易于浏览与存储。
    在这里插入图片描述

三、下载

先说我的选择,我当前采用的方案是ShardingSphere-Proxy,而不是jdbc那一套。为什么选择这个?因为感觉会简单一点,jdbc毕竟是jar包形式,肯定存在代码侵入。选择proxy,作为一个独立应用,感觉会安全一点。
官方下载地址:传送门
我下载的是:5.4.1,二进制发布包
在这里插入图片描述
然后当前测试环境是windows11,目标环境是linux Centos7.
大家下载完上面那个不用担心系统问题,直接解压,配置完之后就能启动了,官方已经提供了win跟Linux环境的启动脚本。
在这里插入图片描述

注意,这个版本应该挺重要的,根据我这两天百度的情况来看,我猜测不同版本的配置属性是不太一样的。所以,如果你发现了配置属性跟我的不一样,那你要看看版本是否一致了。最好是结合官方给的配置属性看咯,官方不是给了很多模板嘛

四、配置启动

在看这里的内容之前,请确保你已经理解了【二、ShardingSphere之——数据分片】里提到的概念

官方下载配置启动教程:传送门

理论上,我们跟着上面提到的【官方启动教程】就可以理解配置过程了,但讲真还是有一丢丢难度的,官方的给的案例对新手而言不是特别友好,我本人也是反复翻看了官方文档以及CSDN站内大神的整合博客才开始懂的。我这边也大致的按照官方教程给大家翻译一下了。
结合我自己的业务场景噢!

但是在给大家翻译解读这些配置之前,需要给大家介绍一下我的项目背景,以及最终选择的分片策略。

背景:目前有一些报表类的业务数据增长非常快,但也仅仅只是那几张报表而已,其他的表数据量很正常
目的:减少表数据量大小,将耗时的报表业务与其他系统业务数据剥离
分片策略:基于上述特点【个别数据量增长迅速】,我初步计划是采取【垂直分片】+【水平分片】的方式。使用的分片算法是官方提供的时间范围分片算法。最后的分片策略结构图如下:
在这里插入图片描述
实验结果效果图:(4个垂直业务库)
在这里插入图片描述
每个业务库下面,水平分了12张表
在这里插入图片描述

OK,言归正传,下面开始配置实验。

步骤1:下载ShardingSphere-Proxy

这一步我在【三、下载】已经说了。下载之后(绿色版),解压到你要安装的位置,如下:我解压到了F盘上。下面我们称之为:安装目录
在这里插入图片描述

步骤2:认识一下conf目录

这里需要特别解释一下是:安装目录/conf/下以config-开头的各种yaml文件,其实他们的命名方式是以[config-]+[功能名].yaml命名的。
比如:config-sharding.yaml,配置的是数据分片功能;config-encrypt.yaml,配置的是数据加密功能等等。有啥功能大家看【一、ShardingSphere介绍】下面的图吧。
在这里插入图片描述
很显然,这里我们配置的就是config-sharding.yaml这个文件了。上面红框内的东西是我自己的配置备份,不是官方的。

步骤3:规则配置:YAML配置

官方规则配置传送门:传送门
这里的规则配置,指的是配置安装目录下的conf包下的配置。正常来说,需要配置如下内容:

  1. 认证和授权
  2. 属性配置
  3. 模式配置
  4. 数据源配置
  5. 功能配置
1. 认证和授权

这里说的配置,指的是配置安装目录/conf/server.yaml下的authority,官方已经提供了模板,我只是打开了注释

大家也可以看官方的配置内容,我当前测试环境没有做很麻烦的配置,只是配置了账号密码。
在这里插入图片描述
因为我自己目前也是在实验阶段,所以我也只是这么简单的配置一下,到了生产上可能就不是这样了,大家需要自己去衡量哦。或者我在后面上线生产的时候,我再回来更新,看看哪些是必须要配置的

2. 属性配置

这里说的配置,指的是配置安装目录/conf/server.yaml下的props,官方已经提供了模板,我只是打开了注释

官方已经提供了模板,我只是打开了注释。还是之前说的,我只是实验阶段,具体生产要怎么配置需要进一步调试。
在这里插入图片描述

3. 模式配置

这里说的配置,指的是配置安装目录/conf/server.yaml下的mode,官方已经提供了模板

模式,指的是【运行模式】。有单机、集群等。默认单机
在这里插入图片描述
由于实验阶段,所以我默认了单机,所以啥都不用管。

*4. 数据源配置

这里说的配置,指的是配置安装目录/conf/config-sharding.yaml下的databaseNamedataSources,官方已经提供了模板

到了这里,其实就比较关键了。这个数据源配置,需要跟自己的业务结合起来选择怎么配置,配置多少个数据源。而且对于我们初学者来说,通常没办法一次性就确定数据源的配置,而是将当前步骤【4. 数据源配置】和【5. 规则配置(功能配置)】一起进行的。

当然,官方也提供了模板:
在这里插入图片描述
而我最终的配置是:

# 分库后逻辑数据库名称
databaseName: sharding_unify_db
# 数据源配置
dataSources:
  # 数据源名称
  ds_0:
    # 数据源链接池完整类名
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/shen-dev
    username: shen
    password: 123456
  ds_2020:
    # 数据源链接池完整类名
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/shen-unify-2020
    username: shen
    password: 123456
  ds_2021:
    # 数据源链接池完整类名
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/shen-unify-2021
    username: shen
    password: 123456
  ds_2022:
    # 数据源链接池完整类名
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/shen-unify-2022
    username: shen
    password: 123456
  ds_2023:
    # 数据源链接池完整类名
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/shen-unify-2023
    username: shen
    password: 123456

不过这里有一个要注意的点,因为我选择的是AlibabaDruid数据源,并且是Mysql数据库,所以,我们需要复制我们当前项目的两个jar包到安装目录/lib下,比如我的是下面这两个包:

  1. mysql-connector-java-8.0.28.jar
  2. druid-1.2.9.jar
*5. 规则配置(功能配置)

这里说的配置,指的是配置安装目录/conf/config-sharding.yaml下的rules,官方已经提供了模板

根据官方引导,这一步【规则配置】,ShardingSphere-proxyShardingSphere-jdbc的【规则配置】内容是一样的,所以最后去看了ShardingSphere-jdbc的【规则配置】。
官方传送门:传送门

在这里插入图片描述
我们要实现的功能是【数据分片】所以看看数据分片的内容。到了这里难度就剧增了,眼花缭乱的配置,甚至有一些内容我自己也没吃透,所我目前没办法给大家伙保证我下面的实验一定是正确的。

根据我的学习理解来说,要完成【规则配置(功能配置)】其实可以分为下面几个小步骤:
1)配置表的分库策略(针对需要分片的表)
2)配置表的分表策略(针对需要分片的表)
3)配置分布式主键策略
4)配置分片审计策略
5)配置默认的分库、分表策略(针对其余业务表)
6)配置分片算法实现策略
7)配置分布式序列算法实现策略
8)配置分片审计策略

总得来说,需要设置分片表的分库分表策略;设置对应的算法策略。

OK,贴上我自己的配置策略:

# 规则配置
rules:
- !SHARDING
  # 数据分片规则配置
  tables:
    # 逻辑表名称
    shen_report_store_line: 
      # 数据节点。数据源+表(行表达式)
      actualDataNodes: ds_${2020..2023}.shen_report_store_line_0${1..9},ds_${2020..2023}.shen_report_store_line_1${0..2}
      # 分库规则  
      databaseStrategy:
        # 用于单分片键的标准分片场景
        standard:
          # 分片键名称
          shardingColumn: biz_date
          # 分片算法名称,具体算法在后面的【算法模块】声明
          shardingAlgorithmName: database_interval
      # 分表策略
      tableStrategy: 
        # 用于单分片键的标准分片场景
        standard:
          # 分片键名称
          shardingColumn: biz_date
          # 分片算法名称,具体算法在后面的【算法模块】声明
          shardingAlgorithmName: shen_report_store_line_interval
      # 分布式主键策略
      keyGenerateStrategy:
        # 自增列名称
        column: id
        # 分布式主键生成算法,具体算法在后面的【算法模块】声明
        keyGeneratorName: uuid
      # 分片审计策略
      auditStrategy:
        # 分片审计算法名称
        auditorNames:
          - sharding_key_required_auditor
        # 是否禁用分片审计hint
        allowHintDisable: true
  # 默认分片键名称
  #defaultShardingColumn: create_time
  # 绑定表
  #bindingTables:
  #  - t_order,t_order_item
  # 默认数据库分片策略
  defaultDatabaseStrategy:
    none:
  defaultTableStrategy:
    none:
  
  # 分片算法配置
  shardingAlgorithms:
    database_interval:
      # 分片算法类型。这里表示使用:时间范围分片算法
      type: INTERVAL
      # 分片算法属性配置
      props:
      	# 分片键的格式
        datetime-pattern: "yyyy-MM-dd HH:mm:ss"
        # 分片下界值,格式必须同上面的datetime-pattern
        datetime-lower: "2020-01-01 00:00:00"
        # 分片上界值,格式必须同上面的datetime-pattern
        datetime-upper: "2050-01-01 00:00:00"
        # 分片数据源或真实表的后缀格式
        sharding-suffix-pattern: "yyyy"
		# 分片键时间间隔,超过该时间间隔将进入下一分片
        datetime-interval-amount: 1
        # 分片键时间间隔单位 DAYS/MONTHS/YEARS
        datetime-interval-unit: "YEARS"
    # 分片算法名称
    shen_report_store_line_interval:
      # 分片算法类型。这里表示使用:时间范围分片算法
      type: INTERVAL
      # 分片算法属性配置
      props:
        datetime-pattern: "yyyy-MM-dd HH:mm:ss"
        datetime-lower: "2020-01-01 00:00:00"
        datetime-upper: "2050-01-01 00:00:00"
        sharding-suffix-pattern: "MM"
        datetime-interval-amount: 1
        datetime-interval-unit: "MONTHS"
  # 分布式序列算法配置
  keyGenerators:
    uuid:
      type: UUID
  auditors:
    sharding_key_required_auditor:
      type: DML_SHARDING_CONDITIONS

  # 广播表,我这里没有广播表
#- !BROADCAST
#  tables:
#    - t_address

  # 单表
- !SINGLE
  tables:
    # MySQL 风格,加载指定数据源中的全部单表
    - ds_0.*
  # 默认数据源,仅在执行 CREATE TABLE 创建单表时有效。缺失值为空,表示随机单播路由。
  defaultDataSource: ds_0

附上一张我的分片表sql:

CREATE TABLE `shen_report_store_line` (
  `id` varchar(20) NOT NULL,
  `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id',
  `line_id` varchar(20) DEFAULT NULL COMMENT '档口id',
  `store_id` varchar(20) DEFAULT NULL COMMENT '所属餐厅id',
  `report_type` tinyint(4) DEFAULT NULL COMMENT '报表类型(1-日报;2-周报;3-月报;4-季报;5-年报)',
  `biz_date` datetime DEFAULT NULL COMMENT '账目日期',
  `year` int(4) DEFAULT NULL COMMENT '年',
  `month` int(4) DEFAULT NULL COMMENT '月',
  `week` int(4) DEFAULT NULL COMMENT '周(年属第几周)',
  `turnover` decimal(10,2) DEFAULT '0.00' COMMENT '营业额',
  `operating_cost` decimal(10,2) DEFAULT '0.00' COMMENT '主营业务成本',
  `total_cost` decimal(10,2) DEFAULT '0.00' COMMENT '总成本',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `create_user` varchar(20) DEFAULT NULL COMMENT '创建人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `update_user` varchar(20) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='餐厅营业数据-档口维度';

还记得我要实现的分表策略吧?说到策略这个东西,它跟分片算法离不开。我使用的是官方提供的时间范围分片算法

更多官方内置分片算法传送门

该算法的介绍及参数如下:
在这里插入图片描述
讲真的,这个算法我也是研究了一下才晓得怎么用的,官方还不提供模板示例,规则讲的也不是很清楚,我是把源码翻出来之后,把官方源码掏出来自己debug才晓得怎么耍的。如果你们也要尝试使用这个算法,可以用下面这段代码校验:

    @Test
    public void test() {
        String datetimePattern = "yyyy-MM-dd HH:mm:ss";
        String shardingSuffixPattern = "yyyyMM";
        String datetimeLower = "2020-01-01 00:00:00";

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(datetimePattern);
        TemporalAccessor dateTime = dateTimeFormatter.parse(datetimeLower);
        System.out.println(dateTime);
        DateTimeFormatter tableSuffixPattern = DateTimeFormatter.ofPattern(shardingSuffixPattern);
        String tableSuffix;
        if (!dateTime.isSupported(ChronoField.NANO_OF_DAY)) {
            if (dateTime.isSupported(ChronoField.EPOCH_DAY)) {
                System.out.println(1);
                tableSuffix = tableSuffixPattern.format(dateTime.query(TemporalQueries.localDate()));
                System.out.println(tableSuffix);
                return;
            }
            if (dateTime.isSupported(ChronoField.YEAR) && dateTime.isSupported(ChronoField.MONTH_OF_YEAR)) {
                System.out.println(2);
                tableSuffix = tableSuffixPattern.format(dateTime.query(YearMonth::from));
                System.out.println(tableSuffix);
                return;
            }
            if (dateTime.isSupported(ChronoField.YEAR)) {
                System.out.println(3);
                tableSuffix = tableSuffixPattern.format(dateTime.query(Year::from));
                System.out.println(tableSuffix);
                return;
            }
            if (dateTime.isSupported(ChronoField.MONTH_OF_YEAR)) {
                System.out.println(4);
                tableSuffix = tableSuffixPattern.format(dateTime.query(Month::from));
                System.out.println(tableSuffix);
                return;
            }
        }
        if (!dateTime.isSupported(ChronoField.EPOCH_DAY)) {
            System.out.println(5);
            tableSuffix = dateTime.query(TemporalQueries.localTime()).format(tableSuffixPattern);
            System.out.println(tableSuffix);
            return;
        }

        System.out.println(6);
        tableSuffix = LocalDateTime.from(dateTime).format(tableSuffixPattern);
        System.out.println(tableSuffix);
    }

步骤4:启动服务

OK,配置完毕之后就可以启动了,很简单,win下就是双击安装目录/bin下的start.bat就好了。
在这里插入图片描述
出现了start successfully就代表启动成功了。

五、SpringBoot整合ShardingSphere-Proxy

这个我在下一篇笔记讲咯,我采用的方案是ShardingSphere-Proxy,应该比较简单,毕竟只是一个独立的应用。

学习总结

  1. 学习了ShardingSphere数据分片
  2. 学习了如何做一个简单的分库分表配置

感谢

感谢CSDN站内大佬【作者:攻城狮悠扬】的文章《Sharding-Proxy代理Mysql服务》
感谢CSDN站内大佬【作者:攻城狮悠扬】的文章《ShardingSphere-Proxy5 分片算法-时间范围分片》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现农机电招平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

使用C语言操作kafka

文章目录 1 安装librdkafka2 开启kafka相关服务2.1 启动zookeeper2.2 启动Kafka2.3 创建topic 3 c语言操作kafka的范例3.1 消费者3.2 生产者3.3 生产者和消费者的交互 总结 1 安装librdkafka git clone https://github.com/edenhill/librdkafka.git cd librdkafka git checkou…

unity3d NPC寻路时相互挤压、导致离目标越来越远

更改寻路代理 约束的大小&#xff0c;人物周围绿色圆柱范围线&#xff0c;尽量调小

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加

目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上,如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以直接复制到…

[Linux] Linux入门必备的基本指令(不全你打我)

一:ls指令 语法 &#xff1a; ls [选项] [目录或文件] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 ls不带选项就是显示当前目录下存在的子目录和文件 常用选项: (1). ls -l 功能: 列出…

【JavaScript框架】Vue与React中的组件框架概念

组件框架是用于构建应用程序的工具&#xff0c;以便将UI和逻辑划分为单独的可重用组件。目前的组件框架包括React、Vue、Angular、Ember、Svelte等。 Vue和React使用了常见的框架概念&#xff0c;如处理状态、道具、引用、生命周期挂钩、事件等。这两个框架在当今的web开发中被…

论文解读:《数据增强:通过强化学习引导的条件生成进行文本数据扩充》

Title:<Data Boost: Text Data Augmentation Through Reinforcement Learning Guided Conditional Generation> 期刊&#xff1a;EMNLP &#xff08;顶级国际会议&#xff09; 作者 Ruibo Liu; Guangxuan Xu; Chenyan Jia; Weicheng Ma; Lili Wang; et al 出版日期 20…

通过测试驱动开发(TDD)的方式开发Web项目

最近在看一本书《Test-Driven Development with Python》&#xff0c;里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目。刚好这本书中使用了我之前所了解的一些技术&#xff0c;Django、selenium、unittest等。所以&#xff0c;读下来受益匪浅。 我相…

互联网架构演变过程梳理和架构思想的学习

文章目录 版权声明业务架构单体模式中台战略去中台化 数据架构单数据库架构主从读写分库分表高速缓存数据多样化分布式文件nosql搜索引擎架构特点 应用架构单机调优动静分离SOA微服务 部署架构单机部署⻆⾊划分应⽤集群多层代理异地访问云平台 架构思想总结 版权声明 本博客的…

基于Python+OpenCV+dlib+Tensorflow深度学习的人脸表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 人脸表情识别是一种重要的计算机视觉任务&#xff0c;它涉及到对人脸图像中的表情进行分类和理解。在这个系统中&am…

C++STL库常用详解与原理

CSTL库 学习方法&#xff1a;使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展。 常用库 库名称所需头文件数据结构string#include<string>串vector#include<vector>动态数组list#include<list>带头双向循环链表queue#include<queu…

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList源码解析 文章目录 CopyOnWriteArrayList源码解析一、CopyOnWriteArrayList二、总结 一、CopyOnWriteArrayList 在 JUC 中&#xff0c;对于 ArrayList 的线程安全用法&#xff0c;比较推崇于使用 CopyOnWriteArrayList &#xff0c;那么CopyOnWriteArrayL…

HTTP2

HTTP 确认访问用户身份的认证 某些Web页面只想让特定的人浏览,或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。 何为认证 计算机本身无法判断坐在显示器前的使用者的身份。进一步说,也无法确认网络的那头究竟有谁。可见,为了弄清究竟是谁在访问服务器,就…

【Unity3D】MAX聚合广告SDK——Pangle广告接入(成了!成了!)

Pangle, App Monetization Simplified 注册 登录 创建应用 创建广告单元 将其应用ID和广告ID关联到MAX广告。 下载Pangle Unity Plugin包&#xff0c;新建一个空工程&#xff08;很重要&#xff09; Unity版本2019.4.0f1 gradle plugin 4.2.0 gradle版本6.7.1 build_tools 34.…

Java17(LTS Long Term Support)特性

支持JDK17的主流技术框架 spring framework 6.xspringboot 3.xkafka 3.0(不在支持jdk8)jenkins 2.357&#xff08;必须jdk11起步&#xff09;James Gosling表示赶紧弃用Java8&#xff0c;使用性能最好的JDK17Chart GPT也推荐JDK17&#xff0c;从长期到性能来说。 JDK17的特性 …

JRT对历史表和$get实现

由于Cache没有什么表数据大了查询和插入性能下降的问题&#xff0c;而关系库在数据量上千万后会性能下降&#xff0c;之前关注点都是Java业务脚本化和开发部署简单&#xff0c;还没管关系库单表大问题和级联查询复杂后慢的问题&#xff0c;现在开始解决这俩问题&#xff0c;这是…

socket 一个完整的不错的示例

从客户端向服务器端发送信息时&#xff0c;在服务器端有打印显示&#xff1b; 检测环境常用&#xff0c;备份一下 0&#xff0c;公共头文件代码 //config.h#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #inc…

人工智能的影响与挑战

人工智能是指通过模拟人类智能的各种特性和功能的技术和系统。对于普通大众来说&#xff0c;人工智能的爆发效应还是来源于chatGPT的爆火&#xff0c;大家第一次有了强烈的惊叹和危机。实际上&#xff0c;人工智能已经发展多年&#xff0c;像GPT的发展可以追溯到2018年&#xf…

深度学习笔记《一》:keras_core.layers.Conv2D()

一、说明 卷积&#xff0c;池化&#xff0c;激活函数&#xff0c;这三者号称是深度神经网络的三驾马车&#xff1b;其中卷积是最复杂的一个&#xff0c;因此&#xff0c;对卷积这个东西需要精心认知&#xff0c;这样对后面学习大有帮助。本篇为系列博文&#xff0c;专门介绍Cer…

亮相史上规模最大高交会,Coremail展现邮件技术创新实力

11月19日&#xff0c;第二十五届中国国际高新技术成果交易会在深圳落下帷幕&#xff0c;作为国内邮件行业引领者&#xff0c;Coremail受邀参展。 展览现场&#xff0c;Coremail邮件解决方案及系列产品受到了众多参观者与业内人士的关注与好评。Coremail XT6邮件系统技术成熟&a…