目录
一、ShardingSphere介绍
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,包括3个独立的产品:JDBC、Proxy & Sidecar。它们都提供了数据横向扩展、分布式事务和分布式治理的功能。
1. ShardingSphere-JDBC
轻量级java框架,以jar包的形式提供。应用层直接连接数据库(直接实现分库分表),无需额外的部署和依赖,如下图所示。其直接封装JDBC API,且支持JPA、Hibernate、Mybatis、Spring JDBC Template等DAO层框架,支持第三方连接池DBCP、Druid、HikariCP。
ShardingSphere-JDBC支持分库分表、读写分离、跨库Join/分页/排序、XA事务、柔性事务(最终一致性)。
优点:JDBC层灵活性好,侵入性少
缺点:耦合了分库分表逻辑,连接多导致连接不够用
2. ShardingSphere-Proxy
自身为一个透明的数据库代理(中间件),提供一个数据库服务器(实现分库分表),如下图所示。
优点:解耦分库分表逻辑,减少数据库连接数,支持多种编程语言
缺点:需要维护,考虑中间件的HA/负载均衡
3. ShardingSphere-Sidecar
自身为Kubernetes环境的云原生数据库代理,以sidecar的形式负责所有的数据库访问。它提供了一个与数据库交互的网格层,如下图所示。
4. 三种区别
ShardingSphere-JDBC | ShardingSphere-Proxy | ShardingSphere-Sidecar | |
数据库 | 任何 | MySQL/PostgreSQL | MySQL/PostgreSQL |
连接消耗数 | 高 | 低 | 高 |
支持语言 | 仅 Java | 任何 | 任何 |
性能 | 低损耗 | 相对较高的损耗 | 低损耗 |
无中心化 | 有 | 无 | 有 |
静态入口 | 无 | 有 | 无 |
5. 混合架构JDBC + Proxy
![](https://i-blog.csdnimg.cn/blog_migrate/fa28dd2795621183c7e6cfbc22bf5159.png)
二、数据库拆分
1. 垂直分库
垂直分库:按照业务将表进行分类,分布到不同的数据库(不影响表结构),每个库可以放在不同的服务器上,它的核心理念是专库专用。如下图所示。
优点:解耦业务耦合,业务清晰;提升IO、连接数,降低单机硬件资源的瓶颈
缺点:无法解决单表数据量过大问题
2. 水平分库
水平分库:同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。 如下图所示。需要事务时,采用分布式事务。提高了并发量,却牺牲数据的强一致。
优点:解决数据量大;并发量
缺点:JOIN/分页/排序、分布式事务性能消耗
3. 垂直分表
垂直分表:将一个表按照字段分成多表,每个表存储其中一部分字段。 如下图所示。
优点:热点字段与冷字段分开(避免IO竞争)
缺点:无法解决单表数据量过大问题
4. 水平分表
水平分表:同一个数据库内,把同一个表的数据按一定规则拆到多个表。如下图所示。
优点:解决数据量大;并发量
缺点:JOIN/分页/排序消耗
5. 总结
类型 | 垂直分库 | 水平分库 | 垂直分表 | 水平分表 |
概念 | 业务划分库 | 一个表的数据(按数据行)分到多个不同库 | 宽表字段按访问频次、是否是大字段的原则拆分为多个表 | 一个表的数据(按数据行)分到同一个库 |
优点 | 业务解耦、提升IO、连接数 | 解决数据量大、并发量大 | 热点字段、减少IO竞争 | 解决数据量大、并发量大 |
缺点 | 无法解决单表数据量大 | JOIN/分页/排序性能低 | 无法解决单表数据量大 | JOIN/分页/排序性能低 |
总结 | 垂直拆分:无法解决单表数据量大的问题; 水平拆分:解决单表数据量大,但是出现跨库/跨表的JOIN/分页/排序等问题 |
三、ShardingSphere分库分表相关概念
1. 逻辑表
水平拆分的表具有相同逻辑和数据结构表的总称。例:订单数据根据主键取模拆分为10 张表, 分别是t_order_0到t_order_9,他们的逻辑表名为t_order。
2. 真实表
数据库中真实存在的物理表。即上示例中的t_order_0到t_order_9。
3. 数据节点
数据分片的最小单元。由数据源名称和表名称组成,如:ds_0.t_order_0。
4. 绑定表
指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。 绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
5. 全局表/广播表
所有分片中都有这个表。对全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性。查询操作时,只从一个数据节点获取,可以跟任何一个表进行JOIN操作。
6. 分片键
用于分片的数据库字段,是将表水平拆分的关键字段。SQL中如果无分片字段,将执行全路由,性能较差。
7. 分库分表策略
策略包括分片键和分片算法组成,其策略一般有取模、分区、路由表等。数据按照什么算法和规则进行存储,会直接影响数据的写入和读取。
四、参考资料
彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)_传智燕青-CSDN博客_分库分表