系统上线头一年,数据库从来不是问题。等业务跑起来、数据量涨上来,问题就来了:报表查询从两秒变成两分钟,订单表过了千万行后写入开始变慢,大促高峰期数据库 CPU 直接拉满,全站跟着卡死。
数据库扛不住,升级硬件(加内存换 SSD)能撑一阵,但治标不治本。真正结构性的解法有三种:读写分离、垂直拆分、水平分片。这三种方案解决的是不同的瓶颈,而且通常要按顺序走,跳级容易翻车。
原理: 一主多从。所有写操作走主库,数据实时同步到多个从库,查询请求分摊到从库上。大多数系统的真实负载是"读多写少"——看一眼订单列表的请求远多于创建订单,把读请求分走,主库压力立刻下来。
优点:
缺点:
适用场景: 读多写少、读请求成为主要压力的系统。这是数据库扩容的第一站,成本最低,收益最直接。
原理: 按业务边界拆。原来一个库里几十张表,订单相关的一组表拆成订单库,库存相关的拆成库存库,用户相关的拆成用户库。每个库独立部署,各管各的业务,互不争抢资源。
优点:
缺点:
适用场景: 业务模块多、耦合低、各模块数据量都还在千万级以内的系统。通常配合微服务改造一起做。
原理: 单张表太大就拆成多张。一张 1 亿行的订单表,按用户 ID 取模拆成 16 张表分散到多个库,每张表只剩六百多万行。写入和查询时由中间件(如 ShardingSphere)根据分片键路由到对应的表。
优点:
缺点:
适用场景: 单表数据量过了两三千万还在快速增长的核心表(订单、流水、日志类),且读写分离和垂直拆分已经扛不住的时候。
当前瓶颈 | 推荐方案 |
|---|---|
读请求太多,主库被查询拖垮 | 读写分离 |
业务模块多,库越来越臃肿 | 垂直拆分 |
单表几千万行起步,写入查询都慢 | 水平分片 |
正确姿势是循序渐进:先读写分离,再垂直拆分,最后对真正的大表做水平分片。三个手段经常共存于同一个系统。
第一件:先优化再上架构。 很多"数据库扛不住"其实是慢 SQL、缺索引、大事务的问题。先做一轮 SQL 审计和索引优化,能解决掉一半的性能问题,成本几乎为零。
第二件:分片键的选择要想三年。 按什么拆决定了未来所有查询的形态。按用户拆,按时间查就难受;按时间拆,热点全在最新分片上。选之前把未来三年的查询场景列一遍。
第三件:数据迁移方案先行。 分库分表最难的不是拆,是存量数据怎么搬。双写过渡、停机迁移、增量同步,方案要在拆分开始前就演练过。
数据库扩容没有一步到位的好事。读写分离、垂直拆分、水平分片是一个阶梯,每一级都显著增加系统复杂度。能在低一级解决的问题,别急着上高一级——架构的复杂度本身就是一种成本。
上海魁鲸科技在企业系统架构设计与性能优化方面经验丰富,能够评估企业数据库的真实瓶颈,给出匹配业务规模的扩容方案,并稳妥完成数据迁移与架构演进。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。