【经验总结】ShardingSphere+Springboot-02 数据分片、标准分片算法、时间间隔分片算法

news2024/11/13 18:02:32

文章目录

    • 三、分片算法配置
      • 3.1 数据分片
        • 3.1.2 垂直分片
        • 3.1.2 水平分片
      • 3.2 (标准)分片算法
        • 3.2.1 INLINE 基于行表达式的分片算法 (必须掌握)
          • 关于是否开启范围查找
        • 3.2.2 INTERVAL 时间范围分片算法

三、分片算法配置

3.1 数据分片

理解数据分片有助于后续分片算法的配置和设计出适配分库分表的SQL语句和业务逻辑。推荐阅读原文

  • https://shardingsphere.apache.org/document/5.2.1/cn/features/sharding/

这里摘要一些精华片段

传统的将数据集中存储至单一节点的解决方案,在性能、可用性和运维成本这三方面已经难于满足海量数据的场景。

从运维成本方面考虑,当一个数据库实例中的数据达到阈值以上,对于 DBA 的运维压力就会增大。 数据备份和恢复的时间成本都将随着数据量的大小而愈发不可控。一般来讲,单一数据库实例的数据的阈值在 1TB 之内,是比较合理的范围。

通过分库和分表进行数据的拆分来使得各个表的数据量保持在阈值以下,以及对流量进行疏导应对高访问量,是应对高并发和海量数据系统的有效手段。 数据分片的拆分方式又分为垂直分片和水平分片。

3.1.2 垂直分片

按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。 ……下图展示了根据业务需要,将用户表和订单表垂直分片到不同的数据库的方案。

image-20240807150922245

优点:垂直分片在不借助专业的分片设计组件实现根据业务拆分数据库

缺点:垂直分片往往需要对架构和设计进行调整;通常来讲,是来不及应对互联网业务需求快速变化的;而且,它也并无法真正的解决单点瓶颈

技术选型:借助多数据源组件和业务逻辑的修改即可实现,比较常见的微服务架构在考虑模块区分时一般也会将数据库按模块进行划分,这就是一种常见的垂直分片设计。

3.1.2 水平分片

水平分片又称为横向拆分。 相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。

例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表),如下图所示。

image-20240807151010924

优点:水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是数据分片的标准解决方案。

缺点&挑战

  • 面对如此散乱的分片之后的数据,应用开发工程师和数据库管理员对数据库的操作变得异常繁重就是其中的重要挑战之一。 他们需要知道数据需要从哪个具体的数据库的子表中获取

  • 另一个挑战则是,能够正确的运行在单节点数据库中的 SQL,在分片之后的数据库中并不一定能够正确运行。 例如,分表导致表名称的修改,或者分页、排序、聚合分组等操作的不正确处理。

  • 跨库事务也是分布式的数据库集群要面对的棘手事情。…… 合理采用分表,可以在降低单表数据量的情况下,尽量使用本地事务……不能避免跨库事务的场景,有些业务仍然需要保持事务的一致……互联网巨头大多采用最终一致性的柔性事务代替强一致事务。

ShardingSphere的设计目的:

尽量透明化分库分表所带来的影响,让使用方尽量像使用一个数据库一样使用水平分片之后的数据库集群,是 Apache ShardingSphere 数据分片模块的主要设计目标。

3.2 (标准)分片算法

官方提供了很多算法,具体可以看官方文档,在实际开发场景中可以根据业务实际情况来选择分片算法;这里主要介绍一下常用的几类标准分片算法。

3.2.1 INLINE 基于行表达式的分片算法 (必须掌握)

使用 Groovy 的表达式,提供对 SQL 语句中的 =IN 的分片操作支持,只支持单分片键。 对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的 Java 代码开发,如: t_user_$->{u_id % 8} 表示 t_user 表根据 u_id 模 8,而分成 8 张表,表名称为 t_user_0t_user_7

可用的配置参数如下:

属性名称数据类型说明默认值
algorithm-expressionString分片算法的行表达式
allow-range-query-with-inline-sharding (?)boolean是否允许范围查询。注意:范围查询会无视分片策略,进行全路由false

