Elasticsearch高频面试10问

96 阅读10分钟

Elasticsearch高频面试10问

在大数据与搜索领域,Elasticsearch凭借强大的分布式搜索、分析能力,成为众多企业处理海量数据的关键技术。对于开发者与运维人员,掌握其核心原理与应用技巧至关重要。以下为你梳理10道Elasticsearch高频面试题,助你在面试中脱颖而出。

1. Elasticsearch是什么,有哪些核心概念?

Elasticsearch是基于Lucene构建的分布式搜索引擎,以RESTful API提供服务,支持多语言交互。其核心概念包括:

  • 集群(Cluster):由一个或多个节点组成,共同存储、处理数据,对外提供统一服务,集群名称唯一标识该集群。
  • 节点(Node):集群中的单个服务器,可承担主节点(Master Node,负责集群管理,如创建索引、分配分片)、数据节点(Data Node,存储和处理数据)、协调节点(Coordinating Node,处理客户端请求,路由查询和写入操作)等角色。
  • 索引(Index):类似关系型数据库中的数据库,是具有相似特征文档的集合,有自己的映射(Mapping,定义文档字段的数据类型等)和设置(Settings,如分片数量、副本数量)。
  • 文档(Document):索引中的基本数据单元,以JSON格式存储,每个文档有唯一ID,可包含不同字段。
  • 分片(Shard):索引数据的逻辑分区,主分片负责写入和初始数据存储,副本分片用于冗余和负载均衡,提升数据可用性与查询性能。

2. Elasticsearch的写入流程是怎样的?

  1. 客户端请求:客户端向集群中任意节点发送写入请求,该节点作为协调节点。
  2. 路由确定:协调节点依据文档ID和索引设置(如分片数量),通过哈希函数与模运算确定文档应写入的主分片,例如shard = hash(_id) % num_of_primary_shards
  3. 主分片处理:请求转发至主分片所在数据节点,数据节点将文档写入内存中的Lucene索引结构,转换为倒排索引形式,同时记录写入操作到事务日志(Translog)。
  4. 副本同步:主分片异步将数据同步到对应的副本分片,确保数据冗余与高可用。
  5. 写入确认:主分片和足够数量副本分片(依配置,可能是全部或多数)写入成功后,协调节点收到确认信息,向客户端返回写入成功响应。

在这一过程中,内存缓冲区数据定时(默认1秒)刷新(Refresh)到Lucene索引形成新段(Segment),段不可变;Translog定期(默认30分钟)或大小达到阈值(默认512MB)时,执行flush操作,将内存数据与Translog持久化到磁盘,清空相关缓存与文件。

3. Elasticsearch的查询流程是什么?

查询分Query和Fetch两个阶段:

Query阶段

  1. 请求分发:客户端向集群节点发送查询请求,该节点作为协调节点。协调节点将查询广播至索引的每个主分片或副本分片。
  2. 本地查询:各分片在本地执行查询,生成命中文档的优先级队列(大小为from + size)。例如查询{ "from": 10, "size": 10 },队列大小为20。
  3. 结果合并:各分片将队列中的文档ID和排序值返回协调节点,协调节点合并这些值,生成全局排序结果列表。

Fetch阶段

  1. 文档确定:协调节点根据Query阶段结果,确定需取回的文档,如{ "from": 90, "size": 10 },丢弃前90个结果,仅取回第91 - 100个结果对应的文档。
  2. 文档获取:协调节点向相关分片发送多个GET请求,获取文档。分片加载、处理(如丰富文档内容)后返回给协调节点。
  3. 结果返回:协调节点将所有取回文档整理后返回客户端。

4. 倒排索引在Elasticsearch中起什么作用,如何实现?

倒排索引是Elasticsearch核心数据结构,用于快速查找包含特定词的文档。传统正向索引从文档到词,倒排索引则相反,从词到文档。例如,对于文档集合,倒排索引记录每个词出现在哪些文档中、词频(TF,Term Frequency,该词在文档中出现次数)、位置(Posting,词在文档中的位置,用于短语查询等)和偏移量(offset,字符偏移,用于高亮显示等)。

在Elasticsearch中,基于Lucene实现倒排索引。写入文档时,分析器将文档内容分词,每个词及其对应文档信息被构建到倒排索引结构中。查询时,对查询语句分词,在倒排索引中快速定位包含这些词的文档,通过词频、位置等信息进行相关性计算和结果排序,极大提升检索效率,实现高效全文检索和复杂查询。

5. Elasticsearch如何保证数据一致性?

Elasticsearch通过多种机制保证数据一致性:

写入时一致性

  1. 副本同步:写入主分片成功后,主分片将数据异步同步到副本分片,可配置等待一定数量副本分片确认(如consistency参数设置为onequorumall),确保数据在多个副本上存在,降低数据丢失风险。
  2. 事务日志(Translog):写入操作同时记录到Translog,用于故障恢复。系统崩溃重启时,可重放Translog恢复未持久化到磁盘的数据,保证已确认写入的数据不丢失。

读取时一致性

  1. 实时读取:默认情况下,Elasticsearch提供近实时读取,写入的数据经短暂延迟(如刷新间隔1秒)可被搜索到。若需强一致性读取,可使用refresh参数使查询前强制刷新索引,但频繁刷新影响性能。
  2. 版本控制:文档有版本号,更新操作基于版本号进行乐观锁控制。更新时若版本号不一致,更新失败,需重新读取最新版本后再尝试更新,防止并发更新冲突。

