置顶生产问题排查手记:37 篇线上事故的完整排查过程(总目录与症状速查)
从 CPU 飙高、OOM、慢 SQL 到消息堆积、Docker 与 Nginx 故障,37 篇第一人称排查记录的总目录:分层排查地图、症状速查表、按分类索引。
从一个关键词,发现新的思路。
从 CPU 飙高、OOM、慢 SQL 到消息堆积、Docker 与 Nginx 故障,37 篇第一人称排查记录的总目录:分层排查地图、症状速查表、按分类索引。
容器的「网络不通」和「文件没权限」是运维群里最高频的两类问题,绝大多数不是 Docker 的 bug,而是网络模型与宿主机的差异没搞清。这篇讲四种网络模式、bridge 到底靠什么打通、-p 与 EXPOSE 的区别、容器间怎么互访、localhost 的陷阱,以及 volume/bind mount/tmpfs 怎么选和权限、时区怎么配。
单个容器好管,一堆容器就靠 Compose。但 Compose 里最容易踩的不是语法,是「启动顺序」和「日志把磁盘吃光」。这篇给一份能直接改用的 Java + MySQL + Redis 编排示例,讲清 depends_on 为什么只等启动不等就绪、日志驱动怎么配才不会撑爆根分区,以及上线前必须过一遍的检查清单。
前四篇是按知识点讲的,这篇是反过来用的:命令忘了、线上出事了,回来翻。上半部分按镜像、容器、网络、存储、Compose、系统清理分组整理常用命令,能直接复制;下半部分是 12 个真实场景案例,每个给出现象、怎么查、结论三步。
线上执行 ALTER TABLE 加字段,结果这张表所有读写全部排队。原因是一个没提交的长事务持有 MDL 读锁,ALTER 等写锁,后续请求全被堵在队列。附 processlist、performance_schema、sys 视图定位与 kill、Online DDL、gh-ost、lock_wait_timeout 的做法。
读写分离上线后,用户“下单成功却看不到订单”。用 SHOW REPLICA STATUS 看 Seconds_Behind_Source,定位到大事务与单线程回放,再讲并行复制、Canal 延迟排查,以及“读自己写的”几种落地方案。
备份脚本手敲一切正常,放进 crontab 却悄无声息地不执行。逐条排查 cron 服务与日志、PATH 环境变量、百分号转义、时区、权限、输出重定向、flock 防重叠、时间漂移,并对比 XXL-JOB。
一次上线连踩两个 Nginx 默认值:client_max_body_size 默认 1m 导致上传 413,Spring Boot multipart 与多层代理要逐层放开;WebSocket 每 60 秒断线,缺 Upgrade 头且 proxy_read_timeout 默认 60s。附 curl 复现命令与心跳方案。