MST
星途 面试题库

面试题:ElasticSearch中Index请求的核心流程简述

请详细描述ElasticSearch中Index请求从客户端发起,到最终数据持久化存储的核心流程,包括涉及到的主要组件和步骤。
21.9万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

1. 客户端发起请求

  • 客户端通过RESTful API向Elasticsearch集群中的某个节点发送Index请求,请求中包含要索引的文档数据以及相关的元数据(如索引名、类型名、文档ID等)。

2. 协调节点处理

  • 接收请求:请求首先到达集群中的一个节点,该节点作为协调节点(Coordinating Node)接收请求。
  • 路由计算:协调节点根据请求中的索引名和文档ID,使用一致性哈希算法计算出该文档应该存储在哪个分片(Shard)上。Elasticsearch中的每个索引由一个或多个主分片(Primary Shard)和零个或多个副本分片(Replica Shard)组成。计算得出的分片可能是主分片,也可能是副本分片,但写操作只会被路由到主分片。

3. 主分片处理

  • 接收请求:协调节点将请求转发到负责该主分片的节点。
  • 写入内存缓冲区:主分片所在节点接收到请求后,首先将文档写入内存中的索引缓冲区(Index Buffer),此时文档处于未提交状态。在内存缓冲区中,文档会进行词法分析、倒排索引构建等操作。
  • 写入事务日志:同时,文档也会被写入到事务日志(Transaction Log,也叫Write-Ahead Log,WAL)中,事务日志用于保证数据的持久性,防止数据丢失。事务日志是顺序写入的,效率较高。

4. 刷新操作

  • 定期刷新:Elasticsearch默认每隔1秒(可配置)执行一次刷新(Refresh)操作。在刷新时,内存缓冲区中的数据会被写入到一个新的段(Segment)文件中,段是Lucene底层存储数据的基本单元。此时,数据在索引中变为可搜索状态,但还未持久化到磁盘。
  • 段合并:随着时间推移和写入操作的不断进行,会产生多个小段文件。Elasticsearch会在后台自动执行段合并(Segment Merge)操作,将多个小段合并成一个大段,以减少文件数量,提高搜索性能。合并操作会涉及读取多个小段的数据并重新写入一个大段,这个过程会消耗I/O资源。

5. 提交操作

  • 定期提交:Elasticsearch会定期(默认30分钟,可配置)或在事务日志达到一定大小时执行提交(Commit)操作。在提交时,内存中的数据会被刷写到磁盘上的段文件中,同时更新提交点(Commit Point),记录当前已提交的段文件列表。事务日志也会被清空,因为其中的数据已经持久化到磁盘。

6. 副本分片复制

  • 同步数据:主分片完成数据写入和相关操作后,会将数据复制到对应的副本分片上。副本分片所在节点接收数据后,同样会经历写入内存缓冲区、刷新、提交等类似主分片的操作流程,以确保副本分片的数据与主分片一致。这样做是为了提供数据冗余和高可用性,当主分片所在节点出现故障时,副本分片可以提升为主分片继续提供服务。

7. 响应客户端

  • 返回结果:当主分片和所有副本分片都成功写入数据后,协调节点会向客户端返回成功响应。如果在任何阶段出现错误,协调节点会返回相应的错误信息给客户端。