举例:想上面快速开始中的配置

#...
        # 配置分片算法
        sharding-algorithms:
          # 分库策略:根据age取余2
          student_age_inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{age % 2}
          # 分表策略:根据classid取余2
          student_class_id_inline:
            type: INLINE
            props:
              algorithm-expression: student$->{class_id % 2}
关于是否开启范围查找
  • 允许范围查询:当设置为 true 时,这个配置项允许使用行表达式分片算法的表进行范围查询。范围查询是指查询条件中包含大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等操作符的查询。

  • 限制:默认情况下,行表达式分片算法不支持范围查询,因为范围查询可能涉及多个分片,而简单的行表达式分片算法通常只能将查询路由到单个分片。如果设置为 false(默认值),则范围查询会被限制,只能针对单个分片进行,这可能会导致查询结果不完整或者查询失败。

举个例子,比如分片键为字段age,要执行SQL语句

SELECT id,name,age,class_id FROM student WHERE (age BETWEEN ? AND ?)

如果不开启该项,运行相关的sql则会报错

image-20240807153832048

修改配置后则会看到正确的运行了范围查询语句

Actual SQL: ds0 ::: SELECT  id,name,age,class_id  FROM student0 WHERE (age BETWEEN ? AND ?) UNION ALL SELECT  id,name,age,class_id  FROM student1 WHERE (age BETWEEN ? AND ?) ::: [20, 30, 20, 30]

Actual SQL: ds1 ::: SELECT  id,name,age,class_id  FROM student0  WHERE (age BETWEEN ? AND ?) UNION ALL SELECT  id,name,age,class_id  FROM student1  WHERE (age BETWEEN ? AND ?) ::: [20, 30, 20, 30]
3.2.2 INTERVAL 时间范围分片算法

源码位置:org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingAlgorithm

属性名称数据类型说明默认值
datetime-patternString分片键的时间戳格式,必须遵循 Java DateTimeFormatter 的格式。例如:yyyy-MM-dd HH:mm:ss,yyyy-MM-dd 或 HH:mm:ss 等。但不支持与 java.time.chrono.JapaneseDate 相关的 Gy-MM 等
datetime-lowerString时间分片下界值,格式与 datetime-pattern 定义的时间戳格式一致
datetime-upper (?)String时间分片上界值,格式与 datetime-pattern 定义的时间戳格式一致当前时间
sharding-suffix-patternString分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和 datetime-interval-unit 保持一致。例如:yyyyMM
datetime-interval-amount (?)int分片键时间间隔,超过该时间间隔将进入下一分片1
datetime-interval-unit (?)String分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHSDAYS

官方对于该算法的描述是在让人看不懂,我尝试通过一个测试可行的例子 帮助理解;

创建表结构如下,在同一个数据源中创建若干个表结构一样的打卡表

image-20240809090759514

实现目标:使用时间间隔分片算法,根据打卡时间进行分库(分表)

yaml配置文件

    rules:
      sharding:
        tables:
         # ...
          stu_clock:
            actual-data-nodes: dsmain.stu_clock${202301..202501}
            key-generate-strategy:
              column: id
              key-generator-name: snowflake
            table-strategy:
              standard:
                sharding-column: clockin_time
                sharding-algorithm-name: student_clock_interval
        # 配置分片算法
        sharding-algorithms:
        	# 声明一个时间间隔算法
          student_clock_interval:
            type: INTERVAL
            props:
              # 	时间分片下界值,格式与 datetime-pattern 定义的时间戳格式一致
              datetime-pattern: 'yyyy-MM-dd HH:mm:ss'
              datetime-lower: '2023-01-01 00:00:00'
              # 时间分片上界值,格式与 datetime-pattern 定义的时间戳格式一致 默认当前时间
              datetime-upper: '2025-01-01 00:00:00'
              # 分片数据源或真实表的后缀格式,必须遵循 Java DateTimeFormatter 的格式,必须和 datetime-interval-unit 保持一致。例如:yyyyMM
              sharding-suffix-pattern: 'yyyyMM'
              # 分片键时间间隔,超过该时间间隔将进入下一分片
              datetime-interval-amount: 1
              # 分片键时间间隔单位,必须遵循 Java ChronoUnit 的枚举值。例如:MONTHS
              datetime-interval-unit: 'MONTHS'

