当前位置: 首页 > news >正文

【面试】Elasticsearch 实战面试问题

一、性能与慢查询

1. ES 查询非常慢,延迟高

  • 场景:用户反馈搜索接口经常超时,尤其在大分页查询时。

  • 可能原因

    • 使用 from + size 进行深度分页,导致扫描大量文档。

    • 没有使用合适的 keyword 字段,触发全文分析。

    • 分片过多,节点压力大。

  • 排查工具/方法

    • /_cat/nodes?v 查看节点负载。

    • /_nodes/hot_threads 分析 CPU 占用。

    • /_tasks 查看慢查询任务。

  • 解决方案

    • 使用 search_afterscroll 替代深度分页。

    • 在 mapping 中合理区分 textkeyword

    • 优化分片数量,减少不必要的广播查询。

2. ES 写入速度很慢

  • 场景:日志数据写入,QPS 仅几千就触发瓶颈。

  • 可能原因

    • refresh_interval 太短,频繁 segment merge。

    • 没用 bulk API,单条写入开销大。

    • 硬盘 IO 或 JVM GC 压力过大。

  • 排查工具/方法

    • _cat/indices?v 查看写入速率。

    • /_nodes/stats 检查 IO/GC。

  • 解决方案

    • 批量写入(bulk),减少请求数。

    • 调整 refresh_interval=30s 或临时设为 -1 批量导入。

    • 优化硬件(SSD)、调 JVM 堆。

3. 聚合查询(aggregation)导致内存溢出

  • 场景:报表系统需要统计用户行为,ES 经常 OOM。

  • 可能原因

    • 大量字段开启了 fielddata

    • 使用了高基数字段(如 userId)做聚合。

  • 排查工具/方法

    • _cat/fielddata 查看内存使用。

    • /_nodes/stats?pretty 查看 JVM 内存分配。

  • 解决方案

    • 将聚合字段设为 keyword + doc_values

    • 限制聚合深度(size)。

    • 使用 composite aggregation 分页聚合。

二、索引与 Mapping

4. ES mapping 设计错误导致查询异常

  • 场景:手机号存成了 text 类型,查询效率极差。

  • 可能原因

    • 误用 text,导致分词。

  • 排查工具/方法

    • GET index/_mapping 查看字段类型。

  • 解决方案

    • 修改 mapping 不可行,只能重建索引。

    • 预先设计好字段(手机号/ID 用 keyword)。

5. 分片数设置不合理

  • 场景:创建索引时设了 50 个分片,导致节点内存消耗大。

  • 可能原因

    • 分片数量过多,导致资源浪费。

    • 分片数量过少,导致无法扩展。

  • 排查工具/方法

    • /_cat/shards 查看分片分布。

  • 解决方案

    • 计算分片数 ≈ 数据量 / (单分片上限 50GB)

    • 7.x 以后用 ILM(Index Lifecycle Management)自动管理索引滚动。

6. 索引占用磁盘过大

  • 场景:100GB 原始数据,ES 占用 500GB。

  • 可能原因

    • _source 未禁用,存储重复 JSON。

    • 没有压缩,字段冗余。

  • 排查工具/方法

    • _cat/indices?v 查看磁盘使用。

  • 解决方案

    • _source 只保留必要字段。

    • 开启 best_compression

    • 使用 alias 指向归档索引,定期清理历史数据。

三、集群与节点

7. 集群状态变成 yellow/red

  • 场景:集群宕机后,索引部分不可用。

  • 可能原因

    • 副本分片未分配。

    • Master 节点丢失。

  • 排查工具/方法

    • /_cluster/health 查看集群状态。

    • /_cat/allocation?v 查看分片分布。

  • 解决方案

    • 增加节点,确保副本可分配。

    • 检查 master 选举是否正常。

8. 集群频繁 GC,响应变慢

  • 场景:查询稍微多一些,就频繁 Full GC。

  • 可能原因

    • JVM 堆过小。

    • fielddata 或聚合加载过多数据。

  • 排查工具/方法

    • jstatES GC 日志

    • /_nodes/stats/jvm 查看内存。

  • 解决方案

    • 调整 ES 堆大小(推荐 50% 内存,<=32G)。

    • doc_values 替代 fielddata。

