闲谭SpringBoot--ShardingSphere分库分表探究

文章目录

  • 1. 背景
  • 2. 创建数据库
  • 3. 修改yml配置文件
  • 4. 分片算法类
  • 5. 测试
  • 6 小结

1. 背景

接上文,我们对日志表,进行了按月的分表,这样每个月几百万条数据量还是扛得住的。

但是如果数据再多呢,除了提高硬件性能,还有一个可以考虑的方案就是分库。

例如,我们通过数据所属的地域、公司、部门等进行分库划分,当然具体根据什么划分,由需求决定。

本篇我们在上一篇《闲谭SpringBoot–ShardingSphere分表探究》的基础上,对日志表进一步按机构进行划分。

2. 创建数据库

首先创建两个数据库test、test1,每个数据库中都放入log_202411、log_202412、log202501、log_202502四张表,四张表结构是一样的如下:

注意,我们想实现按机构编号departId分库,然后同一个机构的数据,根据time再按月分表。

CREATE TABLE `log_202411` (
  `id` bigint(20) NOT NULL,
  `content` varchar(255) DEFAULT '',
  `time` datetime DEFAULT NULL,
  `departId` bigint(20) DEFAULT 0,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

3. 修改yml配置文件

配置两个数据库,注意ds0和ds1分别对应数据库test/test1。
在这里插入图片描述
配置分片方式,首先配置默认的库:
然后
然后针对log表配置分片规则,如下表达式意味着:对log表来说,数据库是ds加一个字符串,表则是log加一个字符串,至于加什么字符串,由分片算法指定。
在这里插入图片描述

接下来就是分片算法了,注意按机构分库我们只需要使用=和IN操作,所以只需要配置精确分片算法即可。

而时间还需要范围查询,所以按时间分表还需要一个范围分片算法。
在这里插入图片描述

完整配置如下:

server:
  port: 8080
  servlet:
    context-path: /sharding
spring:
  shardingsphere: # 数据库配置
    sharding:
      default-data-source-name: ds0 #注意:不分库时,默认的数据库源
      default-database-strategy: #默认的分库策略
        inline:
          sharding-column: id
          algorithm-expression: ds0
      tables: #数据分片规则配置
        log: # 逻辑表名称
          actual-data-nodes: ds${0..1}.log$->{1..2} # 由数据源名 + 表名组成(参考 Inline 语法规则)
          database-strategy: # 分库策略
            standard:
              precise-algorithm-class-name: org.example.sharding.config.DepartPreciseShardingAlgorithm # 精确分片算法类名称,用于=和IN
              sharding-column: departId # 分片列名称
          table-strategy: # 分表策略
            standard: # 行表达式分片策略
              precise-algorithm-class-name: org.example.sharding.config.MonthPreciseShardingAlgorithm # 精确分片算法类名称,用于=和IN
              sharding-column: time # 分片列名称
              range-algorithm-class-name: org.example.sharding.config.MonthRangeShardingAlgorithm  # 范围分片算法类名称,用于BETWEEN
          key-generator: # key生成器
            column: id
            type: SNOWFLAKE  # SnowflakeShardingKeyGenerator
            props:
              worker: # SNOWFLAKE算法的worker.id
                id: 100
              max: # SNOWFLAKE算法的max.tolerate.time.difference.milliseconds
                tolerate:
                  time:
                    difference:
                      milliseconds: 20
    datasource:
      names: ds0,ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        name: test
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true
        username: root
        password: 123456
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        name: test1
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true
        username: root
        password: 123456

4. 分片算法类

编写按机构分库算法类:

/**
 * 按机构精确分片算法类
 */
/**
 * 按机构精确分片算法类
 */
@Slf4j
public class DepartPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        // 获取分片键值
        Object object = shardingValue.getValue();
        Integer num = 0;//默认分片序号
        try {
            num = Integer.parseInt(object.toString()) % 2;//机构id为偶数,数据进入ds0;机构id为奇数,数据进入ds1;
        } catch (Exception e) {
            log.error("按机构精确分片算法类报错:{}", e.getMessage());
        }
        // 返回要进入的表名称
        String tableName = "ds" + num;
        log.info("精确分片结果:{}", tableName);
        return tableName;
    }
}

5. 测试

接下来发起测试,我们测试一个机构id为偶数的例子:
在这里插入图片描述

通过断点查看分片情况,首先触发了分库分片算法,数据进入ds0
在这里插入图片描述

然后触发了分表分片算法:
在这里插入图片描述
所以数据会进入ds0库的log_202501表。
在这里插入图片描述
然后我们测试下查询:
在这里插入图片描述
运行后分片结构如下:
在这里插入图片描述
说明我们的分片算法是正确的。

6 小结

通过分库分表,支持每月千万级数据量问题基本不大。

如果再多,每月上亿、十亿、百亿级别,哈哈,我也不知道啦,因为我还没遇到过。

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

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

相关文章

基于伪分布式模式部署Hadoop集群

1.上传Hadoop安装包 在/export/software目录下使用rz命令上传Hadoop安装包 2.创建目录 在/export/servers目录下创建wfb-hadoop目录&#xff0c;用于存放Hadoop的安装目录&#xff0c;命令如下&#xff1a; mkdir -p /export/servers/wfb-hadoop 3.安装Hadoop 1)将Hadoop安…

Android车载音频系统目录