配置解释

INTERVAL算法的核心是让数据根据分片键按一定间隔规律进行分库分表,比如在上述配置中,

  • 我们声明了一个stu_clock表根据分片键【打卡时间】clockin_time进行【分表】配置;

  • 分片规则是按月份作为分片键间隔单位 datetime-interval-unit: 'MONTHS'

  • 并且声明了间隔单位为1,即每隔一个月就进入下一个分片 datetime-interval-amount: 1

    声明了间隔和单位后,我们已经可以推测出一定的分片规则,但是仍然有几个问题需要解决->

    • 如何体现当前分片
    • 解决“由于起终时间不同,间隔相同时,分片不确定的”问题
  • 所以进一步需要 :声明时间分片上下界值和分片数据源或真实表的后缀格式

进行测试

插入打卡时间为2024-08-08 17:42:54数据,SS根据分片算法识别到stu_clock202408 并成功插入数据

image-20240808174312851

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

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

相关文章

vue2学习 -- 路由

文章目录 1. 相关理解2. 基本使用2.1 安装2.2 嵌套路由2.3 路由传参2.3.1 query2.3.2 路由的命名2.3.3 params 2.4 路由的props配置2.5 routerlink的replace属性 3. 编程式路由导航4. 缓存路由组件5. 两个新的生命周期钩子6. 路由守卫6.1 全局前置 / 后置路由守卫6.2 独享路由守…

Java面试题--JVM大厂篇之Java中Parallel GC的调优技巧与最佳实践

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 常见痛点与解决方案 痛点一&#xff1a;长时间暂停 痛点二&#xff1a;频繁的Minor GC 痛点三&#xff1a;内存溢出 3. 调优参数推荐 4. 实战经验分享 结束语&#xff1a; 引言&#xff1a;…

海思AE模块Lines_per_500ms参数的意义

​ 基础知识 1秒(S)1000毫秒(ms)1000_000微妙(s)1000_000_000纳秒(ns) 1GHz1000Mhz1000_000KHz1000_000_000Hz 1Hz1/s 抗频闪原理 海思AE模块参数中有一个LinesPer500ms的参数&#xff0c;意思为500ms对应的曝光行数。此个参数和抗频闪有关。 我们知道&#xff1a; 50HZ…

SQL注入实例(sqli-labs/less-17)

0、初始网页 1、确定闭合字符 注入点在于password框&#xff0c;闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…

【C语言】通讯录的实现(基本版和动态版)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:C语言: C语言方向&#xff08;基础知识和应用&#xff09; (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、…

教育法、义务教育法、教师法、未成年人保护法、预防未成年人犯罪法、学生伤害事故处理办法

《中华人民共和国教育法》 《中华人民共和国义务教育法》 《中华人民共和国教师法》 《中华人民共和国未成年人保护法》 《中华人民共和国预防未成年人犯罪法》 《学生伤害事故处理办法》

C++:string

1.STL简介 STL&#xff08;standard template library标准模版库&#xff09;&#xff0c;是c标准库的重要组成部分&#xff0c;是一个包罗数据结构与算法的软件框架。 STL有很多版本&#xff0c;我们学习STL要阅读部分源代码&#xff0c;主要参考SGI版本。 STL的六大组件&a…

Volana:一款基于Go开发的Shell命令代码混淆工具

关于Volana Volana是一款功能强大的Shell命令代码混淆工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员实现对Shell命令或脚本代码的混淆处理。 在红队测试过程中&#xff0c;隐蔽性是非常重要的一个方面&#xff0c;许多基础设施会记录命令并实时将其发…

Java 中的泛型 集合(List,Set) Map