9. 分片倾斜导致部分节点压力过大

  • 场景:某些节点 QPS 很高,其他节点空闲。

  • 可能原因

    • 分片分配不均匀。

  • 排查工具/方法

    • /_cat/shards 查看分布。

  • 解决方案

    • 手动 reroute 分片。

    • 配置 cluster.routing.allocation.awareness,保证均衡。

10. 节点频繁掉线

  • 场景:大查询时节点直接挂掉。

  • 可能原因

    • heap 内存不足。

    • 网络分区。

  • 排查工具/方法

    • /_cluster/state 查看节点。

  • 解决方案

    • 调整 JVM 堆 + OS 虚拟内存。

    • 增加节点,避免单节点压力过大。

四、查询与业务应用

11. 中文搜索结果不准

  • 场景:用户搜索“北京大学”,结果却包含“北京 大学 城”。

  • 可能原因

    • 默认 Standard Analyzer 不适合中文。

  • 排查工具/方法

    • _analyze 查看分词结果。

  • 解决方案

    • 使用 IK 分词器jieba

    • 搜索时使用 multi_match 并配置 analyzer。

12. 排序不稳定

  • 场景:用户同样的搜索请求,每次结果顺序不同。

  • 可能原因

    • 没有明确排序字段。

  • 排查工具/方法

    • 检查查询 DSL 是否带 sort

  • 解决方案

    • 指定排序字段(如时间、权重)。

    • 引入 _score + 二级排序。

13. 统计结果不准

  • 场景:查询用户数,结果比真实数据少。

  • 可能原因

    • ES 统计是近实时的,存在延迟。

  • 排查工具/方法

    • refresh 强制刷新。

  • 解决方案

    • 关键业务场景下,调用 POST index/_refresh

    • 允许弱一致性,减少性能损耗。

五、监控与运维

14. 查询 QPS 高,集群 CPU 100%

  • 场景:业务高峰期 CPU 被打满,查询大量超时。

  • 可能原因

    • 查询 DSL 复杂(wildcard、正则)。

    • 节点不足。

  • 排查工具/方法

    • _nodes/hot_threads 找出热点查询。

  • 解决方案

    • 优化 DSL,避免 *abc*

    • 增加节点或分流。

15. ES 集群升级后,旧索引无法使用

  • 场景:升级 ES 7.x 后,部分 5.x 索引报错。

  • 可能原因

    • 跨大版本不兼容。

  • 排查工具/方法

    • _cat/indices 查看旧索引格式。

  • 解决方案

    • 使用 reindex API 迁移数据。

16. 滚动日志索引过多

  • 场景:日志索引每天建一个,1 年后有 365 个索引,管理困难。

  • 可能原因

    • 没有生命周期管理策略。

  • 排查工具/方法

    • _cat/indices 查看索引数。

  • 解决方案

    • 使用 ILM(Index Lifecycle Management)。

    • 热数据用 SSD,冷数据迁移到 HDD 或 S3。

六、缓存与查询优化

17. 查询结果不稳定,性能忽高忽低

  • 场景:同一查询第一次慢,第二次快。

  • 可能原因

    • ES 使用了 query cache,第一次查询未命中缓存。

  • 排查工具/方法

    • /_nodes/stats/indices/query_cache 查看缓存命中率。

  • 解决方案

    • 对热点查询使用缓存。

    • 对动态查询参数禁用缓存。

18. 使用通配符查询(wildcard)非常慢

  • 场景:用户搜索 *abc*,集群直接卡死。

  • 可能原因

    • wildcard 会扫描大量 term。

  • 排查工具/方法

    • _explain 查看查询计划。

  • 解决方案

    • 避免前缀 *,改用 ngram 索引。

    • 提前做关键词分词。

19. 正则查询耗时长

  • 场景:用 /abc.*/ 匹配,耗时数十秒。

  • 可能原因

    • 正则在倒排索引上效率差。

  • 排查工具/方法

    • profile API 分析查询性能。

  • 解决方案

    • keyword 字段 + 前缀匹配代替。

    • 预处理业务字段,避免运行时正则。

