高并发下,如何设计亿级分库分表?

高并发是大型架构的核心,下面我重点详解高并发数据拆分@mikechen

什么是分库分表

随着业务规模扩大、数据量暴增,单库单表容易出现以下问题:

  • 性能瓶颈:单表记录数过亿后,查询、索引维护性能急剧下降;

  • 存储瓶颈:单机磁盘和 IOPS 限制无法支撑高并发访问;

  • 可用性瓶颈:单节点故障会导致整个数据库不可用。

高并发下,如何设计亿级分库分表?-mikechen

分库分表(Database Sharding) ,就是通过拆分数据库、或表结构。

将数据分散到多台数据库上,来实现性能提升与扩展性增强的技术方案。

分库分表一般分为两个阶段:

  1. 垂直拆分(按业务模块分库) —— 先解决“系统复杂度与模块隔离”问题;

  2. 水平拆分(按数据量分片) —— 再解决“单表数据量过大与并发性能”问题。

 

垂直拆分

垂直拆分,是微服务与分布式架构的第一步。

在系统早期,业务都集中在一个数据库里。

如:user, order, product, payment 全在同一个 mall_db 中。

这样的问题是:

  • 表太多,耦合严重;

  • 不同业务模块间频繁关联;

  • 单库连接数压力大。

高并发下,如何设计亿级分库分表?-mikechen

按“业务维度”拆分,将不同业务的数据放入不同数据库,模块独立、数据隔离、性能更高。

比如:

为每个核心模块建立独立数据库:

  • user_db:用户相关表;

  • product_db:商品相关表;

  • order_db:订单相关表;

  • pay_db:支付相关表;

这样每个库承担对应业务压力,同时方便独立扩展和维护。

 

水平拆分

水平拆分,是对单一表的数据按照某种规则(如ID取模、范围分片)拆分到多个表或数据库中。

主要解决,单表数据增大导致的查询效率低和写入压力大问题。

由于业务需要先确定模块边界,垂直拆分通常先行。

随后针对具体瓶颈表进行细化的水平拆分,因此水平拆分往往是次要一步。

高并发下,如何设计亿级分库分表?-mikechen

拆分步骤

  1. 选择拆分表和分片键:选择访问量大、数据量大的表,确定分片字段(如用户ID、订单ID)。

  2. 设计拆分规则:按Hash、范围等算法把数据划分到多个分片。

  3. 创建分表和(或)分库:根据规则建物理表和分库。

  4. 修改应用逻辑:调整代码路由到对应分片表进行读写。

  5. 数据迁移和同步:将原表数据迁移到对应分片表。

  6. 测试和监控:确保拆分后系统稳定、性能提升。

以订单表为例,假设订单ID从1到100000,将订单表按订单ID对10取模拆成10个分表。

orders_0 到 orders_9,每个表存储部分订单数据。

或者把这10个表均匀分布在多个数据库中,减少单库压力,实现高并发处理。

评论交流
    说说你的看法