Elasticsearch 索引文档的流程是一个分布式、多阶段的过程,涉及客户端请求、路由、主副本同步及持久化等步骤,具体流程如下:
一、客户端请求与路由
1.1 文档接收与路由计算
客户端通过 REST API 发送文档写入请求,需指定索引名、文档 ID(可选)及文档内容。
Elasticsearch 根据文档 ID(或自定义 routing 值)哈希计算目标主分片位置。请求被转发到主分片所在的节点(协调节点或直接定位主节点)。
二、主分片写入与副本同步
2.1 主分片处理写入
主分片节点接收到请求后:写入内存缓冲区:数据暂存至节点级内存缓冲区(Indexing Buffer)。
记录事务日志:同时将操作写入分片级事务日志(Translog),确保宕机后可恢复。
2.2 副本分片同步
主分片并行将写入请求转发至所有副本分片所在节点。
副本分片执行相同操作(写入缓冲区 + 记录 Translog),并向主分片返回执行结果。
所有副本分片确认成功后,主分片向客户端返回写入成功响应。
三、数据刷新与持久化
3.1 刷新(Refresh)生成可搜索段
默认每秒触发一次刷新(可配置 refresh_interval):
将内存缓冲区中的数据写入 Lucene 段文件(Segment)。
新段文件打开后,文档立即可被搜索(近实时搜索)。
3.2 事务日志刷盘(Flush)
周期性(默认 30 分钟)或 Translog 达到阈值时:
执行 Lucene Commit,将内存中所有数据持久化到磁盘。
清空 Translog 并创建新日志文件,释放磁盘空间。
四、段合并优化
后台段合并(Merge)
Lucene 自动合并多个小段文件为大段,提升查询性能。
删除已标记删除的文档,回收磁盘空间。
阶段 | 关键操作 | 目标 |
请求路由 | 计算文档所属主分片位置 | 定位写入节点 |
主副同步 | 写入内存缓冲区 + 记录 Translog | 保证数据冗余与一致性 |
刷新(Refresh) | 生成 Lucene 段文件 | 实现近实时搜索 |
刷盘(Flush) | 持久化数据 + 清理 Translog | 确保数据安全存储 |
段合并(Merge) | 合并小段 + 删除失效文档 | 优化查询性能与存储效率 |
注:副本分片同步失败时,主分片会重试或报告错误;若主分片故障,副本分片将晋升为新主分片继续服务。