20. 排序慢

  • 场景:对 1000w 条数据排序,查询超时。

  • 可能原因

    • 排序字段没用 doc_values

  • 排查工具/方法

    • _mapping 查看字段属性。

  • 解决方案

    • 对排序字段启用 doc_values

    • 减少排序数据量(分页、分桶)。


七、Spring & 业务集成

21. Spring Boot + ES 查询延迟高

  • 场景:接口层调用 ES 查询,RT 达 2s。

  • 可能原因

    • 查询 DSL 过大。

    • HTTP 连接池配置不足。

  • 排查工具/方法

    • thread dump 查看等待队列。

  • 解决方案

    • 使用 RestHighLevelClient 并调大连接池。

    • 缓存热点查询。

22. MyBatis / JPA + ES 数据不同步

  • 场景:更新 MySQL,ES 数据未更新。

  • 可能原因

    • 缺少异步同步机制。

  • 排查工具/方法

    • 对比 MySQL 和 ES 数据量。

  • 解决方案

    • 使用 Canal/Kafka 捕获 Binlog → 写 ES。

    • 定期做全量校验。

23. Kafka + ES 写入延迟大

  • 场景:Kafka 消费写 ES 延迟几分钟。

  • 可能原因

    • 批量提交太小,ES QPS 受限。

  • 排查工具/方法

    • 查看 Kafka Lag。

  • 解决方案

    • 批量 bulk 写入,调大并发。

    • 调整 Kafka consumer 批量大小。

24. 日志链路丢失数据(ELK)

  • 场景:日志收集不完整,部分数据不在 ES。

  • 可能原因

    • Logstash 队列溢出。

    • ES bulk 拒绝写入。

  • 排查工具/方法

    • logstash logs

    • /_cat/recovery

  • 解决方案

    • 调大 Logstash 队列。

    • 开启 bulk retry。

八、集群与跨数据中心

25. 跨集群搜索延迟高

  • 场景:上海节点查询需要访问北京集群,延迟 2s。

  • 可能原因

    • 网络延迟 + 跨集群广播。

  • 排查工具/方法

    • ping / traceroute 网络检查。

  • 解决方案

    • 业务侧缓存结果。

    • 跨集群只查关键索引。

26. 跨机房写入失败

  • 场景:双活 ES,跨机房写失败。

  • 可能原因

    • ES 本身不支持多写一致性。

  • 排查工具/方法

    • _cluster/stats

  • 解决方案

    • 采用消息队列中转(Kafka → 各机房 ES)。

    • 单写多读架构。

27. 索引迁移失败

  • 场景:索引从老集群迁移到新集群时报错。

  • 可能原因

    • mapping 不兼容。

  • 排查工具/方法

    • _mapping 对比差异。

  • 解决方案

    • 用 reindex API。

    • 先迁空壳 mapping,再迁数据。

28. 索引恢复慢

  • 场景:节点宕机重启后,索引恢复需数小时。

  • 可能原因

    • 分片太大。

  • 排查工具/方法

    • /_cat/recovery?v

  • 解决方案

    • 分片大小控制在 30~50GB。

    • 多节点并行恢复。

29. 选主不稳定

  • 场景:集群频繁触发 master 选举。

  • 可能原因

    • master 节点数量不足。

  • 排查工具/方法

    • cluster logs

  • 解决方案

    • 至少 3 个 master eligible 节点。

    • 网络层优化,避免脑裂。


30. 集群健康状态频繁波动

  • 场景:集群在 green/yellow 之间切换。

  • 可能原因

    • 网络抖动。

    • 节点负载过高。

  • 排查工具/方法

    • /_cluster/health?level=shards

  • 解决方案

    • 调整 discovery.zen 配置。

    • 增加资源。

九、容器化与运维

31. Docker 中 ES 内存不足

  • 场景:ES 容器频繁 OOMKilled。

  • 可能原因

    • JVM 堆设置不合理。

  • 排查工具/方法

    • docker stats

  • 解决方案

    • -Xms -Xmx 设置为 50% 容器内存。

32. Kubernetes 部署 ES 不稳定

  • 场景:Pod 重启,集群频繁 yellow。

  • 可能原因

    • PV 未绑定,数据丢失。

  • 排查工具/方法

    • kubectl describe pod

  • 解决方案

    • StatefulSet + PVC。

    • 使用 local PV 或 Ceph。

