Elasticsearch 索引过程全解析:从写入到持久化的完整流程
Elasticsearch 的索引过程(文档写入、存储与检索)是其核心能力,涉及分片路由、内存缓冲、持久化机制、分段管理等多个环节。理解这一过程有助于优化写入性能、保障数据安全,并解释 “准实时搜索” 等特性的底层原理。
数据写入:分片路由机制
文档写入 Elasticsearch 时,首先需要确定存储到哪个主分片(副本分片仅用于同步和容错,不直接接收写入)。
分片路由公式
分片的分配通过以下公式计算:
1 | shard = hash(routing) % number_of_primary_shards |
routing:路由键,默认是文档的_id,也可在写入时通过routing参数自定义(如按用户 ID 路由,确保同一用户的文档在同一分片)。number_of_primary_shards:索引的主分片数量(创建后不可修改)。
示例:若索引有 3 个主分片,某文档 _id=123,则 hash(123) % 3 计算结果为 0、1 或 2,对应写入的主分片。
写入流程(协调节点与主 / 副本分片)
- 请求接收:客户端向任意节点(协调节点)发送写入请求。
- 路由计算:协调节点通过上述公式确定目标主分片,并转发请求到该主分片所在的节点。
- 主分片写入:主分片节点写入文档,成功后同步请求到所有副本分片。
- 响应确认:所有副本分片写入成功后,主分片节点向协调节点返回 “成功” 响应,最终反馈给客户端。
索引文档:从内存到磁盘的流转
文档写入主分片后,并非直接持久化到磁盘,而是经历 “内存缓冲→文件系统缓存→磁盘” 的多阶段流转,平衡性能与可靠性。
