Redis 集群切主期间客户端报 Connection reset,降级逻辑直接回源查 MySQL。数据库 QPS 从 200 涨到 1.8 万,连接数到 500 上限,报 1040 Too many connections,所有业务一起 500。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
mysql -e "SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections';" redis-cli -c cluster info | grep cluster_state
降级路径没有任何限流,缓存挡住的流量原样压到数据库。数据库连接上限是按正常流量规划的,扛不住缓存全失效的峰值。这一点先确认清楚,后面就不用反复试。
碰到「降级打满数据库」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,降级回源前先过一层本地限流 阈值按数据库能承受的 QPS 定;对热点 key 保留进程内缓存 缓存挂了还能顶一阵;数据库侧加连接数保护 超过阈值直接拒绝而不是排队;压测验证缓存全挂时的数据库表现。
改完照着核一遍,模拟 Redis 不可用后数据库 QPS 不超过 3000,连接数稳定在 200 以内,没有 1040 报错。