33. ES 监控指标不全

  • 场景:Prometheus 采集不到索引级别指标。

  • 可能原因

    • 未安装 exporter。

  • 排查工具/方法

    • curl /_cat/indices

  • 解决方案

    • 部署 elasticsearch-exporter

    • 对接 Grafana。

34. 备份恢复失败

  • 场景:ES snapshot 恢复报错。

  • 可能原因

    • repository 配置错误。

  • 排查工具/方法

    • _snapshot/_status

  • 解决方案

    • 使用 S3/HDFS repo。

    • 确认权限。

35. 安全认证问题

  • 场景:ES API 调用 401。

  • 可能原因

    • X-Pack 未配置。

  • 排查工具/方法

    • /_security/user

  • 解决方案

    • 配置 user/role。

    • 使用 API key。

十、进阶问题

36. 热点索引写入瓶颈

  • 场景:日志索引当天写入量过大。

  • 可能原因

    • 所有写入落到单索引。

  • 排查工具/方法

    • /_cat/indices

  • 解决方案

    • 按时间滚动索引(index per day)。

    • ILM 管理。

37. 热点 term 查询慢

  • 场景:某用户 ID 查询慢。

  • 可能原因

    • term 值过多。

  • 排查工具/方法

    • term stats 分析。

  • 解决方案

    • 建立反向索引或预聚合表。

38. 聚合内存溢出

  • 场景:大聚合任务 OOM。

  • 可能原因

    • 一次性拉取太多 bucket。

  • 排查工具/方法

    • _tasks

  • 解决方案

    • composite agg 分批拉取。

    • 限制 size。

39. Nested 查询性能差

  • 场景:复杂对象嵌套查询很慢。

  • 可能原因

    • nested 查询展开成多个 hidden doc。

  • 排查工具/方法

    • profile API。

  • 解决方案

    • 业务端扁平化存储。

40. pipeline aggregation 慢

  • 场景:二次聚合计算慢。

  • 可能原因

    • 处理了过多桶。

  • 排查工具/方法

    • profile API。

  • 解决方案

    • 限制前置聚合 bucket 数量。

十一、故障恢复与排查

41. 索引不可写

  • 场景:磁盘 95%+,索引写入报错。

  • 可能原因

    • ES 磁盘水位保护。

  • 排查工具/方法

    • _cluster/settings

  • 解决方案

    • 扩容磁盘。

    • 修改 cluster.routing.allocation.disk.watermark.*

42. ES 无法启动

  • 场景:重启 ES 失败。

  • 可能原因

    • 权限不足 / jvm.options 错误。

  • 排查工具/方法

    • logs 目录。

  • 解决方案

    • 检查 vm.max_map_count

    • 调整 jvm 参数。

43. 集群分裂(脑裂)

  • 场景:出现多个 master。

  • 可能原因

    • 网络分区。

  • 排查工具/方法

    • cluster logs。

  • 解决方案

    • 配置 discovery.zen.minimum_master_nodes = N/2+1

44. ES 滚动升级失败

  • 场景:升级版本后部分节点不兼容。

  • 可能原因

    • 跨大版本不支持。

  • 排查工具/方法

    • logs。

  • 解决方案

    • 逐级升级。

    • 先升级 master 节点。

45. 数据丢失

  • 场景:节点宕机,部分索引丢失。

  • 可能原因

    • 没有副本。

  • 排查工具/方法

    • /_cat/indices

  • 解决方案

    • 生产至少 1 副本。

    • 快照备份。

46. 查询超时

  • 场景:接口调用 30s 超时。

  • 可能原因

    • 搜索条件不走倒排索引。

  • 排查工具/方法

    • explain API。

  • 解决方案

    • 优化 mapping。

    • 避免 script 查询。

47. Script 查询性能差

  • 场景:脚本评分查询卡顿。

  • 可能原因

    • script 每次编译。

  • 排查工具/方法

    • script logs。

  • 解决方案

    • 使用 painless 并启用 script 缓存。

48. ES 节点磁盘写满

  • 场景:磁盘满导致宕机。

  • 可能原因

    • segment merge 写放大。

  • 排查工具/方法

    • _cat/allocation

  • 解决方案

    • 增加磁盘或清理旧索引。