目录 第一章 1.1 Android Automotive&#xff08;一&#xff09; 1.2 Android Automotive&#xff08;二&#xff09; 1.3 Android Automotive&#xff08;三&#xff09; 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…

怎么管理电脑usb接口,分享四种USB端口管理方法

怎么管理电脑usb接口&#xff0c;分享四种USB端口管理方法 USB接口作为电脑重要的外部接口&#xff0c;方便了数据传输和设备连接。 然而&#xff0c;不加管理的USB接口也可能带来安全隐患&#xff0c;例如数据泄露、病毒传播等。 因此&#xff0c;有效管理电脑USB接口至关重…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

conda+jupyter+pycharm:如何在Windows conda环境下运行jupyter并使用浏览器或者pycharm运行.ipynb

1 安装conda 2 conda环境下安装jupyter pip install jupyter3 设置jupyter配置文件 1&#xff09;创建 jupyter_notebook_config.py文件 jupyter notebook --generate-config 2&#xff09;设置密码 3&#xff09;设置参数 直接将以下参数修改为自己的配置后复制到配置文件…

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…

【江协STM32】9-1/2/3 USART串口协议、USART外设、串口发送串口发送+接收

1. 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发全双工&#xff1a;指通信双方能够同时进行双向通信。发送线路和接收线路互不影响&#xff0c…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

【网络】电路交换(Circuit Switching)、报文交换(Message Switching)和分组交换(Packet Switching)

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;一条专用的通信线路&#xff08;或电路&#xff09;&#xff08; 电话专用线路&#xff0c;好处&#xff1a;专用稳定&#xff0c;有没有数据都被占用&#xff0c;坏处&#xff1a;容易浪费&#xff09; 报文交换…

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有&#xff0c;下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动&#xff0c;开通root可以直接点击下面的启动&#xff0c;如果没有就…

游戏关卡设计的常用模式

游戏关卡分为很多种&#xff0c;但常用的有固定套路&#xff0c;分为若干种类型。 关卡是主角与怪物、敌方战斗的场所&#xff0c;包括装饰物、通道。 单人游戏的关卡较小&#xff0c;偏线性&#xff1b; 联机/MMO的关卡较大&#xff0c;通道多&#xff0c;自由度高&#xf…

DC/AC并网逆变器模型与仿真MATLAB

DC/AC并网逆变器是一种将直流电&#xff08;DC&#xff09;转化为交流电&#xff08;AC&#xff09;&#xff0c;并将其与电网并联的设备。它的核心功能是实现直流电源&#xff08;如光伏电池板或储能电池&#xff09;与电网的有效连接&#xff0c;同时保证输出电能质量满足电网…

作业:IO:day2

题目一 第一步&#xff1a;创建一个 struct Student 类型的数组 arr[3],初始化该数组中3个学生的属性 第二步&#xff1a;编写一个叫做save的函数&#xff0c;功能为 将数组arr中的3个学生的所有信息&#xff0c;保存到文件中去&#xff0c;使用fread实现fwrite 第三步&#xf…

环动科技平均售价波动下滑:大客户依赖明显,应收账款周转率骤降

《港湾商业观察》施子夫 2024年12月18日&#xff0c;浙江环动机器人关节科技股份有限公司&#xff08;以下简称&#xff0c;环动科技&#xff09;的上市审核状态变更为“已问询”&#xff0c;公司在11月25日科创板IPO获上交所受理&#xff0c;独家保荐机构为广发证券。 此次环…

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP 02-AMDP Functions for CDS Table Functions

1. 创建一个Core Data Service Table Functions 新建 Core Data Service Table Function 定义CDS Table Functions EndUserText.label: a simple AMDP for CDS Table Functions ClientDependent: true //打开 Open SQL 的自动客户端处理 defin…

Ungoogled Chromium127 编译指南 MacOS篇(八)- 开始编译

1. 引言 完成了所有依赖包的安装后&#xff0c;我们终于来到了最关键的编译阶段。在开始编译之前&#xff0c;有一些重要的配置信息需要了解。本文将指导您完成整个编译过程。 2. 签名相关说明 虽然在我们的测试编译中不需要进行签名操作&#xff0c;但了解官方的签名要求仍…

SpringBootWeb案例-1(day10)

准备工作 需求 & 环境搭建 需求说明 环境搭建 步骤&#xff1a; 准备数据库表(dept、emp)创建 springboot 工程&#xff0c;引入对应的起步依赖&#xff08;web、mybatis、mysql 驱动、lombok&#xff09;配置文件 application.properties 中引入 mybatis 的配置信息&…

动手学深度学习-卷积神经网络-1从全连接层到卷积

目录 不变性 多层感知机的限制 平移不变性 局部性 卷积 “沃尔多在哪里”回顾 通道 小结 我们之前讨论的多层感知机十分适合处理表格数据&#xff0c;其中行对应样本&#xff0c;列对应特征。 对于表格数据&#xff0c;我们寻找的模式可能涉及特征之间的交互&#xff0…

【HTML+CSS+JS+VUE】web前端教程-4-标签之段落、换行、水平线

标签之段落 段落是通过<p>标签定义的换行 如果您希望在不生产一个新段落的情况下进行换行&#xff08;新行&#xff09;&#xff0c;请使用<br><br />元素是一个空的HTML元素 <p>这个<br>段落<br>演示了分行的效果</p>水平线 <…