压测链路是jmeter=>slb=>nginx => php=>rds
报 Too Many Connections 的原因是前端同时保持了 16000 个连接,达到实例规格的上限了。所以会报这个错。由于开启了短连接优化功能,前后端连接数也是 1:1 的,所以客户端那里保留了多少个连接,DB 上就会有多少个连接,跟开不开启短连接优化功能无关。
现在的短连接优化功能的原理是客户端断开连接之后,proxy 将 proxy 与 DB 之间的连接保持一小段时间。如果这时候客户端再建连,就可以直接复用这个连接,使得 DB 不需要再走一遍创建连接的流程,能降低一下 DB 的负载。
共享代理的模式是这样的,一个前端连接只与一个 DB 建连。所以理论上客户端可以同时保持 16000 * (1+只读实例个数)个连接。
独享代理的模式是一个前端连接与所有 DB 建连,所以理论上客户端只能保持 16000 个连接。由于独享代理模式的长连接不释放,导致数据库连接满。最后导致服务器奔溃。
在与阿里云的技术人员进行沟通后,原因是:他们下架共享代理模式,然后转推荐你使用独享模式于是便出现了这次的迁移事故。