49. 备份恢复很慢

  • 场景:snapshot restore 需要数小时。

  • 可能原因

    • 网络带宽不足。

  • 排查工具/方法

    • repo logs。

  • 解决方案

    • 并行恢复多个 shard。

    • 提前冷热分离。

50. ES 在大数据场景下不稳定

  • 场景:100TB 数据集群经常 red。

  • 可能原因

    • 分片太多。

    • 节点负载过高。

  • 排查工具/方法

    • /_cluster/stats

  • 解决方案

    • 用冷热分离架构。

    • 使用 rollup / spark 分析。


文章转载自:

http://KCz7RsDI.xxhwg.cn
http://2ZFPRVGG.xxhwg.cn
http://W7zYVXVB.xxhwg.cn
http://nGRf01by.xxhwg.cn
http://44mEL7Ie.xxhwg.cn
http://Yq4LGiNf.xxhwg.cn
http://zdsJskgp.xxhwg.cn
http://rz0nlpSV.xxhwg.cn
http://XqvAv1py.xxhwg.cn
http://rB5UQDaK.xxhwg.cn
http://ceYdEUpz.xxhwg.cn
http://v0ccj9qU.xxhwg.cn
http://Du1mD3mW.xxhwg.cn
http://HL0L3t2c.xxhwg.cn
http://QpTqHlN2.xxhwg.cn
http://3oROMj4T.xxhwg.cn
http://qD75tBDg.xxhwg.cn
http://UBiz8L4r.xxhwg.cn
http://N9wwdyc2.xxhwg.cn
http://wcoomCIf.xxhwg.cn
http://v3jom02f.xxhwg.cn
http://TV6TjibK.xxhwg.cn
http://BfcrhC06.xxhwg.cn
http://Kha1YZLN.xxhwg.cn
http://97LZNYFQ.xxhwg.cn
http://pKDGRy1l.xxhwg.cn
http://QO61tKPv.xxhwg.cn
http://D1pCmvjK.xxhwg.cn
http://QzJOjeMe.xxhwg.cn
http://eTEXzrSf.xxhwg.cn
http://www.dtcms.com/a/377301.html

相关文章:

  • Java与Vue前后端Excel导入交互解决方案
  • 2023年IEEE TASE SCI2区,基于Dubins路径的多异构无人机动态灾情检测与验证集成分配,深度解析+性能实测
  • 无人机电流技术与安全要点
  • 用户故事设计范式(As a... I want to... So that...)
  • 技嘉B760+i5 12400F+ 华硕tuf rtx5060装机配置方案|仅供参考2025.09.10
  • PSO-BP粒子群优化BP神经网络回归预测+SHAP分析+PDP部分依赖图,可解释机器学习,Matlab代码
  • HarmonyOS编写教师节贺卡
  • 点晴免费OA系统为企业提供高效办公的解决方案
  • Python:Scapy 网络交互与安全的工具库
  • web中的循环遍历
  • 行业学习【电商】:腾讯视频、携程算“电商”吗?
  • 使用 `matchMedia()` 方法检测 JavaScript 中的媒体状态
  • Record和as keyof typeof断言的使用
  • 大数据电商流量分析项目实战:Day 1-1 Linux基础(补充)
  • 【非对称密码算法“克星”】Shor 算法如何撬动互联网安全根基
  • 权重衰减与暂退法
  • 知识图谱——图数据库与项目构建
  • docker 拉取本地镜像
  • CSS(引入、权重、特指度、继承)
  • RMS设备检修管理系统_HawkEye智能运维平台_璞华大数据
  • Shell编程:检测主机ip所在网段内其他在线ip
  • PMC转PXIE转接卡
  • 在Windows上搭建GPU版本PyTorch运行环境的详细步骤
  • LayaAir鼠标(手指)控制相机旋转,限制角度
  • 案例开发 - 日程管理 - 第七期
  • 微信小程序发送订阅消息-一次订阅,一直发送消息。
  • Java入门级教程15——实现交替打印、JUC并发包之栅栏机制、制作验证码
  • Hadoop(十二)
  • 《嵌入式硬件(七):使用IMX6ULL所需环境以及编译方法》
  • vue-router 的实现原理