ShardingSphere介绍

1. ShardingSphere简单介绍

ShardingSphere是一款目前业内比较流行的分库分表框架,到现在为止有接近十年的开发历程了,其 已经不仅仅只是⽤来做分库分表,⽽是形成了⼀个围绕 分库分表核⼼的技术⽣态。他的核⼼功能已经包括了数据分⽚、分布式事务、读写分离、⾼可 ⽤、数据迁移、联邦查询、数据加密、影⼦库、DistSQL庞⼤的技术体系。

ShardingSphere最为核⼼的产品有两个:⼀个是ShardingJDBC,这是⼀个进⾏客户端分库分
表的框架。另⼀个是ShardingProxy,这是⼀个进⾏服务端分库分表的产品。他们代表了两种不
同的分库分表的实现思路。

2. 为什么需要使用ShardingSphere

在任何一个商城或者收单系统中,单库单表或许在项目早期能够支撑,其就无法满足日益增长的用户和订单需求了,于是必须考虑到分库分表。在业界分库分表的框架有很多,比如Mycat、shardingsphere等等,考虑到Shardingsphere已经被收录进apache,作为顶级项目,且一直在更新维护,此次就选择Shardingsphere作为分库分表的底层框架。

3. 什么时候需要进行分库以及分表

我们知道当数据量过大的时候,我们就需要进行分库分表,那究竟什么时候代表数据量过大了呢?业界⽬前唯⼀⽐较值得参考的详细标准,是阿⾥公开的开发⼿册中提到的,建议预估三年内,单表数据超过500W,或者单表数据⼤⼩超过2G,就需要分库分表

4. 分库分表的难点

可能有些读者会觉得,不就是引入第三方框架,分库分表也蛮简单的呀。对于这类读者,建议多多了解shardingsphere结合实际业务场景的使用,同时思考一个问题,如何在分库分表的同时,保证系统性能不怎么受影响呢?

分库分表不是简单地框架的引入就可以解决的问题,它涉及到一系列的分布式服务问题,包括但不限于分布式订单id、分布式事务、分布式锁、读写分离以及分布式数据库等等业界常见的难点问题。同时如果使用ShardingJdbc进行分库分表的话,并不是所有SQL都能被ShardingSphere支持的,比如一些复杂嵌套查询sql,由于Shardingsphere无法将其按照算法拆分为特定条件,所以就无法被解析,这样在分库分表过程中可能会出现问题。

针对分库分表,我的建议是"能不分就不分",实在需要分,则在分库分表之前,对系统有很好的设计,同时至少需要考虑以下问题:
主键重复问题
在分库分表环境中,由于表中数据同时存在不同数据库中,某个数据库⽣成的ID就⽆
法保证全局唯⼀。因此需要单独设计全局主键,以避免跨库主键重复问题。
历史数据迁移问题
如果项目已经在生产运行一段时间,产生了各项数据,如何保证引入分库分表后,历史数据依旧可以被正常访问?
数据库扩容带来的数据迁移问题
当数据库集群需要进⾏扩缩容时,集群中的数据也需要随着服务进⾏迁移。如何在不影响
业务稳定性的情况下进⾏数据迁移也是数据库集群化后需要考虑的问题。
分布式事务问题
传统单库单表服务,我们可以使用本地事务进行事务管理,但是在多库多表的环境中,事务应该如何管理?
数据路由问题
插入的数据会被拆分到多个分片中,如何保证数据查询的时候寻找到对应的分片从而使数据不会"丢失"
归并问题
进⾏多个分片查询时,每个分散的数据库中只能查出⼀部分的数据,这时要对整体结果进⾏
归并,⽐如常⻅的limit、order by等操作,如何使数据复合要求?
实际场景中,分库分表带来的挑战不止上述几个问题,不同业务有不同的处理方式,我们很难寻找统一的解决方案去满足所有场景。

相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw4 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨4 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4045 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空5 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643146 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0016 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
誰能久伴不乏6 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
慕y2746 小时前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper