事故合集,一次点名
前面十八篇把知识铺开了,这篇反过来:只讲事故。十个真实场景,每个给三句话——现场什么样、根因是什么、怎么修。建议当面试题库用,一条比一条眼熟。
十个现场
| 现场 | 根因 | 修法 |
|---|---|---|
| 对 text 用 term 查整句,零结果 | term 找词条,text 存的是碎片 | 整句走 match,精确走 keyword 子字段 |
| 价格排序把 10 排在 9 前面 | 动态 mapping 把数字字符串猜成 text | 显式 mapping 加 reindex(第 5 篇) |
| 翻深页报 Result window too large | from 加 size 成本线性放大 | search_after 或限页(第 10 篇) |
| 写入后搜不到,以为丢数据 | refresh 一秒一次,近实时设计 | 读链路等一秒或按 ID 直查(第 6 篇) |
| 几十个小分片吃光内存 | 每分片一个 Lucene 实例 | 单分片 10-50GB,rollover 滚动(第 14 篇) |
| 单节点集群常年 yellow | 副本没地方放 | 本地环境副本归零(第 13 篇) |
| 对 text 开 fielddata 后 OOM | 碎词条全装进堆内存 | 永远用 keyword 子字段聚合(第 11 篇) |
| wildcard 星号打头拖垮集群 | 倒排失效,遍历词典 | ngram 分词或改产品形态(第 17 篇) |
| MySQL 与 ES 数据悄悄漂移 | 双写或同步链路静默失败 | 定时对账加局部修复(第 15 篇) |
| 列表页接口越来越慢 | _source 整包返回几千字详情 | _source 裁剪只取列表字段(第 17 篇) |
事故背后的三个规律
十条事故摆在一起,能提炼出三条规律。规律一:一半的坑是「拿 MySQL 的直觉用 ES」——以为实时、以为行存、以为 LIKE 能用,世界观没切换(第 1-6 篇全部背锅)。规律二:三成的坑在建库那一刻埋下——mapping 和分片数都是定死不悔改的,建库多想十分钟,线上少熬十个夜。规律三:剩下的坑缺的是校验——数据漂移靠对账发现,慢查询靠慢日志发现,副本异常靠三色灯发现,没有监控的故障都是用户先发现的。
老王把这十条打印出来贴在工位,新人入职先对着读一遍,能少走他两个月的弯路。
小结
十个现场一句话总结:查不对先查 mapping,查得慢先查查询形态,查不准先查同步链路。事故不可怕,同一类事故踩两次才可怕。
20 篇走到最后一篇。下一篇收官:一张作战地图串起整个系列,外加十条上线检查清单。
评论 (0)