1. 什么是分库分表?
分库分表是一种数据库扩展技术,通过将数据拆分到多个数据库(分库)或多个表(分表)中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力,避免单一数据库或表的负载过重。
1.1 什么是分库?
分库 指的是将数据分散到多个数据库实例中,以减轻单一数据库的负载。分库可以有两种方式:垂直分库 和水平分库。
-
垂直分库:
- 垂直分库是指根据业务模块的不同,将不同模块的数据存储到不同的数据库中。例如,将用户数据存储在
user_db
中,将订单数据存储在order_db
中,将商品数据存储在product_db
中。每个数据库只负责一部分业务数据。 - 适用场景: 适用于系统中各个模块的数据量差异很大,或者需要对不同模块进行独立管理的场景。
- 垂直分库是指根据业务模块的不同,将不同模块的数据存储到不同的数据库中。例如,将用户数据存储在
-
水平分库:
- 水平分库是指将同一业务的不同数据根据某些规则(如时间、地域等)拆分到多个数据库中。例如,按照地区划分,将美国的用户数据存储在
db_us
中,将欧洲的用户数据存储在db_eu
中,或者按照时间将数据按年、月划分到不同的数据库中。 - 适用场景: 适用于数据量巨大,且需要根据某些标准进行数据拆分的场景。
- 水平分库是指将同一业务的不同数据根据某些规则(如时间、地域等)拆分到多个数据库中。例如,按照地区划分,将美国的用户数据存储在
1.2 什么是分表?
分表 是指将同一张表中的数据拆分到多个表中,以避免单个表过大而导致性能问题。分表也有两种方式:垂直分表 和水平分表。
-
垂直分表:
- 垂直分表是指将一张表中的不同列分拆到多个表中。通常是将表中的列根据功能或访问频率进行划分。例如,将一个包含用户详细信息的表,按照访问频率将常用字段(如用户名、密码等)拆分成
user_basic
表,而将不常用的字段(如用户画像、日志等)拆分成user_extra
表。 - 适用场景: 适用于表中包含大量列,但并非所有列都会频繁访问的场景。
- 垂直分表是指将一张表中的不同列分拆到多个表中。通常是将表中的列根据功能或访问频率进行划分。例如,将一个包含用户详细信息的表,按照访问频率将常用字段(如用户名、密码等)拆分成
-
水平分表:
- 水平分表是指将表中的数据按照某些规则(如ID范围、时间等)拆分到多个表中。例如,用户表的数据根据用户ID范围分拆成多个表,如
user_1
,user_2
,user_3
等,或者按时间拆分成user_2023
,user_2024
等。 - 适用场景: 适用于数据量过大,导致单表查询性能低下的情况。
- 水平分表是指将表中的数据按照某些规则(如ID范围、时间等)拆分到多个表中。例如,用户表的数据根据用户ID范围分拆成多个表,如
2. 分库分表场景
2.1 什么场景分表?
分表适用于以下场景:
- 单表数据量过大: 当某个表的记录数达到千万级,查询时可能会非常缓慢,尤其是涉及全表扫描的操作,分表可以有效提高查询效率。
- 高并发读写: 单表无法承载高并发的查询和写入请求时,可以通过水平分表将压力分散到多个表上。
- 单表的数据结构复杂,且访问频繁的列较少: 在这种情况下,垂直分表可以将高频访问的列提取到单独的表中,提高性能。
2.2 什么场景分库?
分库适用于以下场景:
- 数据库连接数不足: 单个数据库的连接数上限(如 MySQL 默认为 4000 个连接)无法满足高并发的请求时,可以通过分库将连接请求分散到多个数据库实例上。
- 数据库资源瓶颈: 当单个数据库的 CPU、内存、磁盘等资源无法满足需求时,分库可以将数据分布到多个数据库实例上,从而避免单点故障和资源瓶颈。
- 高并发读写: 当需要处理大量并发请求时,单个数据库无法支撑,需要通过分库将请求分散到多个数据库节点上。
2.3 什么场景分库分表?
分库分表适用于以下场景:
- 数据量巨大且访问量大: 当数据量达到数千万甚至更大,且访问量高时,单库单表无法满足存储、查询和写入需求。此时,分库分表能有效地提高查询性能和扩展系统能力。
- 高并发写入和查询: 在高并发的业务场景中,单库单表的性能瓶颈可能导致系统无法处理所有请求。分库分表能够将数据分布在不同的物理节点上,提高系统的并发处理能力。
- 资源瓶颈和高可用性需求: 当数据库实例的资源有限,且为了保证高可用性,必须将数据分散到多个数据库和表中,避免单点故障和资源耗尽。
3. 什么是 ShardingSphere?
ShardingSphere 是一个开源的分布式数据库中间件,提供数据库分片、分库分表、数据路由、分布式事务、数据脱敏等功能。它可以在不修改应用代码的情况下,为应用提供透明的分库分表支持,简化了分布式数据库的管理和维护。
ShardingSphere 的主要特点包括:
- 数据分片: 支持灵活的分库分表策略,可以根据用户需求定制分片规则。
- 分布式事务: 提供跨库跨表的分布式事务管理,确保数据一致性。
- 读写分离: 提供读写分离功能,将读请求路由到从库,提高系统性能。
- 弹性扩展: 支持动态添加新的数据源,帮助系统应对数据增长带来的压力。
4. 数据分片核心概念
4.1 表
- 逻辑表: 应用层面上的虚拟表,实际数据存储在多个物理表中。
- 真实表: 存储在数据库中的实际表,数据按分片规则分布在不同的物理表中。
- 绑定表: 多个表之间具有外键关系或逻辑关联,需要绑定在一起进行分片操作。
- 广播表: 一些小型表(如配置表、字典表等)将数据广播到所有数据库节点中,不进行分片。
- 单表: 不需要分片的表,数据存储在单个表中。
4.2 数据节点
- 均匀分布: 数据均匀地分布到多个数据节点中。
- 自定义分布: 开发者可以定义特定的分布规则,决定数据如何在不同的数据节点上分布。
4.3 分片
- 分片键: 决定数据如何分配到不同分片的字段,通常选择具有唯一性、分布均匀的数据字段作为分片键。
- 分片算法: 根据分片键和预定义的算法将数据分配到不同的分片上,常见的算法有哈希分片、范围分片等。
- 自动化分片算法: 系统自动根据配置的分片规则选择合适的分片算法。
- 自定义分片算法: 开发者可以定义自己的分片算法,以满足特定的业务需求。
- 分片策略: 定义了数据如何进行分片,包括按ID、时间、范围等不同策略进行数据划分。
- 强制分片路由: 强制要求某些操作使用特定的分片策略进行路由,通常用于特定业务需求。
4.4 行表达式
行表达式是指描述分片规则的表达式,帮助系统决定某一行数据应该放入哪个分片。
4.5 分布式主键
分布式主键确保在多个数据库和表中生成全局唯一的主键,避免出现主键冲突,通常通过全局唯一ID生成策略来实现。