文章目录
- 一、为什么要分片
- 二、什么是数据分片
- 1、垂直分片
- 2、水平分片
- 三、常用分片策略
- 1、Range
- 2、Hash
- 四、相关中间件
- 1、Sharding-Sphere
- 2、Sharding-jdbc
一、为什么要分片
从性能方面来说,由于关系型数据库大多采用B+树类型的索引,在数据量超过阈(yu)值的情况下,索引深度的增加也将使得磁盘访问的IO次数增加,进而导致查询性能的下降;同时,高并发访问请求也使得集中式数据库成为系统的最大瓶颈。
从可用性的方面来讲,服务化的无状态型,能够达到较小成本的随意扩容,这必然导致系统的最终压力都落在数据库之上。而单一的数据节点,或者简单的主从架构,已经越来越难以承担。
从运维成本方面考虑,当一个数据库实例中的数据达到阈值以上,对于DBA的运维压力就会增加,数据备份和恢复的时间成本都将随着数据量的大小而愈发不可控。一般来讲,单一数据库实例的数据阈值在1TB之内是比较合理的范围。如果过多的数据存于一张表中,对于查询影响较大。
二、什么是数据分片
数据分片指按照某个维度将存放在单一数据库中的数据分散的存放在多个数据库或表中以达到提升性能瓶颈以及可用性的效果。数据分片的拆分方式又分为垂直分片和水平分片。
1、垂直分片
按照业务拆分的方式称为垂直分片,又称为纵向拆分,核心理念是专库专用。例如下图展示了根据业务需要,将用户表和订单表垂直分片到不同数据库的方案。
垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对互联网业务需求快速变化的;而且,它也无法真正的解决单点瓶颈。垂直拆分可以缓解数据量和访问量带来的问题,但无法根治。因为如果垂直拆分之后,表中的数据量依然超过单节点所能承受的阈值,还是会导致查询性能下降。这种情况下就需要水平分片进一步处理。
2、水平分片
水平分片又称为横向拆分,相较于垂直分片,它不是把数据根据业务逻辑分类拆分,而是通过某个字段或某几个字段的某种规则,将数据分散至多个库或表中,每个分片仅包含所有数据的一部分。例如下图展示了根据主键分片,偶数主键的记录放入A库(或表),奇数主键的记录放入1库(或表):
三、常用分片策略
1、Range
根据时间段进行分片。
好处是自带水平扩展,不需要过多敢于;缺点是可能会出现数据不均匀的情况,比如某个月的数据量暴涨。
2、Hash
将数据存入表之前,通过Hash规则算出该数据需要存到哪一个数据库(或表)。
四、相关中间件
1、Sharding-Sphere
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。
2、Sharding-jdbc
Sharding-jdbc定位为轻量级Java框架,在Java的jdbc层提供的额外服务。它使用客户端直连数据库,以jar包的形式提供服务,无需额外部署和依赖,可理解为增强版的jdbc驱动,完全兼容jdbc、各种ORM框架和数据库连接池。
Sharding-JDBC中的分片策略
- 标准分片策略
对应StandardShardingStrategy,提供对SQL语句中的=,IN和BETWEEN AND的分片操作支持,StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。 - 复合分片策略
对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。 - 行表达式分片策略
对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。 - Hint分片策略
对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。 - 不分片策略
对应NoneShardingStrategy。不分片的策略。
Sharding-JDBC中的分片算法
通过分片算法将数据分片,目前提供了4中分片算法接口,由于分片算法和业务实现紧密相关,因此并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,开发者可以自行实现这些接口。
- 精确分片算法
对应PreciseShardingAlgorithm,用于处理使用单一键作为分片键的=和IN进行分片的场景,需配合StandardShardingStrategy使用。 - 范围分片算法
对应RangeShardingAlgorithm,用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景,需要配合StandardShardingStrategy使用。 - 复合分片算法
对应ComplexKeysShardingAlgorithm,用于处理使用多个键作为分片键进行分片的场景,包含多个分片键的逻辑较为复杂,需要应用开发者自行处理其中的复杂度,需要配合ComplexShardingStrategy使用。 - Hint分片算法
对应HintShardingAlgorithm,用于处理使用Hint进行分片的场景,需要配合HintShardingStrategy使用。