1.什么是 Sharding Sphere
Apache ShardingSphere(Incubator) 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。
ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。
Apache官方发布从4.0.0版本开始。 ShardingSphere官方地址官方文档写的比较详细,后续还要继续深入研究的话,需要跟着文档继续学习。
现在的 ShardingSphere 不单单是指某个框架而是一个生态圈,这个生态圈 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar 这三款开源的分布式数据库中间件解决方案所构成。
ShardingSphere 的前身就是 Sharding-JDBC,所以它是整个框架中最为经典、成熟的组件,我们先从 Sharding-JDBC 框架入手学习分库分表。
2.什么是分库分表
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
2.1 分库分表的方式
数据库的切分指的是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。
数据的切分根据其切分规则的类型,可以分为 垂直切分 和水平切分。
(1)垂直切分: 垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。垂直分表和垂直分库
(2)水平切分: 水平切分是按照某个字段的某种规则,把数据切分到多张数据表,或者存到归档数据库,起到缩表的效果,提高数据库查询速度,在每个表(库)中包含一部分数据,所有表加起来就是全量的数据。水平分表和水平分库
2.1.1 垂直分表
操作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一部分字段数据存到另外一张表里面
2.1.2 垂直分库
把单一数据库按照业务进行划分,专库专表
垂直切分的优点如下:
(1)拆分后业务清晰,系统之间进行整合或扩展很容易。
(2)按照成本、应用的等级、应用的类型等奖表放到不同的机器上,便于管理,数据维护简单。
垂直切分的缺点如下:
(1)部分业务表无法关联(Join), 只能通过接口方式解决,提高了系统的复杂度。
(2)受每种业务的不同限制,存在单库性能瓶颈,不易进行数据扩展和提升性能。
(3)事务处理变得复杂。
2.1.3 水平分表
2.1.4 水平分库
水平切分的优点:
(1)单库单表的数据保持在一定的量级,有助于性能的提高。
(2)切分的表的结构相同,应用层改造较少,只需要增加路由规则即可。
(3)提高了系统的稳定性和负载能力。
水平切分的缺点如下:
(1)切分后,数据是分散的,很难利用数据库的Join操作,跨库Join性能较差。
(2)分片事务的一致性难以解决,数据扩容的难度和维护量极大
3.什么时候进行分库分表,应该怎么开展?
1、应用
(1)在数据库设计时候考虑垂直分库和垂直分表
(2)随着数据库数据量增加,不要马上考虑做水平切分,首先考虑缓存处理,读写分离,使用索引等等方式,如果这些方式不能根本解决问题了,再考虑做水平分库和水平分表
2、分库分表问题
(1)跨节点连接查询问题(分页、排序)
(2)多数据源管理问题(涉及到分布式事务的操作)