月初报税高峰,热点 key 同时“下班”:缓存击穿把 MySQL 打成了 PPT
月初征期一到,一批热点 key 在同一秒过期,请求全部回源,MySQL 连接数瞬间打满。从命中率与 QPS 曲线定位击穿,辨析穿透/击穿/雪崩,并给出互斥锁、逻辑过期、随机 TTL、布隆过滤器与多级缓存的落地写法。
MySQL 慢 SQL、死锁、主从延迟,Redis 大 key、击穿、分布式锁。
月初征期一到,一批热点 key 在同一秒过期,请求全部回源,MySQL 连接数瞬间打满。从命中率与 QPS 曲线定位击穿,辨析穿透/击穿/雪崩,并给出互斥锁、逻辑过期、随机 TTL、布隆过滤器与多级缓存的落地写法。
一条上线半年都很快的 SQL 突然变慢,EXPLAIN 显示 type=ALL。从慢日志、pt-query-digest 到 EXPLAIN 逐列解读,逐个排查隐式类型转换、函数包裹列、前导 % 与字符集不一致导致索引失效,并给出改法。
业务偶发报 MySQL 1213 死锁,几百单里才一两单。用 SHOW ENGINE INNODB STATUS 逐行读懂 LATEST DETECTED DEADLOCK,配合 innodb_print_all_deadlocks 复现两类典型死锁:相反顺序加锁与间隙锁,并给出重试和统一加锁顺序的治法。
线上执行 ALTER TABLE 加字段,结果这张表所有读写全部排队。原因是一个没提交的长事务持有 MDL 读锁,ALTER 等写锁,后续请求全被堵在队列。附 processlist、performance_schema、sys 视图定位与 kill、Online DDL、gh-ost、lock_wait_timeout 的做法。
同一笔账被两个实例同时处理,锁明明加了。从 redis-cli 现场查锁 key 与 TTL 入手,讲清锁过期自动释放、误删他人锁、Redisson 看门狗只在不传 leaseTime 时续期、unlock 抛 IllegalMonitorStateException,以及主从切换丢锁与 Redlock 争议。
读写分离上线后,用户“下单成功却看不到订单”。用 SHOW REPLICA STATUS 看 Seconds_Behind_Source,定位到大事务与单线程回放,再讲并行复制、Canal 延迟排查,以及“读自己写的”几种落地方案。
接口大面积报 Connection is not available, request timed out after 30000ms。用 Hikari 日志、show processlist 与 jstack 交叉验证,找出事务里调远程接口占着连接的元凶,并讲清 maximumPoolSize 的公式、leakDetectionThreshold 与指标告警。
Redis 没宕机、CPU 也不高,却隔几分钟整体卡顿,别的业务跟着超时。用 SLOWLOG、latency doctor、--bigkeys / --memkeys、MEMORY USAGE 揪出一个大 Hash 和一条 HGETALL,附 UNLINK、SCAN、拆 key 的完整修法。