【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.DruidDataSourceurl: jdbc:mysql://127.0.0.1:3306/shen-devusername: shenpassword: 123456ds_2020:# 数据源链接池完整类名dataSourceClassName: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://127.0.0.1:3306/shen-unify-2020username: shenpassword: 123456ds_2021:# 数据源链接池完整类名dataSourceClassName: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://127.0.0.1:3306/shen-unify-2021username: shenpassword: 123456ds_2022:# 数据源链接池完整类名dataSourceClassName: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://127.0.0.1:3306/shen-unify-2022username: shenpassword: 123456ds_2023:# 数据源链接池完整类名dataSourceClassName: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://127.0.0.1:3306/shen-unify-2023username: shenpassword: 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# 是否禁用分片审计hintallowHintDisable: 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-patterndatetime-lower: "2020-01-01 00:00:00"# 分片上界值,格式必须同上面的datetime-patterndatetime-upper: "2050-01-01 00:00:00"# 分片数据源或真实表的后缀格式sharding-suffix-pattern: "yyyy"# 分片键时间间隔,超过该时间间隔将进入下一分片datetime-interval-amount: 1# 分片键时间间隔单位 DAYS/MONTHS/YEARSdatetime-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: 1datetime-interval-unit: "MONTHS"# 分布式序列算法配置keyGenerators:uuid:type: UUIDauditors:sharding_key_required_auditor:type: DML_SHARDING_CONDITIONS# 广播表,我这里没有广播表
#- !BROADCAST
#  tables:
#    - t_address# 单表
- !SINGLEtables:# 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才晓得怎么耍的。如果你们也要尝试使用这个算法,可以用下面这段代码校验:

    @Testpublic 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 分片算法-时间范围分片》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库应用:MongoDB 库与集合管理

目录 一、理论 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 二、实验 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 三、问题 1.不显示新创建的数据库 2.插入数据报错 3.删除指定数据库报错 一、理论 1.MongoDB用户管理 (1) 内置角色 数据库用户…

11.28 知识回顾(Web框架、路由控制、视图层)

一、 web 框架 1.1 web框架是什么&#xff1f; 别人帮咱们写了一些基础代码------》我们只需要在固定的位置写固定的代码--》就能实现一个web应用 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多…

2020年6月9日 Go生态洞察:VS Code Go扩展加入Go项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

unity学习笔记10

一、生命周期函数 1.Awake() 调用时间&#xff1a;对象被激活或创建时。 用途&#xff1a;通常用于初始化对象的状态&#xff0c;获取组件引用或执行其他在脚本生命周期早期需要完成的任务。 2.OnEnable(): 调用时间&#xff1a;对象激活时&#xff0c;包括对象被创建和Se…

Python数据预处理详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 数据预处理是数据科学中至关重要的步骤&#xff0c;它包括清洗、转换、归一化等操作&#xff0c;以使数据适合于机器学习模型的使用。Python提供了多种强大的库和工具&#xff0c;能够帮助进行数据预处理。本文将…

idea 2023使用技巧(一)

IntelliJ IDEA在业界被公认为最好的java开发工具之一。它能给你良好的开发体验。 idea版本号为2023.2.5。 1 基础操作 1.1索引 idea首次加载项目时&#xff0c;都会创建索引&#xff0c;创建索引的时间跟项目的文件多少成正比。idea的缓存和索引主要是用来加快文件查询&…

JVM 参数介绍

在一些规模稍大的应用中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;的内存设置尤为重要&#xff0c;想在项目中取得好的效率&#xff0c;GC&#xff08;垃圾回收&#xff09;的设置是第一步。 PermGen space&#xff1a;全称是Permanent Generation space.就是说是永久…

计算机丢失vcomp140.dll是什么意思,如何解决与修复(附教程)

vcomp140.dll缺失的5种解决方法以及vcomp140.dll缺失原因 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll缺失”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;给使用者带来了困扰。本文…

【Python3】【力扣题】367. 有效的完全平方数

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;Python函数。num的平方根 或者 num的0.5次幂。 知识点&#xff1a;float.is_integer(...)&#xff1a;判断浮点数的值是否等于整数。也可以&#xff1a;浮点数.is_integer()。 pow(a,b)&…

2020年4月20日 Go生态洞察:2019年Go开发者调查结果

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

springcloud进销存管理系统源码

开发说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看产品&#xff0c;采购&#xff0c;销售数量&#xff1b;统计近…

入门必读:Figma软件的功能和用途一览!

1、Figma软件是做什么的 Figma软件奠定了在线设计工具的形式&#xff0c;产品UI设计功能非常强大&#xff0c;Figma软件基于web操作&#xff0c;无论是macos、windows可以使用这个软件&#xff0c;即使有电脑、浏览器、网络&#xff0c;甚至软件也不需要下载&#xff0c;节省了…

Zotero | 取消翻译后自动添加笔记

目录 Step1&#xff1a;点击 “编辑” << “首选项” Step2&#xff1a;“翻译” << 取消勾选 “自动翻译批注” 在 Zetoro 中&#xff0c;选择颜色标记勾画的内容&#xff0c;将会自动生成一条笔记&#xff0c;如下图所示&#xff1a; 本人觉得很鸡肋&#xff0…

【javaScript面试题】2023前端最新版javaScript模块,高频24问

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;博主收集的关于javaScript的面试题 目录 一、2023javaScript面试题精选 1.js的数据类型…

MindStudio学习记录三:推理应用开发 acl mindx sdk

1.推理应用流程 1.1.创建工程 1.2.模型转换 1.3代码开发 1.3.1ACL代码 1.3.2MindX SDK开发 可视化模块化设计 中间的图片与处理 是基于AIPP的可视化处理 1.5.编译 交叉编译 1.6.运行与调试 1.7 调优工具 profiling性能分析 2.开发举例 resnet-50 2.1 准备工程 2.2.准备模型…

10分钟快速入门UI自动化-Puppeteer

这次带大家入门的是转转内部实现UI自动化测试的一种方案&#xff1a; PuppeteerMocha 目前应用于转转图书、奢侈品、商业等业务等多个Web/H5业务的线上流程监控&#xff1b; 先简单介绍一下&#xff1a; Mocha 是JavaScript的一种单元测试框架 Puppeteer 是一个 Node 库&…

相关性分析和作图

相关的类型 1. Pearson、Spearman和Kendall相关 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。&#xff08;连续&#xff09; Spearman等级相关系数则衡量分级定序变量之间的相关程度。&#xff08;分类&#xff09; Kendall’s Tau 相关系数也是一种非参数的…

C语言--不创建第三个变量,实现对两个数字的交换

我们先来看一下&#xff0c;创建临时变量交换两个数字。 #include<stdio.h> {int a2;int b3;int tmp0;printf("before:a%d b%d\n",a,b);tmpa;ab;btmp;printf("after:a%d b%d\n",a,b);return 0; } 图解&#xff1a; 运行结果&#xff1a; 再看一下不…

第二十章(多线程)

一.线程的简介 Windows操作系统是多任务操作系统&#xff0c;它以进程为单位。一个进程是一个包含有自身地址的程序&#xff0c;每个独立执行的程序都称为进程。也就是说每个正在执行的程序都是一个进程。系统可以分配给每一个进程有一段有限的使用CPU的时间&#xff08;也可以…