Elasticsearch索引機制與Lucene段合并策略深度解析

引言

在現代分布式搜索引擎Elasticsearch中,文檔的索引、更新和刪除操作不僅是用戶交互的核心入口,更是底層存儲架構設計的關鍵挑戰。本文圍繞以下核心鏈路展開:

  1. 文檔生命周期管理:從客戶端請求路由到分片定位,從內存緩沖區(Buffer)到事務日志(Translog)的雙重寫入機制,揭示數據持久化的完整路徑;
  2. 實時性與可靠性平衡:通過剖析Translog同步/異步刷盤策略、內存緩沖區刷新(Refresh)與持久化刷盤(Flush)的觸發邏輯,解讀搜索可見性與故障恢復的底層保障;
  3. Lucene段合并優化:深入對比分層合并(TieredMergePolicy)、字節大小合并(LogByteSizeMergePolicy)和文檔數量合并(LogDocMergePolicy)等策略,探討如何通過段合并提升查詢效率、釋放磁盤空間并優化I/O負載。

通過系統性梳理,本文將為開發者提供從API操作到底層存儲的全視角技術圖譜,助力高性能搜索服務的設計與調優。

索引文檔的過程

索引文檔:將新的文檔添加到索引中或者覆蓋已經存在的文檔。

并非只有協調節點可能進行數據轉發,可以將請求發送到任何一個數據節點,該節點都可以處理請求或將請求轉發給適當的節點以完成請求處理。

  1. 客戶端向 Node 1 (任意一個節點)發送新建、覆蓋請求。
  2. 節點使用文檔ID(文檔ID可以人工指定,不指定將自動創建唯一值) 確定文檔屬于分片 0(hash(_id)%number_of_primary_shards) 。請求會被轉發到 Node 3,因為分片 0 的主分片目前被分配在 Node 3 上。
  3. Node 3 寫入操作不僅保存在內存緩沖區中,同時也被記錄到事務日志(Translog)中。Translog是一個位于磁盤上的追加日志,它記錄了所有對索引的更改,以確保在發生故障時能夠恢復數據。
  4. 當內存緩沖區達到一定大小,或者Translog達到一定大小時。Flush操作會將內存緩沖區中的數據以及Translog中的更改持久化到磁盤上的Lucene索引文件的Segment中,并且會清空舊的Translog。

number_of_primary_shards:索引的主分片數量。

更新和刪除文檔的過程

  1. 客戶端向任意節點發送更新、刪除請求,協調節點并根據文檔ID確定要更新的分片(Shard),將請求轉發到分片的主節點上。
  2. 主分片會創建一個新的文檔,保留相同的文檔ID和一個更高的版本號。同時在段對應的.del文件中記錄舊版本的文檔。(更新文檔)
  3. 在段對應的.del文件中記錄舊版本的文檔。(刪除文檔)
  4. 修改操作不僅保存在內存緩沖區中,同時也被記錄到事務日志(Translog)中。Translog是一個位于磁盤上的追加日志,它記錄了所有對索引的更改,以確保在發生故障時能夠恢復數據。
  5. 當內存緩沖區達到一定大小,或者Translog達到一定大小時。Flush操作會將內存緩沖區中的數據以及Translog中的更改持久化到磁盤上的Lucene索引文件的Segment中,并且會清空舊的Translog。
  6. 廢棄的文檔由后臺線程在段合并階段進行刪除,釋放磁盤空間。

Translog刷盤(Flush)時機

Translog的刷盤:是指將Translog內存中的數據寫入到Translog日志中(磁盤)。

Translog的刷盤方式有兩種:同步(request)和異步(async),index.translog.durability為request表示同步(默認同步),為async表示異步。

同步方式:意味著每次寫操作之后會立即將 Translog 刷新到磁盤。

異步方式:可以通過index.translog.sync_interval(默認5s),當達到配置值時觸發刷盤。

Lucene中的段(Segment)

Segment是物理日志,而TransLog是邏輯日志,在Lucene中,每當有新的文檔被添加時,數據首先寫入內存緩沖區(buffer)。當緩沖區達到一定大小或滿足特定條件時,數據會被刷新到磁盤,形成一個新的段。這個初始段的大小依賴于緩沖區的大小和寫入的文檔數量。多個索引的修改都會被分開寫入多個段中。

Lucene中的段生成

只有生成Luence段之后,才能被搜索到。

refresh操作:index.refresh_interval(默認1s),可以適當調大例如30s。定時將內存緩沖區數據寫入到新的Lucene段文件中,不會清空translog。

