1. 为什么数据库一到高峰期就“扛不住”?
这个问题困扰过太多技术团队。作为经历过多次大促的技术老兵,我见过太多团队在数据库扛不住时第一反应就是“加机器”,结果发现即使加了机器问题依然存在。真正的问题往往不在数据库本身,而在于整个系统架构对数据库的“暴力使用”。
数据库本质上是个老实人,它不会偷懒,但也不懂得拒绝。当大量请求涌来时,它会老老实实处理每一个请求,直到自己彻底崩溃。我们经常看到这样的场景:CPU还没打满,IO也没到瓶颈,但数据库连接数已经爆了,新请求直接被拒绝。这不是数据库的错,而是我们使用它的方式出了问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库最怕的不是“慢”,而是“抖动”
2.1 什么是“抖动”?
抖动指的是请求量在短时间内剧烈波动的现象。比如大促时的秒杀场景,平时QPS可能只有100,但秒杀开始瞬间可能飙升到1万。这种剧烈的波动对数据库来说是致命的。
数据库处理请求需要稳定的环境。它需要:
- 稳定的连接数
- 可控的并发事务
- 合理的锁等待时间
当这些条件被打破时,数据库就会进入“亚健康”状态。
2.2 抖动如何摧毁数据库?
一个典型的死亡螺旋是这样的:
- 某个查询开始变慢(RT从50ms升到200ms)
- 应用层超时机制触发(假设超时设置为100ms)
- 超时导致自动重试
- 重试的请求和新的请求叠加,使实际QPS翻倍
- 更多的请求导致更多的锁等待和资源争用
- 整体RT进一步恶化
- 最终数据库连接池耗尽
这个过程中,数据库的CPU可能才用到30%,但服务已经不可用了。
3. 为什么数据库总是第一个倒下?
3.1 有状态服务的天然缺陷
与应用服务不同,数据库是有状态的。这意味着:
- 它不能简单地水平扩展
- 主从切换有成本
- 数据一致性必须保证
当我们需要扩展应用服务时,加机器就行。但数据库加机器意味着要做分片,这是个大工程。
3.2 连接数的硬限制
每个数据库连接都会占用:
- 内存(每个连接至少几MB)
- CPU上下文切换开销
- 文件描述符
MySQL默认的最大连接数是151,虽然可以调整,但连接数越多,性能反而可能下降。
3.3 锁机制的连锁反应
数据库的锁就像十字路口的红绿灯:
- 少量车流时,红绿灯很高效
- 车流大增时,红绿灯反
