已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
背景
我负责一条中台链路,8 个微服务共享同一个 MySQL 8.0.36 实例(max_connections=500),各服务使用不同 schema,K8s 部署,每服务 4 副本。各服务 HikariCP 关键配置:maximumPoolSize=30、minimumIdle=10、connectionTimeout=5s、maxLifetime=30min。
理论最坏情况:8 × 4 × 30 = 960 连接 > max_connections 500。平时各服务流量差异大(有的 QPS 2000、有的 200),实际连接数远没到上限,所以一直没出事。
现象
上周一个报表服务(QPS 约 50)执行了一条带 GROUP BY + ORDER BY 的大查询(扫描 800w 行),平均执行时间从 5ms 飙到 2.3s。该服务 4 副本 × 4 个并发慢查询 = 16 个连接被"占住"长达 2s+,连接数从稳态 8 涨到 30(maxSize)。
与此同时,另一个核心服务(交易写入,QPS 1200)开始出现 SQLTransientConnectionException: Connection is not available, request timed out after 5000ms,持续约 40s 后随慢查询结束恢复。
已尝试的排查与结果
sort_buffer + join_buffer + thread_stack 按连接分配,500→1000 后内存多占约 3.2GB(8C32G 实例),治标不治本,且慢 SQL 再来一次照样挤占。max_user_connections:给每个服务的 DB 账号设了限额(如报表服务 user 限 20),但怎么定"每个 user 该给多少"仍然没有依据,本质还是拍脑袋。max_conn_count=200 可以兜底,但引入了额外一跳延迟(P50 +0.3ms),且 ProxySQL 本身的连接池配置和各服务 HikariCP 配置变成两层,排障复杂度翻倍。期望得到的答案形态
QPS × avg_hold_time / 目标并发度 反推,或者基于 P99 持有时间的自适应)max_user_connections 更精细的 MySQL 侧限流手段?(比如 resource group + 连接数限制)补充:我引用社区里两篇相关的经验作为背景——
但"多服务 × 多副本 × 共享实例"的全局预算视角,社区还没有看到系统性的讨论,想请教一下大家的生产实践。