flush操作:當translog大小達到index.translog.flush_threshold_size(默認512m),會將translog中的數據寫入到磁盤上的 Lucene 段文件中,并創建一個新的 translog 文件,并清空舊的translog。

Lucene中的段合并

段合并的好處

  1. 提高查詢效率:多個小段可能導致查詢時需要訪問多個索引文件,使查詢效率降低。合并段可以減少段的數量,從而減少查詢過程中需要讀取的文件,提高查詢速度。
  2. 釋放磁盤空間:刪除文檔不會立即從段中移除,而是標記為已刪除。通過段合并,可以徹底清除這些標記為刪除的文檔,釋放磁盤空間。

段合并策略

TieredMergePolicy(分層合并策略)

默認段合并策略,根據段的大小和數量將段分為不同的層級(Tiers),并在合適的時機觸發段合并。

通過設置segments_per_tier參數控制每層的最大段數,每層段數超過時觸發合并。通過設置max_merge_at_once參數控制一次合并的最大段數。

通過段的大小對段進行分層。具體來說,它會將段按照大小分為不同的層,每一層中的段大小范圍不同。層的劃分并不是固定的,而是動態調整的。

LogByteSizeMergePolicy(基于字節大小的合并策略)

基于段的字節大小來決定合并。它會嘗試將小段合并成較大的段,以控制合并后的段大小。

通過設置min_merge_size參數控制段合并操作的最小段大小(小于min_merge_size優先合并)。max_merge_size參數控制段合并操作的最大段大小,當段的大小超過這個閾值時,不再參與合并。

LogDocMergePolicy(基于文檔數量的合并策略)

基于段中的文檔數量來決定合并。它會嘗試將包含少量文檔的段合并成包含更多文檔的段。

通過設置min_merge_docs參數控制段合并操作的最小段的文檔數量(小于min_merge_docs優先合并)。和max_merge_docs參數控制段合并操作的最大段的文檔數量,當段的文檔數量超過這個閾值時,不再參與合并。


感謝您的閱讀!如果文章中有任何問題或不足之處,歡迎及時指出,您的反饋將幫助我不斷改進與完善。期待與您共同探討技術,共同進步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82718.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git提交更改

第一步:添加改動 git add . 第二步:提交改動 git commit -m “替換了 SerialPort 庫文件” 第三步:推送到遠程 git push 為什么git 的UI界面做的遠不如SVN

WPF的基礎控件:布局控件(StackPanel DockPanel)

布局控件(StackPanel & DockPanel) 1 StackPanel的Orientation屬性2 DockPanel的LastChildFill3 嵌套布局示例4 性能優化建議5 常見問題排查 在WPF開發中,布局控件是構建用戶界面的基石。StackPanel和DockPanel作為兩種最基礎的布局容器&…

互聯網大廠Java求職面試:AI大模型推理服務性能優化與向量數據庫分布式檢索

互聯網大廠Java求職面試:AI大模型推理服務性能優化與向量數據庫分布式檢索 面試現場:技術總監的連環追問 技術總監:(翻看著簡歷)鄭薪苦,你在上一家公司參與過LLM推理服務的性能優化項目?說說你…

如何解決網站服務器的異常問題?

當網站服務器出現異常情況,導致用戶無法正常訪問網頁信息的時候,該如何解決這一問題呢?小編下面就帶領大家共同探討一下這一問題。 企業在面對網站服務器異常時,首先要對服務器硬件設備進行詳細的檢查,可以使用硬盤檢測…

Day 35

模型可視化與推理 知識點回顧: 三種不同的模型可視化方法:推薦torchinfo打印summary權重分布可視化 進度條功能:手動和自動寫法,讓打印結果更加美觀 推理的寫法:評估模式 模型結構可視化 理解一個深度學習網絡最重要的…

[yolov11改進系列]基于yolov11引入自注意力與卷積混合模塊ACmix提高FPS+檢測效率python源碼+訓練源碼

[ACmix的框架原理] 1.1 ACMix的基本原理 ACmix是一種混合模型,結合了自注意力機制和卷積運算的優勢。它的核心思想是,傳統卷積操作和自注意力模塊的大部分計算都可以通過1x1的卷積來實現。ACmix首先使用1x1卷積對輸入特征圖進行投影,生成一組…

[DS]使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼

使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼 摘要:由于 sample_data.csv 是一個占位符文件,用于代表任意數據集,我將使用 Python 庫中自帶的數據集來實現上述 50 個數據分析和數據可視化程序的示例代碼…

【Python 中 lambda、map、filter 和 reduce】詳細功能介紹及用法總結

