news 2026/4/16 17:47:55

ShardingSphere 分库分表我使用并踩坑了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ShardingSphere 分库分表我使用并踩坑了

为啥要分库分表

业务随着变化,表的内容变得越来越多,一个表里面的数据会日积月累的增加,而且之前的数据很少在看了,并降低了查询的效率。业务只关注前几个月的数据,统计数据,所以很多数据现代没有用了,所以可以在后期再去定时生成汇总。目前要分表分库只有一个业务库,工单工作量,把每天的项目工作情况进行分析下来,并记录下来,也就是日工作量。出现了大量无用项目信息工单信息。

已有数据表结构

已经跑了几个月的数据,表突然涌现出一天千万数据,原来业务数据上来了,一些不看好的项目开始录入系统了,系统突然卡死了,被大屏系统每5秒就拉去数据,把系统搞垮了,查询一下子慢了30秒。分析原因,找到事故接口。

开始操作了

大屏里面的数据进行查询,你频繁我就加缓存,数据来的并不快,可是他们查询的快,导致无效查询次数太多,这样我加入缓存,减少了数据库查询的次数。
统计和业务功能界面,我添加了日期查询的策略,先看到是一周的日期,进行日期添加索引,原来的20秒,瞬间回到1秒左右。
总算扛过了。但是业务还在涨啊,数据还在增加啊。
我提出,可以把已完成的项目数据进行归档处理可以吗?业务部门不乐意,他们觉得现在查询就符合他们的业务情况。
我的单表让我如何撑住。

引入ShardingSphere 将它原来不变,进行季度分表处理吧,当这个库10个的时候在分表,这个还有点时间,先把季度库创建,当然表结构一样。

为啥用它ShardingSphere ,就是觉得它基本上业务代码和库表都不用改,只改配置即可。

ShardingSphere 很坑

1、demo example基本上不全。
2、官网 https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/ 简单的如没有写一样。
3、版本坑,我使用4x 还是5x 呢? 有啥区别呢?
4、我用的还是国产数据库,是否支持。
5、我使用的dynamic 已经查询了好多库了,是否还能支持。让我感觉道路一片空白。

ShardingSphere 真好用

使用ShardingSphere-JDBC数据分片功能即可。其他 ShardingSphere-Proxy 它支持性不好,数据库基本不用想了放弃。
使用 ShardingSphere-JDBC 先正常的 配置pom

<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc</artifactId> <version>${latest.release.version}</version> <exclusions> <exclusion> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>1.33</version> </dependency>

yml 里面配置

datasource: dynamic: datasource: master: ##原来的 url: ‘’ driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver username: password: master2: ## 新增的 driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver url: jdbc:shardingsphere:classpath:shading-auto-tables-algorithm.yaml

shading-auto-tables-algorithm.yaml的添加即可

# JDBC 逻辑库名称。在集群模式中,使用该参数来联通 ShardingSphere-JDBC 与 ShardingSphere-Proxy。 # 默认值:logic_db databaseName (?): mode: dataSources: rules: - !FOO_XXX ... - !BAR_XXX ... props: key_1: value_1 key_2: value_2

这个就是官网给的,我反增思考了半天
我不把我的yaml 贴出来了,但是把坑读者也看不到,我找到一个很全的,分库还分表的情况了,还有多表进行同步并读写分离的情况都分析到了,比我的好多了。

dataSources: ds0: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/ds_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true username: root password: ilxw ds1: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/ds_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true username: root password: ilxw ds2: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/ds_2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true username: root password: ilxw ds3: dataSourceClassName: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/ds_3?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&useTimezone=true username: root password: ilxw rules: - !SHARDING tables: # 订单表基础表 t_ent_order: # 真实表 actualDataNodes: ds$->{0..3}.t_ent_order # 分库策略 databaseStrategy: complex: shardingColumns: id,ent_id shardingAlgorithmName: hash-slot-algorithm # 订单详情表 t_ent_order_detail: actualDataNodes: ds$->{0..3}.t_ent_order_detail # 分库策略 databaseStrategy: complex: shardingColumns: id,ent_id shardingAlgorithmName: hash-slot-algorithm # 订单条目表 t_ent_order_item: actualDataNodes: ds$->{0..3}.t_ent_order_item_$->{0..7} # 分库策略 databaseStrategy: complex: shardingColumns: id,ent_id shardingAlgorithmName: hash-slot-algorithm # 分表策略 tableStrategy: complex: shardingColumns: id,ent_id shardingAlgorithmName: hash-slot-table-algorithm # 绑定表 bindingTables: - t_ent_order,t_ent_order_detail # 分片算法 shardingAlgorithms: hash-slot-algorithm: type: CLASS_BASED props: strategy: complex algorithmClassName: cn.javayong.shardingjdbc5.spring.common.sharding.HashSlotAlgorithm hash-slot-table-algorithm: type: CLASS_BASED props: strategy: complex algorithmClassName: cn.javayong.shardingjdbc5.spring.common.sharding.HashSlotAlgorithm # 非默认值,直接对分片数取余 directIndex: true # 广播 - !BROADCAST tables: - t_city props: # 日志显示 SQL sql-show: true

