文章目录
- 1、什么是分库分表?
- 1.1、分库分表的概念
- 1.2、分库分表的方式
- 1.2.1、垂直分库
- 1.2.2、垂直分表
- 1.2.3、水平分库
- 1.2.4、水平分表
- 2、为什么要分库分表?
- 3、什么时候需要分库分表?
- 4、分库分表的数据路由
- 4.1、数据路由的目的
- 4.2、数据路由的方式
- 5、分库分表的分布式事务
- 5.1. 分布式事务的问题
- 5.2. 分布式事务的解决方案
- 6、实战案例
- 6.1. 业务背景
- 6.2. 分库分表方案设计
- 6.3. 技术选型
- 6.4. 实施步骤
- 6.5. 效果评估
- 7、总结
1、什么是分库分表?
1.1、分库分表的概念
分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,所以组
成的拆分策略最终如下:
-
分库:将一个数据库拆分成多个独立的数据库,每个数据库可以部署在不同的服务器上,从而分散数据存储和访问压力。
-
分表:将一个数据表拆分成多个小表,每个小表可以存储部分数据,从而减少单个表的数据量,提高查询和写入性能。
1.2、分库分表的方式
1.2.1、垂直分库
垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
特点:
- 每个库的表结构都不一样。
- 每个库的数据也不一样。
- 所有库的并集是全量数据。
原理:
- 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。
优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。
1.2.2、垂直分表
将一个表按照字段的业务相关性拆分成多个小表,每个小表存储部分字段的数据。
特点:
- 每个表的结构都不一样。
- 每个表的数据也不一样,一般通过一列(主键/外键)关联。
- 所有表的并集是全量数据。
原理:
- 一个表中的字段可能具有不同的访问频率和性能需求,通过垂直分表可以将不常访问的字段分离出来,减少单个表的数据量和索引大小,提高查询性能。例如,将用户表中的基本信息字段和详细信息字段分别存储在两个不同的表中。
优点:可以提高查询性能,减少数据冗余。
缺点:表的关联查询变得复杂,需要使用多表连接或者多次查询。
1.2.3、水平分库
将一个数据库中的数据按照一定的规则分散存储到多个不同的数据库中。
特点:
- 每个库的表结构都一样。
- 每个库的数据都不一样。
- 所有库的并集是全量数据。
原理:根据数据的某个特征(如用户 ID、订单 ID 等)进行哈希运算或者取模运算,将数据均匀地分布到多个数据库中。例如,根据用户 ID 进行取模运算,将用户数据分散存储到 10 个数据库中。
优点:可以提高数据库的可扩展性和性能,当数据量增加时,可以方便地添加新的数据库。
缺点:跨库查询和事务处理比较复杂,需要使用分布式查询和事务解决方案。
1.2.4、水平分表
以字段为依据,将一个表中的数据按照一定的规则分散存储到多个相同结构的表中。
特点:
- 每个表的表结构都一样。
- 每个表的数据都不一样。
- 所有表的并集是全量数据。
原理:与水平分库类似,根据数据的某个特征进行哈希运算或者取模运算,将数据均匀地分布到多个表中。例如,根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。
优点:可以提高表的查询和写入性能,当表的数据量增加时,可以方便地添加新的表。
缺点:表的管理变得复杂,需要使用中间件或者代码来实现数据的路由和合并。
2、为什么要分库分表?
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存
储,存在以下性能瓶颈:
- IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。 请求数据太多,带宽
不够,网络IO瓶颈。 - CPU瓶颈:排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源,请求数太多,CPU出
现瓶颈。
为了解决上述问题,我们需要对数据库进行分库分表处理。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能
问题,从而达到提升数据库性能的目的。
在业务系统中,为了缓解磁盘IO及CPU的性能瓶颈,到底是垂直拆分,还是水平拆分;具体是分 库,还是分表,都需要根据具体的业务需求具体分析。
3、什么时候需要分库分表?
网上查了好多资料,一个项目到底什么时候需要分库分表?
这个问题应该是没有标准的答案,但是可以从用户的角度回答这个问题,凡是通过数据库操作影响用户体验,甚至体验感很差时,都需要考虑优化数据库,进行分库分表。
行内不成文的标准:
- 单表记录行数超过500w条
- 单表存储空间超过2GB
- .
如果你的项目中的数据库出现上述情况,就要考虑分库分表了。
4、分库分表的数据路由
4.1、数据路由的目的
确定数据在分库分表后的存储位置,使得应用程序能够正确地访问和操作数据。
4.2、数据路由的方式
数据路由方式 | 具体内容 |
---|---|
哈希路由 | 根据数据的某个特征进行哈希运算,将数据映射到不同的数据库或表中。例如,根据用户 ID 进行哈希运算,将用户数据存储到不同的数据库中。 |
范围路由 | 根据数据的某个特征的取值范围,将数据分配到不同的数据库或表中。例如,根据订单金额的范围,将订单数据存储到不同的表中。 |
列表路由 | 根据数据的某个特征的值是否在一个预定义的列表中,将数据分配到不同的数据库或表中。例如,根据用户所在地区,将用户数据存储到不同的数据库中。 |
5、分库分表的分布式事务
5.1. 分布式事务的问题
在分库分表的环境下,一个事务可能涉及多个数据库或表,传统的单机事务无法满足需求,需要使用分布式事务解决方案。
5.2. 分布式事务的解决方案
阶段 | 具体内容 |
---|---|
两阶段提交(2PC) | 分为准备阶段和提交阶段,协调者向参与者发送准备请求,参与者执行事务操作并记录日志,如果所有参与者都返回准备成功,则协调者发送提交请求,参与者提交事务;否则协调者发送回滚请求,参与者回滚事务。 |
三阶段提交(3PC) | 在 2PC 的基础上增加了一个预提交阶段,减少了参与者在准备阶段的阻塞时间,提高了事务的可用性。 |
补偿事务(TCC) | 分为 Try、Confirm、Cancel 三个阶段,Try 阶段进行业务检查和资源预留,Confirm 阶段进行业务确认操作,Cancel 阶段进行业务回滚操作。TCC 需要业务系统自己实现事务的补偿逻辑,比较复杂但性能较好。 |
6、实战案例
以一个电商系统为例,介绍数据库分库分表的实战过程。
6.1. 业务背景
电商系统中有用户、商品、订单等模块,随着业务的发展,数据量不断增长,数据库性能出现瓶颈。
6.2. 分库分表方案设计
- 垂直分库
将用户模块、商品模块、订单模块分别存储在不同的数据库中。
用户数据库存储用户信息,包括用户 ID、用户名、密码、联系方式等。
商品数据库存储商品信息,包括商品 ID、商品名称、价格、库存等。
订单数据库存储订单信息,包括订单 ID、用户 ID、商品 ID、订单金额、订单状态等。
- 垂直分表
在用户表中,将用户的基本信息和详细信息分别存储在两个表中。
用户基本信息表存储用户 ID、用户名、密码、联系方式等。
用户详细信息表存储用户 ID、用户头像、用户简介、用户等级等。
- 水平分库
根据用户 ID 进行取模运算,将用户数据分散存储到多个数据库中。
假设共有 10 个数据库,用户 ID 为 100 的用户数据存储在数据库 0 中,用户 ID 为 101 的用户数据存储在数据库 1 中,以此类推。
- 水平分表
根据订单创建时间进行分表,将每天的订单数据存储在一个单独的表中。
例如,订单表名为 order_20240917,表示 2024 年 9 月 17 日的订单数据。
6.3. 技术选型
-
数据库中间件
选择一个成熟的数据库中间件来实现分库分表的功能,如MyCat、ShardingSphere等。 -
数据库
选择一个性能高、稳定性好的数据库,如 MySQL、PostgreSQL 等。
6.4. 实施步骤
-
安装和配置数据库中间件
根据中间件的文档进行安装和配置,设置分库分表的规则和参数。 -
改造应用程序
修改应用程序的数据库连接配置,使其连接到数据库中间件。同时,修改应用程序的 SQL 语句,使其适应分库分表的环境。例如,在查询用户信息时,需要根据用户 ID 确定查询的数据库和表。 -
数据迁移
将现有数据库中的数据迁移到分库分表后的数据库中。可以使用数据库中间件提供的数据迁移工具,或者编写自己的数据迁移脚本。 -
测试和优化
在实施分库分表后,进行充分的测试,包括功能测试、性能测试、压力测试等。根据测试结果进行优化,调整分库分表的规则和参数,提高系统的性能和稳定性。
6.5. 效果评估
-
性能提升
通过分库分表,数据库的查询和写入性能得到了显著提升。查询响应时间缩短,写入延迟减少,系统能够更好地应对高并发访问。 -
可扩展性增强
当数据量增加时,可以方便地添加新的数据库或表,提高了系统的可扩展性。 -
可用性提高
分库分表后,即使某个数据库或表出现故障,也不会影响整个系统的运行,提高了系统的可用性。
7、总结
数据库分库分表是一种解决大规模数据和高并发访问的有效技术方案。通过垂直分库、垂直分表、水平分库、水平分表等方式,可以将数据分散存储到多个数据库或表中,提高数据库的性能、可扩展性和可用性。在实施分库分表时,需要根据业务需求和数据特点进行合理的方案设计,选择合适的技术选型,并进行充分的测试和优化。
人生从来没有真正的绝境。只要一个人的心中还怀着一粒信念的种子,那么总有一天,他就能走出困境,让生命重新开花结果。