以下是 Python 中 lambda、map、filter 和 reduce 的詳細功能介紹及用法總結,涵蓋基礎語法、高頻場景和示例代碼。 一、lambda 匿名函數 功能 用于快速定義一次性使用的匿名函數。不需要顯式命名,適合簡化小規模邏輯。 語法 lambda 參數1, 參數2, ..…

貪心算法——分數背包問題

一、背景介紹 給定𝑛個物品,第𝑖個物品的重量為𝑤𝑔𝑡[𝑖?1]、價值為𝑣𝑎𝑙[𝑖?1],和一個容量為𝑐𝑎&#…

《軟件工程》第 5 章 - 需求分析模型的表示

目錄 5.1需求分析與驗證 5.1.1 順序圖 5.1.2 通信圖 5.1.3 狀態圖 5.1.4 擴充機制 5.2 需求分析的過程模型 5.3 需求優先級分析 5.3.1 確定需求項優先級 5.3.2 排定用例分析的優先順序 5.4 用例分析 5.4.1 精化領域概念模型 5.4.2 設置分析類 5.4.3 構思分析類之間…

基于MATLAB的大規模MIMO信道仿真

1. 系統模型與參數設置 以下是一個單小區大規模MIMO系統的參數配置示例,適用于多發多收和單發單收場景。 % 參數配置 params.N_cell 1; % 小區數量(單小區仿真) params.cell_radius 500; % 小區半徑(米&#xff09…

想查看或修改 MinIO 桶的匿名訪問權限(public/private/custom)

在 Ubuntu 下,如果你想查看或修改 MinIO 桶的匿名訪問權限(public/private/custom),需要使用 mc anonymous 命令而不是 mc policy。以下是詳細操作指南: 1. 查看當前匿名訪問權限 mc anonymous get minio/test輸出示例…

HarmonyOS:相機選擇器

一、概述 相機選擇器提供相機拍照與錄制的能力。應用可選擇媒體類型實現拍照和錄制的功能。調用此類接口時,應用必須在界面UIAbility中調用,否則無法啟動cameraPicker應用。 說明 本模塊首批接口從API version 11開始支持。后續版本的新增接口&#xff0…

牛客AI簡歷篩選:提升招聘效率的智能解決方案

在競爭激烈的人才市場中,企業HR每天需處理海量簡歷,面臨篩選耗時長、標準不統一、誤判率高等痛點。牛客網推出的AI簡歷篩選工具,以“20分鐘處理1000份簡歷、準確率媲美真人HR”的高效表現,成為企業招聘的智能化利器。本文將深度解…

白楊SEO:做AI搜索優化的DeepSeek、豆包、Kimi、百度文心一言、騰訊元寶、通義、智譜、天工等AI生成內容信息采集主要來自哪?占比是多少?

大家好,我是白楊SEO,專注SEO十年以上,全網SEO流量實戰派,AI搜索優化研究者。 在開始寫之前,先說個抱歉。 上周在上海客戶以及線下聚會AI搜索優化分享說各大AI模型的聯網搜索是關閉的,最開始上來確實是的。…

QML與C++交互2

在QML與C的交互中,主要有兩種方式:在C中調用QML的方法和在QML中調用C的方法。以下是具體的實現方法。 在C中調用QML的方法 首先,我們需要在QML文件中定義一個函數,然后在C代碼中調用它。 示例 //QML main.qml文件 import QtQu…

OpenGL Chan視頻學習-8 How I Deal with Shaders in OpenGL

bilibili視頻鏈接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函數網站: docs.gl 說明: 1.之后就不再整理具體函數了,網站直接翻譯會更直觀也…

動態防御新紀元:AI如何重構DDoS攻防成本格局

1. 傳統高防IP的靜態瓶頸與成本困境 傳統高防IP依賴預定義規則庫,面對SYN Flood、CC攻擊等威脅時,常因規則更新滯后導致誤封合法流量。例如,某電商平臺曾因靜態閾值過濾誤封20%的訂單接口流量,直接影響營收。以下代碼模擬傳統方案…

如何實現高性能超低延遲的RTSP或RTMP播放器

隨著直播行業的快速發展,RTSP和RTMP協議成為了廣泛使用的流媒體傳輸協議,尤其是在實時視頻直播領域,如何構建一個高性能超低延遲的直播播放器,已經成為了決定直播平臺成功與否的關鍵因素之一。作為音視頻直播SDK技術老兵&#xff…

UE5 編輯器工具藍圖

文章目錄 簡述使用方法樣例自動生成Actor,并根據模型的包圍盒設置Actor的大小批量修改場景中Actor的屬性,設置Actor的名字,設置Actor到指定的文件夾 簡述 使用編輯器工具好處是可以在非運行時可以對資源或場景做一些操作,例如自動…