我只需要改的地方还有一个在哪个方法的service里面添加@DS(“master2”) 即可。启动失败问题收集
1、找不到表提示不存在表 配置
actualDataNodes: ds$->{0…3}.t_ent_order_detail
这个参数错误。
2、HashSlotAlgorithm 这个算法
如果没有什么特殊表,基本初始化即可。
3、版本和spring 不适应怎么办。那就从低到高测试一遍,基本不是代码问题,都是版本问题。
4、druid 的版本问题。只有升级升级。

其他

基本稳定运行了,按照时间查询解决我一半的问题。
actualDataNodes 有个问题,我只能创建一年的四个表结构,如何我让程序生成表结构,插入数据没有问题,就是查询不出来,就得手动添加actualDataNodes 里面的表结构重启程序就可以了,好难受啊。

当然这个框架好牛的,影子库提供的影子算法,然后测试了好多次都没有成功。学习还在路上。加油各位。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 12:36:16

PyTorch-CUDA-v2.6镜像如何实现跨平台迁移(Windows/Linux)

PyTorch-CUDA-v2.6 镜像如何实现跨平台迁移&#xff08;Windows/Linux&#xff09; 在深度学习项目中&#xff0c;一个让人头疼的常见问题就是&#xff1a;“为什么代码在我电脑上跑得好好的&#xff0c;换台机器就报错&#xff1f;” 更具体一点&#xff1a;本地用 Windows 做…

作者头像 李华
网站建设 2026/4/16 16:30:25

PyTorch-CUDA-v2.6镜像如何监控GPU利用率?nvidia-smi命令教学

PyTorch-CUDA-v2.6镜像中如何监控GPU利用率&#xff1f;nvidia-smi实战指南 在深度学习项目中&#xff0c;我们常常会遇到这样的问题&#xff1a;训练脚本已经跑起来了&#xff0c;但速度远低于预期。CPU使用率飙高&#xff0c;GPU却“纹丝不动”——这种资源错配不仅浪费算力&…

作者头像 李华
网站建设 2026/4/16 7:36:44

ALU初探:如何执行AND、OR、NOT操作

从零构建计算的基石&#xff1a;揭秘ALU如何执行AND、OR与NOT操作你有没有想过&#xff0c;当你在代码中写下a & b的一瞬间&#xff0c;计算机底层究竟发生了什么&#xff1f;那看似轻巧的一个按位与操作&#xff0c;背后其实是一场精密的硬件协奏曲——主角&#xff0c;正…

作者头像 李华
网站建设 2026/4/16 7:32:54

基于模型的协同过滤:原理与实战解析

推荐系统进阶之路&#xff1a;从矩阵分解到深度协同过滤你有没有想过&#xff0c;为什么淘宝总能“猜中”你想买的那双鞋&#xff1f;为什么抖音刷着刷着就全是你的兴趣内容&#xff1f;这背后的核心技术之一&#xff0c;就是基于模型的协同过滤。在信息爆炸的时代&#xff0c;…

作者头像 李华
网站建设 2026/4/16 10:46:35

Elasticsearch基本用法在Kibana中的完整示例演示

从零上手&#xff1a;在 Kibana 中实战 Elasticsearch 核心操作 你有没有遇到过这样的场景&#xff1f;日志堆积如山&#xff0c;排查问题像大海捞针&#xff1b;商品搜索不精准&#xff0c;用户一搜“耳机”出来一堆充电宝&#xff1b;监控数据分散各处&#xff0c;想看个趋势…

作者头像 李华
网站建设 2026/4/16 9:05:11

Day43 训练和测试的规范写法

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np# 设置中文字体支持 plt.rcParams["font.family"] …

作者头像 李华