分库分表
分库分表是一种常用的数据库架构设计策略,主要用于解决单一数据库在处理海量数据和高并发请求时的性能瓶颈。通过将数据分散到多个数据库和数据表中,分库分表可以提高系统的吞吐量,扩展性和可靠性。
分库分表的方式
1.水平分库分表
水平分库:将同一张表的数据按照一定规则(如用户ID、订单ID等)拆分到多个数据库中。每个库中的表结构相同,但数据不同。
水平分表:将同一张表的数据按照一定规则拆分为多个子表。这些子表可以放在同一个数据库中,也可以分布在不同的数据库中。
示例
水平分库:假设有一张订单表orders,可以按照订单ID对10取模,将数据分别存储到orders_db_0到orders_db_9共10个数据库中。
水平分表:在orders_db_0库中,再根据订单ID对10取模,将数据存储到orders_0到orders_9共10个表中。
2.垂直分库分表
垂直分库:根据业务模块或功能,将不同的表放入不同的数据库中。例如,将用户信息表放在一个数据库,将订单表放在另一个数据库中。
垂直分表:将一张表的列拆分为多个表,每个表存储一部分列数据。通常用于列数较多且访问模式明确的场景。
示例
垂直分库:将用户信息表users放在user_db中,将订单表orders放在order_db中。
垂直分表:将users表拆分为users_basic(基本信息表)和users_detail(详细信息表),分别存储用户的基础信息和详细信息。
分库分表的优缺点
优点
1.性能提升
:通过分散数据,可以大幅减少单个数据库的负载,提升查询和写入性能。
2.扩展性
:分库分表使系统更容易横向扩展。随着业务增长,可以通过增加数据库实例或表来应对更大的数据量。
3.数据安全性
:分库可以减少单点故障的风险,提高数据的可用性和安全性。
缺点
1.数据一致性
:分库分表后,跨库事务和全局一致性变得复杂,需要引入分布式事务协调器或采用最终一致性方案。
2.开发复杂度
:分库分表后,查询和数据操作变得复杂,可能需要修改大量的应用代码来支持跨库、跨表查询。
3.维护成本
:数据分散在多个库和表中,备份、迁移和维护成本增加,尤其是在数据扩展和架构调整时。
分库分表的设计与实现
1.分片规则
常用的分片规则包括按哈希值、按范围、按取模、按时间等。
选择分片规则时,应考虑数据访问的热点和均衡性,避免数据倾斜。
2.分库分表中间件
常用的中间件如Apache ShardingSphere、MyCAT、TDDL(阿里巴巴的分布式数据库中间件),可以帮助实现分库分表的自动化处理,屏蔽底层的分片逻辑。
3.跨库、跨表查询
需要设计合适的分片键和查询策略,尽量避免跨库、跨表查询。如果不可避免,可能需要引入全局表或冗余字段来简化查询。
4.全局唯一ID
分库分表后,无法依赖数据库的自增ID,需要使用全局唯一ID生成策略,如雪花算法(Snowflake)、UUID、自定义ID生成器等。
5.数据迁移与扩展
在数据量增长到一定程度时,可能需要对分库分表策略进行调整,支持数据的平滑迁移和扩展,如增量分表、动态分库等。
Apache ShardingSphere
Apache ShardingSphere 是一个开源的分布式数据库中间件生态系统,它主要提供数据分片、分布式事务、数据库治理等功能,帮助开发者构建分布式数据库架构。ShardingSphere 支持多种数据库,并且灵活扩展,适用于各种场景下的数据分布与管理。
核心组件
Sharding-JDBC
1.这是一个轻量级的Java框架,它直接嵌入在应用程序中,通过在JDBC层上提供分片、读写分离和分布式事务的功能,使应用程序可以透明地处理分布式数据库的操作。
2.适用于对现有项目改动较小的场景,特别是在没有改动现有数据库架构的情况下,实现数据库分片。
Sharding-Proxy
1.这是一个独立的中间件代理服务器,它通过代理原生数据库协议,为客户端提供统一的数据库访问入口。
2.Sharding-Proxy可以将SQL语句自动分片、路由到对应的数据库实例,适用于不想改动现有应用程序代码的场景。
Sharding-Sidecar (Sharding-Sidecar/Tardis)
1.这是一个以微服务为核心设计的数据库中间件,主要面向云原生架构,支持Kubernetes等云环境部署。它与应用服务共存,提供数据库治理的功能,如分片、读写分离、分布式事务等。
ShardingSphere-Scaling
1.这是一个针对数据迁移和扩缩容的模块,支持在数据量大、表结构复杂的情况下,实现数据平滑迁移和分片规则的动态调整。
主要功能
数据分片
1.ShardingSphere 支持基于水平分片策略的数据切分,将大表拆分为多个物理表,以提高数据库的性能和扩展性。分片策略可以根据不同的业务场景进行自定义配置,如基于范围、哈希、取模等方式分片。
读写分离
1.ShardingSphere 可以将读操作路由到只读节点,将写操作路由到主节点,以提高读操作的并发能力并减少主节点的压力。
分布式事务
1.支持两阶段提交(2PC)、最大努力通知(TCC)等分布式事务协议,确保在分布式环境下的数据一致性。
数据加密与解密
1.提供透明的数据加密和解密功能,帮助用户实现数据库中的敏感数据保护。
弹性计算
1.支持动态扩缩容、数据平滑迁移,帮助用户灵活应对业务规模的变化。
SQL解析与重写
1.ShardingSphere 提供了丰富的SQL解析和重写能力,可以对用户的SQL语句进行优化和改写,从而提升执行效率。