0.简介
随着互联网应用的不断发展,数据量和访问量都大幅的增加,传统的增加硬件资源的方式暴露出成本高,拓展能力受限的问题,分库分表可以将数据分散到多个节点,通过负载均衡和故障转移,提高并发处理能力和可用性,本文将介绍分库分表的概念及常见的拆分策略和方式。
1.分库分表说明
分库分表是数据库设计和管理中的一种策略,旨在解决由于数据量过大而导致的性能问题,其本质是将原本数据量大的库和表按照一定的规则拆分成多个单独的库和表的过程,其手段就是“分库”和“分表。
1)垂直分库:按照业务类型对表进行分类,将业务相关的一类表放在一个库中。这种方式很大程度上取决于业务的划分,专库专用,能在一定程度上提升数据库性能,但并未从根本上解决单表数据量过大的问题。
2)水平分库:把同一个表按照规则拆分到不同的数据库中,每个库可以位于不同的服务器上,以此实现水平扩展。
3)垂直分表:基于数据表的列(字段)进行切分,将字段较多或访问不频繁的字段拆分出来,创建一个单独的扩展表。这样可以减小核心表的大小,提高查询命中率,减少磁盘IO,从而提升数据库性能。
4)水平分表:在同一个数据库内,将一张大数据量的表按一定规则切分成多个结构完全相同的表,每个表只存储原表的一部分数据。这样可以减小单个表的数据量,提高查询速度。
2.分片策略和分片算法
分片有很多现成的工具和方式,本节将介绍ShardingSphere中五种分片策略和十二种分片算法。
2.1 分片策略
1)标准分片策略(Standard Sharding Strategy)
- 适用场景:适用于具有单一分片键的标准分片场景。
- 支持的操作符:支持精确分片(如SQL中的=、IN操作符)和范围分片(如BETWEEN AND、>、<、>=、<=等范围操作符)。
2)复合分片策略(Complex Sharing Strategy)
- 适用场景:适用于多个分片键的复杂分片场景。
- 支持的操作符:同样支持>、>=、<=、<、=、IN和BETWEEN AND等操作符。
3)行表达式分片策略(Inline Sharding Strategy)
- 适用场景:适用于具有单一分片键的简单分片场景。
- 支持的操作符:主要支持SQL语句中的=和IN操作符。
4)Hint分片策略(Hint Sharding Strategy)
- 适用场景:分片字段不存在于SQL和数据库表结构中,而是存在于外部业务逻辑中的场景。
- 特点:1.无需配置分片键。2.由外部指定分库和分表的信息,强制SQL在指定的分库、分表中执行。
Hint分片策略允许在SQL语句中使用Hint的方式指定分片键的值,ShardingSphere会根据这个值将查询请求路由到对应的数据库实例上。
5)不分片策略(None Sharding Strategy)
- 适用场景:当不需要对数据进行分片时。
- 特点:1.对逻辑表的所有操作将会执行全库表路由。2.相当于不进行任何分片处理。
不分片策略是一种特殊情况下的选择,当业务场景不需要数据分片时,可以使用该策略。
2.2 分片算法
1)取模分片算法(MOD)
- 原理:根据分片键的值对数据库或表的数量取模来分片。
- 优点:简单方便,算法容易理解,可以方便地算出数据落到哪个库或表。
- 缺点:分片键的值的类型受限,必须是纯数字或能转换为纯数字的字符串。
2)哈希取模分片算法(HASH_MOD)
- 原理:先计算分片键的哈希值(hashCode的绝对值),然后再根据分片数量来取模。
- 优点:分片键的值的类型不受限,支持分片值非纯数字类型。
- 缺点:不方便快速算出数据落到哪个库或表,可能会造成数据倾斜。
3)基于分片容量的范围分片算法(VOLUME_RANGE)
- 原理:根据设置的分片容量将实数区间分为几个部分,根据分片值在具体哪个区间来确定数据落在具体哪个库表。
- 优点:算法简单,容易理解。
- 缺点:分片键的值的类型受限,必须是纯数字,且分区数最好和库数或表数相同。
4)基于分片边界的范围分片算法(BOUNDARY_RANGE)
- 原理:根据设置的分片的范围边界将实数区间分为几个部分,根据分片值在具体哪个区间来确定数据落在具体哪个库表。
- 优点:比VOLUME_RANGE更灵活,容量长度可变。
- 缺点:分片键的值的类型受限,必须是纯数字。
5)自动时间段分片算法(AUTO_INTERVAL)
- 原理:根据设置的时间段的起始范围、结束范围及单一分片所能承载的最大时间,将整个时间区间分为几个部分,根据分片值在具体哪个时间区间来确定数据落在具体哪个库表。
- 优点:适用于按时间字段进行分片。
- 缺点:配置相对复杂。
6)行表达式分片算法(INLINE)
- 原理:支持在配置属性中书写Groovy表达式,用来定义对分片键的运算逻辑,无需单独定义分片算法。
- 优点:配置简洁,支持SQL语句中的=和IN操作符。
- 缺点:对于复杂的分片逻辑可能不够灵活。
7)时间范围分片算法
- 类似于AUTO_INTERVAL,但可能具有更多的自定义配置选项,如日期格式、分片后缀格式等。
8)复合行表达式分片算法
- 原理:适用于多个分片键的复杂分片场景,支持SQL语句中的多种操作符。
- 优点:可以处理多个分片键的复杂分片需求。
- 缺点:配置相对复杂。
9)Hint行表达式分片算法
- 原理:无需配置分片键,由外部指定分库和分表的信息,可以让SQL在指定的分库、分表中执行。
- 优点:灵活性强,适用于需要动态指定分片的情况。
- 缺点:需要外部逻辑来指定分片信息。
10)COSID_MOD
- 基于CosId的取模分片算法。该算法通过对CosId生成的分布式ID进行取模运算,以确定数据应该存放在哪个具体的数据节点上。这种算法能够确保数据的均匀分布,避免某些节点负载过重或数据倾斜的情况。
11)COSID_INTERVAL
- 基于CosId的固定时间范围的分片算法。该算法根据时间范围对数据进行分片,适用于需要按时间维度进行数据分片的场景。用户需要指定时间分片的下界值、上界值以及分片键时间间隔单位等参数。
12)COSID_INTERVAL_SNOWFLAKE
- 与COSID_INTERVAL类似,但底层用于散列的COSID的生成方式是基于雪花算法(Snowflake)。雪花算法结合了时间戳、节点标识符和序列号等信息,有助于数据分布更均匀。
3.拆分步骤
1)首先分析数据,这一步的目的是确定分库分表的必要性,比如:分析当前数据库的性能瓶颈和未来趋势,确定是否需要进行分库分表。
2)根据数据类型选择拆分方式,也就是适用的分片策略和算法。
3)根据选定的策略选择合适的工具,比如ShardingSphere。
4)开始实行拆分,进行验证以保证达到拆分目的。