高并发是大型架构的核心,下面我重点详解高并发数据拆分@mikechen
什么是分库分表
随着业务规模扩大、数据量暴增,单库单表容易出现以下问题:
-
性能瓶颈:单表记录数过亿后,查询、索引维护性能急剧下降;
-
存储瓶颈:单机磁盘和 IOPS 限制无法支撑高并发访问;
-
可用性瓶颈:单节点故障会导致整个数据库不可用。
分库分表(Database Sharding) ,就是通过拆分数据库、或表结构。
将数据分散到多台数据库上,来实现性能提升与扩展性增强的技术方案。
分库分表一般分为两个阶段:
-
垂直拆分(按业务模块分库) —— 先解决“系统复杂度与模块隔离”问题;
-
水平拆分(按数据量分片) —— 再解决“单表数据量过大与并发性能”问题。
垂直拆分
垂直拆分,是微服务与分布式架构的第一步。
在系统早期,业务都集中在一个数据库里。
如:user
, order
, product
, payment
全在同一个 mall_db
中。
这样的问题是:
-
表太多,耦合严重;
-
不同业务模块间频繁关联;
-
单库连接数压力大。
按“业务维度”拆分,将不同业务的数据放入不同数据库,模块独立、数据隔离、性能更高。
比如:
为每个核心模块建立独立数据库:
-
user_db:用户相关表;
-
product_db:商品相关表;
-
order_db:订单相关表;
-
pay_db:支付相关表;
这样每个库承担对应业务压力,同时方便独立扩展和维护。
水平拆分
水平拆分,是对单一表的数据按照某种规则(如ID取模、范围分片)拆分到多个表或数据库中。
主要解决,单表数据增大导致的查询效率低和写入压力大问题。
由于业务需要先确定模块边界,垂直拆分通常先行。
随后针对具体瓶颈表进行细化的水平拆分,因此水平拆分往往是次要一步。
拆分步骤
-
选择拆分表和分片键:选择访问量大、数据量大的表,确定分片字段(如用户ID、订单ID)。
-
设计拆分规则:按Hash、范围等算法把数据划分到多个分片。
-
创建分表和(或)分库:根据规则建物理表和分库。
-
修改应用逻辑:调整代码路由到对应分片表进行读写。
-
数据迁移和同步:将原表数据迁移到对应分片表。
-
测试和监控:确保拆分后系统稳定、性能提升。
以订单表为例,假设订单ID从1到100000,将订单表按订单ID对10取模拆成10个分表。
orders_0 到 orders_9,每个表存储部分订单数据。
或者把这10个表均匀分布在多个数据库中,减少单库压力,实现高并发处理。