ElasticSearch FAQ
内容:基础、倒排索引、写入原理、查询、集群、分片、性能调优、冷热分离、安全、ES 7/8 新特性等。
⭐ 目录
- 一、基础概念
- 二、倒排索引 / Lucene 原理
- 三、写入流程(核心)
- 四、查询流程(核心)
- 五、分片 / 副本 / 路由
- 六、集群与节点角色
- 七、性能优化(索引、搜索)
- 八、数据建模
- 九、ES 运维
- 十、常见故障
- 十一、安全与权限
- 十二、冷热分离 / ILM
- 十三、相关生态(Kibana、Logstash、Beats)
回答精要:
ElasticSearch 是基于 Lucene 的分布式搜索和分析引擎。
它快的原因:
- 倒排索引(Inverted Index)
- 分布式分片并行查询
- 列式存储(doc_values)
- 内存缓存(file cache / query cache / shard request cache)
- 高效的写入与 segment merge
倒排索引是:
单词 -> 出现在哪些文档 -> 文档中的位置
适合全文检索,查询复杂文本速度远远快于关系型数据库。
- 关键词直接对应文档列表,无需扫描整张表
- 结构适合大规模并行搜索
- Lucene 对索引进行了大量优化:跳表、FST、压缩存储
流程如下:
- 协调节点接收请求
- 根据 routing 计算目标 primary shard
- 写入 lucene 内存 buffer
- 定期 refresh -> 生成 segment,可被搜索
- translog 记录写入日志
- 后台 merge 合并小 segment
- 副本同步
- refresh(默认 1 秒):刷新内存 buffer,生成可搜索 segment -> 数据“可被查询”。
- flush:清空 translog -> 保证数据持久化。
- 协调节点拆分查询 -> 发送到每个 shard
- 每个 shard 查询自己的倒排索引
- 返回 top N
- 协调节点合并结果
- 返回最终排序后的结果
- 支持水平扩展
- 支持并行查询
- 避免单节点无法存储超大数据
- 小 segment 太多 -> 搜索慢
- merge 压力大
- 内存占用高
最佳实践:单 shard 控制在 20–50 GB。
默认:
shard = hash(_routing) % number_of_primary_shards
所以 分片数不能修改(主分片数固定)。
- 读高可用(提高查询性能)
- 故障转移(主分片挂了,副本提升为主分片)
负责:
- 管理集群状态
- 选主
- 创建删除索引
- 分片调度
常见错误:把 master 当成数据节点使用 -> 崩溃风险。
简要列出:
- master
- data_hot / data_warm / data_cold / data_frozen
- ingest
- transform
- ml
- coordinating-only
- 使用 bulk 批量写入
- 降低 refresh_interval(默认 1s,可改成 5s)
- 使用 Autogenerated ID
- 不要频繁更新文档(因为更新本质是删除+新增)
- 合理的分片数量
- 使用 SSD
- 使用 filter(可缓存)
- keyword 代替 text(不分词)
- 关闭不必要的字段(“index”: false)
- 使用 doc_values,禁用 fielddata
- 尽量使用 Term 查询,不用 wildcard 前缀搜索
| 字段类型 | 是否分词 | 使用场景 |
|---|---|---|
| text | 是 | 全文检索 |
| keyword | 否 | 精确匹配/聚合/排序 |
- dynamic 会导致字段爆炸(field explosion)
- 导致集群状态膨胀
- 影响搜索性能
- 增加数据节点 -> shard 自动 re-balance
- 增加 master 节点提高稳定性
- 增加协调节点提升搜索性能
GET _cluster/health
输出 green/yellow/red。
- 副本未分配
- 单节点集群(正常)
常见原因:
- 某些主分片丢失
- 节点掉线
- 磁盘满(常见!)
处理:
- 查看 _cluster/allocation/explain
- 释放磁盘空间
- 恢复快照
原因:
- 倒排索引成本高
- segment + merge
- 副本
- 索引存储结构本身压缩比低
ES 8 默认开启 X-Pack Security:
- TLS
- 用户角色管理(RBAC)
- API Key
- Token
- 热节点高性能:写入更快
- 冷节点高容量:成本更低
- ILM 控制 index 生命周期
一般流程:
Hot -> Warm -> Cold -> Frozen -> Delete
每个阶段控制:
- rollover
- forcemerge
- allocate 到不同节点
- searchable snapshot
- Filebeat:轻量采集日志
- Logstash:Log pipeline(过滤、解析、grok)
- Kafka(可选):缓存/削峰/解耦
- Elasticsearch:搜索与存储
- Kibana:展示与可视化
ElasticSearch 快是因为倒排索引 + Lucene + 分布式 + 并行搜索 + 列式存储。
写入是:buffer -> segment -> refresh -> translog -> flush -> merge。
分片数不要太多,单 shard 控制 20–50GB。
使用 filter、keyword、doc_values 优化搜索。
靠 ILM 做冷热分离,提高性能和降低成本。
master 只负责管理,不存数据。
查询和写入路径要完全理解。