泛型的本质是参数化类型,即允许在编译时对集合进行类型检查,从而避免安全问题,提高代码的复用性 泛型的具体定义与作用 定义:泛型是一种在编译阶段进行类型检查的机制,它允许在类,方法,接口后通过<> 来声明类型参数.这些参数在编译时会被具体的类型替换.java在运行时,会通…

Java生成Word->PDF->图片:基于poi-tl 进行word模板渲染

文章目录 引言I Java生成Word、PDF、图片文档获取标签渲染数据生成文档案例II 工具类封装2.1 word 渲染和word 转 pfd2.2 pdf转成一张图片III poi-tl(word模板渲染) 标签简介文本标签{{var}}图片标签表格标签引用标签IV poi-tl提供了类 Configure 来配置常用的设置标签类型前后…

dwg图纸识别,提取建筑外轮廓坐标数据

1.业务流程说明 目的是通过dwg图纸&#xff0c;在网页端绘制出一个包括建筑外轮了的白模。为了达到这个目的&#xff0c;我们需要dwg图纸识别&#xff0c;提取到图纸中的建筑外轮廓的坐标数据。 2. 实施步骤 1.1 根据dwg图纸&#xff0c;转换成dxf文件&#xff0c;通过对dxf文…

区域与语言CultureInfo

CultureInfo 类 命名空间: System.Globalization 程序集: System.Globalization.dll 提供有关特定区域性&#xff08;对于非托管代码开发&#xff0c;则称为“区域设置”&#xff09;的信息。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期…

56 锐键交换机开局

锐键交换机开局 一 锐键视图切换 1 Ruijie> 用户视图 2 Ruijie# 特权模式 3 Ruijie(config)# 全局配置模式 4 Ruijie(config-if-GigabitEthernet 1/1/1)# 接口配置模式 5 Ruijie(config)#show vlan 6 exit (退出) 7 enable(进入)

【电子数据取证】支持最新版微信、企业微信、钉钉等重点应用数据提取分析!

文章关键词&#xff1a;电子数据取证、手机取证、云取证、电子物证、仿真取证 针对取证调查员目前在案件现场无法提取通讯聊天数据的情况&#xff0c;为了更好地适应这一实战需求&#xff0c;龙信科技快速响应对A303“鹰眼”介质快取系统和A315计算机快速采集系统全面升级&…

java10-集合框架

1. 集合的简介 1.1什么是集合 集合Collection&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提供了若干个…

人工智能安全态势和趋势

吴世忠 中工院士 国家保密科技委主任 重大风险隐患呼唤加强安全研究&#xff0c;人工智能面临未来担忧 1 总体态势 1.1 相对于技术发展&#xff0c;安全研究严重滞后 1.2 我国研究十分活跃&#xff0c;论文数量遥遥领先 1.3 影响力美国排名第一&#xff0c;大厂大学作用大 1…

【python】Python操作Redis数据库的详细教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

三防平板助力MES系统,实现工厂移动式生产报工

在当今竞争激烈的制造业环境中&#xff0c;提高生产效率、优化生产流程以及实现精准的生产管理已经成为企业生存和发展的关键。 MES系统作为连接企业计划层和控制层的桥梁&#xff0c;在实现生产过程的信息化、数字化和智能化方面发挥着重要作用。与此同时&#xff0c;三防平板…

JNPF快速开发平台助力企业实现工作流自动化

随着企业信息化建设的不断深入&#xff0c;工作流自动化已成为提升企业效率、优化业务流程的关键手段。JNPF快速开发平台凭借其强大的功能和灵活的配置&#xff0c;为众多企业提供了实现工作流自动化的高效解决方案。 关于低代码开发平台的普及应用 随着信息技术的迅猛发展&…

高中数学必修一函数部分重难点(上)

高中数学必修一函数部分重难点&#xff08;上&#xff09; 本文主要引出映射的概念&#xff0c;明确函数即为映射的一种方式&#xff0c;同时本篇叙述了我在初学时的困难点—定义域等以及当时所觉的难题&#xff0c;最后一图为纯手整理的干货&#xff0c;需要可以留下三联自行取…