????????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) | 合并小段 + 刪除失效文檔 | 優化查詢性能與存儲效率 |
????????注?:副本分片同步失敗時,主分片會重試或報告錯誤;若主分片故障,副本分片將晉升為新主分片繼續服務。