数据库扩容的纵向与横向路径必须提前规划,否则CPU飙到90%再临时加机器,要么锁表要么主从延迟,业务直接受影响。
为什么扩容路径不能等资源告警再决定
很多团队把数据库扩容当成救火动作,CPU打满、连接数爆掉、慢查询堆积,才想起要升配或加机器,这时候操作窗口被压缩到小时级别,没有时间验证数据一致性,也没有时间调整连接池,临时升配需要重启实例,临时加从库需要同步数据,业务高峰期的每一分钟中断都在放大损失。
- 临时升配可能触发主备切换,造成秒级闪断。
- 临时加只读节点,需要等数据同步追平,延迟可能超过预期。
- 应用侧连接串、连接池、读写分离配置没提前调,新节点接不住流量。
- 纵向升配和横向加节点是两条完全不同的路径,选错会带来新的瓶颈。
数据库扩容不是一次性的资源购买,而是容量规划的一部分,业内专家指出,多数生产事故发生在临时扩容后的第一个业务高峰,因为演练不足和参数未优化。
数据库扩容纵向和横向哪个好?关键看这三类阻塞点
纵向扩容就是把单机变强:升CPU、加内存、换更高IOPS的磁盘,横向扩容就是加节点:加从库、分片、分库分表,两者没有绝对优劣,要看阻塞点在哪。
先分清读写比例和锁等待
读写比例是判断的第一层,读多写少的场景,横向加只读节点非常划算,写多读少或者写入热点集中,纵向升配更直接,但升到顶以后还是要横向分片。
锁等待是第二层,单表大量更新事务互相等待,加从库不会减少主库锁竞争,这时候要先看InnoDB锁等待和死锁日志。
使用命令查看当前锁等待:
SHOW ENGINE INNODB STATUSG
查看连接数和运行线程:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Threads_running';
如果Threads_running长期接近Threads_connected的上限,说明并发执行能力不足,纵向升CPU核心数可能更有效。
看Buffer Pool命中率
第三层是内存命中率,Buffer Pool不够,磁盘IO就会拖慢一切,查看命中率:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests'; SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
命中率低于行业共识认为的健康线时,先加内存比盲目加机器管用,内存升配属于纵向扩容,操作相对简单,多数云厂商支持在线调整。
判断表的数据分布
单表超过几千万行,再强的单机也扛不住全表扫描,这时候纵向扩容收益递减,横向分片或者分区表才是正路,但横向分片会引入分布式事务、跨分片聚合查询等新问题,需要提前设计分片键。
结论很清楚:数据库扩容纵向和横向哪个好,取决于读写比例、锁竞争、Buffer Pool命中率、表数据分布这四类信号,先做诊断,再选路径。
生产环境数据库扩容注意事项:提前规划的四步法
生产环境不能拿业务当实验田,提前规划要落在具体步骤上。
第一步:建立容量基线
容量基线是扩容的参照系,监控最近30天的峰值资源使用情况,重点记录:
- CPU使用率峰值
- 内存使用率峰值
- 磁盘IOPS和吞吐峰值
- 慢查询数量变化
- 主从延迟时间
- 连接数峰值
使用命令行快速查看磁盘IO:
iostat -x 1 5
观察await和%util两个指标,await持续偏高说明磁盘响应慢,%util接近饱和说明IO能力不足。
第二步:设定扩容阈值
阈值必须留出缓冲窗口,不要等到95%再动手,参考阈值可以设定为:
- CPU使用率持续超过70%,持续30分钟
- 内存使用率超过80%
- 连接数达到最大连接数的80%
- 主从延迟连续5分钟超过5秒
- 慢查询数量一周内增长明显
这些阈值触达后,启动扩容评估流程,等待时间越长,风险越大。
第三步:选型并在测试环境回放
在测试环境用生产快照回放慢查询日志,使用pt-query-digest分析慢查询,识别全表扫描和锁等待,模拟扩容后的QPS变化。
回放命令示例:
pt-query-digest /var/log/mysql/slow.log
使用sysbench做压力测试,对比扩容前后的吞吐量,测试主从切换耗时,记录应用连接池重新分配的时间。
第四步:制定回退方案
没有退路的扩容就是赌博,回退方案要明确:
- 新节点先以只读身份接入,验证数据一致性。
- 切换流量前保留老节点快照。
- 准备一键回退脚本,包含连接串切换和权重调整。
- 保留升配前的实例规格快照,便于降配。
生产环境数据库扩容注意事项里,最容易忽略的是应用连接池的调整,新节点加入后,连接串如果不更新或连接池不感知拓扑变化,流量还压在老节点上,半同步复制的超时参数也需要重新评估。
云数据库扩容费用一般多少?把隐藏成本列出来
云数据库扩容费用一般多少,这个问题不能光看标价,不同厂商、不同地域、不同计费方式,差价很大。
显性成本
纵向升配按新规格和旧规格的差价计费,包月实例升配后,剩余时长按新规格单价折算,按量付费实例升配后,下一小时按新规格计费,横向加只读节点,按节点规格、存储空间、网络流量分别计费。
隐藏成本
- 备份空间:扩容后数据量增加,备份超出免费额度的部分按GB计费。
- 跨可用区流量:主从跨可用区部署,同步流量会产生额外网络费用。
- 规格锁定:部分云厂商升配后不能降配,或者降配需要换实例。
- 连接数扩容:新节点需要增加应用服务器连接池上限,这部分软件成本容易被忽略。
- 演练成本:每次全量演练需要拉取生产快照,产生存储和网络开销。
地域价格差异
北京地域数据库扩容的方案通常需要考虑同城多可用区容灾,北京地域的云资源单价在多数厂商中处于中等偏上水平,跨可用区同步会增加网络开销,如果业务集中在北京,建议优先规划同地域双可用区,而不是直接跨地域容灾。
北京地域数据库扩容方案怎么做?先做容量模型
以北京本地电商的订单库为例,可以按下面步骤规划。
建立容量模型
估算未来6个月的单量增速,把订单量换算成数据库TPS,例如每天新增订单10万单,平均每单3次写操作,峰值按日均5倍算,峰值写入TPS约为17.4,这个数字会随促销波动。
选择纵向还是横向
订单库写入较多,单表订单明细数据量大,纵向先升内存和IOPS,让Buffer Pool能装下热数据,达到单节点规格上限后,订单表按用户ID做水平分片,横向扩展分片节点。
实施路径
先在北京地域的云控制台提交升配任务,操作路径通常是:实例列表 – 变更配置 – 选择目标规格 – 选择切换时间,建议选维护窗口切换,避免业务高峰闪断。
升配完成后,逐步添加只读节点,只读节点放在同地域不同可用区,兼顾容灾和读扩展,连接串改为读写分离地址,写流量走主节点,读流量走只读节点。
横向分片需要应用层配合,分片键取用户ID哈希,提前在测试环境验证跨分片查询的性能,分片路由逻辑放在应用层或中间件,不要依赖数据库自带的分片。
扩容演练不能只做一次
数据库扩容的纵向与横向路径提前规划,最后要落到演练上,每季度至少做一次扩容演练,业务大版本上线前必须做全量回放,演练内容包含:
- 纵向升配后的QPS提升和锁等待变化
- 横向加节点的数据同步耗时
- 主从切换时的应用报错率
- 连接池重新分配后的流量分布
- 回退脚本的执行时间和成功率
演练结果记录到容量基线文档,作为下一次规划的依据,这样数据库扩容就从救火动作变成常规操作。
数据库扩容路径规划常见问题
数据库扩容纵向和横向哪个好,有没有简单判断公式?
先看写入占主导还是读取占主导,写入占主导且单表数据量大,优先横向分片,读多写少且单行数据不大,加只读节点更划算,没有绝对答案,要看锁等待和Buffer Pool命中率,判断顺序是先查锁等待,再看Buffer Pool,最后看单表数据量。
生产环境数据库扩容注意事项里最容易漏掉什么?
最常漏掉的是应用连接池的调整,新节点加入后,连接串如果不更新或连接池不感知拓扑变化,流量还压在老节点上,半同步复制的超时参数也需要重新评估,还有回退方案里只写了切回老节点,没有写连接池的权重回滚,导致回退后仍然有部分连接打新节点。
云数据库扩容费用一般多少?
没有统一价格,按规格、存储和地域计费,纵向升配的差价按阶梯上升,加一个只读节点就多一份节点费用和存储费用,跨可用区部署还会增加网络开销,具体费用以各云厂商控制台实时报价为准。
提前把纵向和横向路径规划好,数据库扩容才能从被动救火变成主动保障。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637883.html





