Elasticsearch 实战面试题,每个题目都会单独解析
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射?
ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?
Elasticsearch 分页查询的 from+size
有什么缺陷?如何优化深度分页?比较scroll API与search_after的差异
如何通过 Spring Data Elasticsearch 实现复杂查询(如多条件聚合)?商品搜索场景下,如何设计索引映射?说明字段类型选择依据(text/keyword/nested等)?
Elasticsearch 写入性能优化有哪些常见手段?
如何保证 Kafka 数据实时同步到 Elasticsearch?
ES分片(Shard)和副本(Replica)的作用?如何合理分配?
ES的Refresh、Flush、Merge操作对性能的影响?
ES如何实现近实时(NRT)搜索?
ES聚合查询的Terms和Cardinality区别?
ES的深分页(Deep Pagination)性能问题如何优化?
如何设计ES的冷热数据分离架构?
Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?
ES的向量检索(Vector Search)如何实现?
如何通过ES实现SQL风格的查询?
如何设计一个支持千万级数据量的搜索系统(结合 MySQL 和 ES)?ES与关系型数据库(MySQL)数据同步方案?如何保证数据库与Elasticsearch的双写一致性?对比采用事务日志与CDC方案的优劣
Elasticsearch 如何实现跨数据中心的数据同步?
ES 在大查询场景下导致 GC 频繁,如何定位和解决?
慢查询分析,如何通过_profile API分析查询性能瓶颈?解释返回结果中的各阶段耗时含义
集群恢复,当节点离线导致分片状态为UNASSIGNED时,如何进行分片重分配?
当出现Elasticsearch bulk写入性能瓶颈时,可以从哪些方面进行优化
Elasticsearch 架构图
+-------------------------------------------------------------------------------------------+
| Elasticsearch Cluster |
| |
| +----------------+ +----------------+ +----------------+ +----------------+
| | Node 1 | | Node 2 | | Node 3 | | Node N |
| | (Master) | | (Data-Hot) | | (Data-Cold) | | (Coordinator) |
| +----------------+ +----------------+ +----------------+ +----------------+
| | - 主节点 | | - 热数据节点 | | - 冷数据节点 | | - 协调节点 |
| | - 管理集群状态 | | - SSD 存储 | | - HDD 存储 | | - 路由查询请求 |
| +----------------+ +----------------+ +----------------+ +----------------+
| ▲ ▲ ▲ ▲ ▲
| | | | | |
| | 写入/查询请求 | | 数据分片(Shard) | 副本分片(Replica) |
| | | | | |
| +----------------+ | | +----------------+ |
| | Client |-------------+ +-------------| Client |------------------+
| +----------------+ +----------------+
| | 写入数据到协调节点 | 发起查询请求
| | |
| +----------------+ +----------------+
| | 数据源 | | 可视化工具 |
| | (MySQL/Logs) | | (Kibana) |
| +----------------+ +----------------+
| |
+-------------------------------------------------------------------------------------------+
核心组件说明
1. 节点角色
节点类型 | 功能描述 |
---|---|
主节点(Master) | 管理集群状态(索引创建/删除、节点加入/退出),不处理数据读写,避免单点故障需配置多个。 |
数据节点(Data) | 存储分片数据,分为热节点(SSD,处理实时写入)和冷节点(HDD,存储历史数据)。 |
协调节点(Coordinator) | 接收客户端请求,路由到相关分片,聚合结果返回(可独立或由数据节点兼任)。 |
Ingest 节点 | 预处理数据(如解析日志、富化字段),非必需角色,可由其他节点兼任。 |
2. 分片与副本
概念 | 描述 |
---|---|
分片(Shard) | 索引的横向拆分单元(如一个索引拆分为3个主分片),支持分布式存储和并行计算。 |
副本(Replica) | 分片的副本,保障高可用(主分片故障时副本提升为主分片)和负载均衡(副本处理读请求)。 |
3. 数据流
- 写入流程
客户端 → 协调节点 → 路由到主分片 → 同步副本分片 → 返回写入成功
- 查询流程
客户端 → 协调节点 → 广播查询到相关分片 → 聚合结果 → 返回最终结果
4. 冷热数据分离架构
- 热节点集群:处理实时写入和频繁查询(如近7天日志),使用高性能硬件(SSD、高CPU)。
- 冷节点集群:存储历史数据(如30天前日志),使用大容量HDD和低功耗硬件。
- ILM(索引生命周期管理):自动滚动索引(
hot → warm → cold → delete
)。
关键特性
- 分布式扩展:通过分片实现水平扩展,支持PB级数据。
- 近实时(NRT):数据写入后1秒(默认Refresh间隔)可被搜索。
- 高可用:副本分片保障数据冗余,主节点选举避免单点故障。
- 多租户:通过索引和别名机制隔离不同业务数据。
典型集成场景
+----------------+ +----------------+ +-------------------+
| 数据源 | | 消息队列 | | 可视化与分析 |
| (MySQL/日志) | → | (Kafka) | → | (Kibana) |
+----------------+ +----------------+ +-------------------+↓ ↓
+----------------+ +----------------+
| 数据同步工具 | | Elasticsearch |
| (Logstash/Canal)| → | Cluster |
+----------------+ +----------------+
此架构图可用于面试中解释 ES 的核心设计理念,或在实际项目中指导集群规划和性能优化。