6. Elasticsearch的集群健康状态有哪些,各代表什么?

集群健康状态通过/_cluster/healthAPI获取,有三种:

  • 绿色(Green):最佳状态,所有主分片和副本分片均正常运行,数据完整且可正常读写,集群性能良好。
  • 黄色(Yellow):部分副本分片未分配,但所有主分片可用。此时数据可读写,集群仍能正常工作,但存在数据丢失风险,如主分片所在节点故障,因无可用副本,该主分片数据丢失。常见原因是磁盘空间不足、节点故障未恢复等导致副本分片无法分配。
  • 红色(Red):部分主分片未分配,数据丢失风险高。此时部分数据不可读,写入操作也可能受影响(若写入涉及未分配主分片)。需立即排查,如节点故障、网络问题、分片分配策略错误等,尽快恢复主分片,否则数据完整性和可用性受严重威胁。

7. 如何优化Elasticsearch的查询性能?

可从多方面优化:

索引设计

  1. 合理分片:依据数据量、查询负载确定分片数。数据量小、查询简单,分片数不宜过多;数据量大且查询复杂,适当增加分片提升并行处理能力,但分片过多增加管理开销与查询协调成本。
  2. 字段映射:准确设置字段数据类型,如无需分词的字符串设为keyword类型,避免不必要分词,提高查询效率;对频繁查询字段创建合适索引,如前缀索引用于模糊查询优化。

查询语句

  1. 避免复杂查询:减少使用通配符(wildcard)查询,尤其前置通配符(如*keyword),因需扫描大量文档,性能极差;避免大规模terms查询(成百上千个terms),可分批查询或优化数据结构减少terms数量。
  2. 利用缓存:使用过滤器(filter)替代查询(query)子句进行可缓存条件过滤,如时间范围、固定值匹配等,利用过滤器缓存提升重复查询性能。

硬件与集群配置

  1. 硬件升级:增加内存,提升缓存数据能力,减少磁盘I/O;使用高速磁盘(如SSD),加快数据读写速度。
  2. 集群调优:合理设置节点角色,分离主节点、数据节点、协调节点功能,避免资源竞争;调整集群参数,如thread_pool线程池大小、bulk批量处理大小等,适应业务负载。

8. Elasticsearch中更新和删除文档的过程是怎样的?

更新文档

  1. 逻辑删除与新增:Elasticsearch中文档不可变,更新操作实际是先逻辑删除旧版本,再插入新版本。客户端发送更新请求,协调节点路由至对应主分片所在数据节点。
  2. 版本控制:主分片依据文档版本号检查更新冲突。若版本匹配,删除旧文档(标记为已删除,实际在段合并时清理),插入新文档,同时更新操作记录到Translog,再同步到副本分片。若版本不一致,更新失败,客户端需重新获取最新版本后重试。

删除文档

  1. 标记删除:客户端发送删除请求至协调节点,协调节点路由到主分片所在数据节点。主分片标记文档为已删除状态,记录删除操作到Translog,异步同步到副本分片。文档并非立即从磁盘删除,而是在段合并时,被标记删除的文档不再复制到新段,从而被清理。

9. Elasticsearch的聚合(Aggregation)功能如何使用,有哪些常见类型?

聚合用于对数据分组和统计,类似SQL的GROUP BY。使用时,在查询语句aggs字段定义聚合。常见聚合类型:

  • 桶聚合(Bucket Aggregation):依据条件将文档分组,如terms聚合按字段值分组,统计每个值出现的文档数量。查询语句:
{
    "aggs": {
        "group_by_status": {
            "terms": {
                "field": "status"
            }
        }
    }
}

上述语句按status字段值对文档分组,返回每个status值及对应文档数量。

  • 度量聚合(Metric Aggregation):对文档字段进行统计计算,如avg求平均值、sum求和、max求最大值等。查询语句:
{
    "aggs": {
        "avg_price": {
            "avg": {
                "field": "price"
            }
        }
    }
}

该语句计算price字段的平均值。

  • 管道聚合(Pipeline Aggregation):基于其他聚合结果进行二次聚合,如derivative计算聚合结果的导数,用于分析数据变化趋势。

10. Elasticsearch是如何实现master选举的?

Elasticsearch通过ZenDiscovery模块进行主节点选举,流程如下:

  1. 候选节点确定:配置node.master: true的节点成为候选主节点。
  2. 节点排序:每个候选主节点启动时,将自己已知的候选主节点按nodeId字典序排序。
  3. 初步选举:各候选主节点从排序后的节点列表中选取第一个节点,暂认为其是主节点。
  4. 投票确认:每个候选主节点向其他节点发送投票请求,若某个候选主节点获得超过discovery.zen.minimum_master_nodes(一般设置为候选主节点数的n/2 + 1)个节点投票,且自身也投票给自己,则该节点当选为master节点。若选举未成功(如投票未达阈值),重新开始选举,直至选出主节点。

主节点负责集群管理,如创建索引、分配分片、跟踪节点状态等,选举过程确保集群在不同网络、节点故障等情况下能选出稳定、唯一的主节点,保障集群正常运行。