高并发是大型架构核心,下面我详解百万并发数据库设计@mikechen
高并发场景
在高并发系统中,数据库往往是整个架构的性能瓶颈。
当系统的 QPS 达到十万级甚至百万级 时,单库单表的性能、存储、锁竞争都会成为瓶颈。
数据库瓶颈,主要体现在单机的CPU、内存、磁盘IO和网络带宽受限。
以及,并发连接数与锁竞争导致的吞吐下降,在并发增长时容易出现慢查询、连接池耗尽。。。等等。
此时,“分库分表”就成为突破数据库性能极限的关键技术手段。
垂直拆分
垂直分库,是将不同业务、或功能模块的数据,分离到不同的数据库实例上。
通过按业务边界拆分,可以降低单个库的负载、减少表的复杂度,并使不同团队独立扩展与维护。
例如,一个电商系统可以拆为:
模块 | 数据库示例 |
---|---|
用户模块 | user_db |
商品模块 | product_db |
订单模块 | order_db |
支付模块 | payment_db |
每个数据库独立运行、独立维护,减轻单库压力。
实施步骤:
业务分析:识别清晰的业务域(如用户账户、订单、商品、日志等)。
评估各域的数据规模与访问特性(读写比例、事务边界)。
设计边界:确定需要拆出的表或模块,保持模块之间的最小耦合,尽量避免跨库事务。
数据迁移:制定迁移计划(线上分流或离线迁移),确保数据一致性与回滚方案。
通常采用双写或同步中继的方式逐步切换。
接入改造:调整应用访问层的配置与路由逻辑,可能需要引入中间件或服务调用来访问不同库。
水平分表
当垂直分库完成后,某个业务域(例如订单 Order DB)的单表数据量或并发压力依然巨大时。
就需要进行水平分表,水平分表的核心思想是,将同一个表结构的数据,根据一定的规则(分片键),分散存储在多个独立的表或数据库实例中。
例如,一个包含 10 亿条记录的 order
表,可以水平拆分成 100 个表(order_00
到 order_99
)。
实施步骤:
1.确定分片键(Sharding Key)
一般选取访问频率高且能平均分布的字段(如 user_id、order_id)。
避免使用时间字段(会导致热点表)。
2.设计分片算法
取模法:table_index = user_id % 4
范围法:根据 ID 区间或时间区间分表。
一致性哈希法:便于动态扩容。
3.配置数据路由层
通过分片中间件或框架自动路由 SQL 到对应表。
4.读写分离与缓存优化
配合主从复制、读写分离中间件进一步提升性能。
拆分后面临遗留问题
拆分数据库后可显著提升扩展性与并发处理能力,但也会带来若干遗留问题:
事务复杂度增加:跨库事务难以保证强一致性,需采用柔性事务或最终一致性策略。
分布式ID生成:不能简单依赖自增ID,常用雪花算法等方案保证ID全局唯一。
查询复杂:多表跨库查询效率低,尽量避免联表操作,设计合理的业务数据模型。
维护成本:拆分后数据迁移、备份恢复复杂,中间件和路由层需稳定。