Elasticsearch 使用誤區之二——頻繁更新文檔

在使用 Elasticsearch 時,頻繁更新文檔是一種常見誤區。這不僅影響性能,還可能導致系統資源的浪費。

理解 Elasticsearch 的文檔更新機制對于優化性能至關重要。

關于 Elasticsearch 更新操作,常見問題如下:

94e641275e580990aea05aa0828a97ed.png

——https://t.zsxq.com/bDxwL

1、頻繁更新的挑戰

在關系型數據庫中,更新操作在事務完成后立即生效,查詢結果可以立刻反映變化。

而在 Elasticsearch 中,更新操作則依賴于刷新(refresh,如下圖標紅部分)過程。這增加了額外的開銷,特別是在頻繁更新的場景下。

91ab16398fd84e4a2b7d2d7f1b5362e8.png

細節參見《一本書講透Elasticsearch》第342-343頁詳細闡釋。

2、文檔更新的步驟

Elasticsearch 更新的本質可以分為以下幾個步驟:

20a204cafe9ff9435b64269d8f38b396.png

1c3afedd122c27daccce43888ff826bc.png

2.1 查找文檔

首先,Elasticsearch 根據請求中的文檔 ID 或查詢條件,在索引中查找需要更新的文檔。

2.2 讀取并更新

找到文檔后,Elasticsearch 會將文檔加載到內存中,并根據請求中的更新內容修改文檔數據。這包括字段的增加、修改或刪除。

2.3 版本控制

Elasticsearch 使用版本號或樂觀鎖定機制,確保并發更新時數據的一致性。每次更新,版本號都會增加,以避免更新沖突。

示例:首次寫入文檔,version是 1。

bb52a5f6ec89160c2cba02baafb0f68b.png

查看索引分段信息如下:

4f19d411694640302506ffa654572e21.png

2.4 重新索引

修改后的文檔并不會直接更新到原位置,而是作為一個新文檔寫入索引。這是因為 Elasticsearch 使用不可變的段文件來存儲數據。

繼續剛才的示例:更新操作執行一次后,截圖如下:_version 由 ?1 變成 2。

e697add162e918e8c5f85534106f070c.png

更新后查看分段:

2bbb82f75e8c33c2a6a870656dab6bec.png

文檔數顯示為1(如下圖),但其實是兩個不同的分段(如上圖)。

6dac4461ce3389b82f78674c2391e6c6.png

2.5 舊文檔標記刪除

原始文檔被標記為刪除。刪除標記會在段合并時清理,以節省存儲空間。

befb3511995253fce746fbfef7f9cdf0.png

在如下示例中,通過 _delete_by_query 可以看到標記刪除的過程。標記的文檔將在段合并時被清理。

3b6781910ec5f8e6b14628017183cea8.png

2.6 刷新與合并

更新完成后,Elasticsearch 定期刷新內存中的變更到磁盤,并合并段文件以優化存儲和查詢性能。

這些步驟確保了 Elasticsearch 在處理更新時的高效性和數據一致性。

更多細節操作參見源碼:

https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/action/update/UpdateHelper.java

3、更新操作的代價

每次更新都涉及到重新索引,而不是簡單的“原地”修改。這會增加磁盤 I/O 和計算資源的使用。

此外,標記為刪除的文檔在段合并前仍然占用空間,增加了存儲負擔。

第二部分的截圖能讓我們進一步理解:為什么越更新文檔存儲占據磁盤空間越大,為什么越刪除文檔存儲占據磁盤越大的原因。

同時,進一步理解,段合并之后,磁盤空間驟降!

4、性能優化建議

4.1. 減少更新頻率

實戰場景:對于用戶行為數據(如瀏覽次數、點贊數),可以合并多次更新為一次批量更新。

  • 建議1:設置一個合理的批量更新間隔,比如每隔 5 分鐘更新一次,而不是每次用戶操作后立即更新。

  • 建議2:使用消息隊列收集用戶操作,定時批量更新。

4.2. 批量處理

實戰場景:在電商平臺中,商品信息的批量更新。

  • 建議:使用 _bulk API 一次性更新多個文檔,減少單次請求的開銷。

實踐參考:

POST?_bulk
{?"update":?{"_id":?"1"}?}
{?"doc":?{"price":?100}?}
{?"update":?{"_id":?"2"}?}
{?"doc":?{"price":?200}?}

4.3. 延遲刷新

實戰場景:日志數據的批量插入場景。

  • 建議:對不需要實時可見性的索引,增加 refresh_interval,比如設置為 30s 或 60s。

實現:

PUT?/my_index/_settings
{"refresh_interval":?"30s"
}

4.4. 合理的索引設計

實戰場景:對于大規模數據的索引設計,避免不必要的字段更新。

  • 建議1:僅索引必要的字段,避免在頻繁更新時更新整個文檔。

PUT?/my_index
{"mappings":?{"properties":?{"title":?{"type":?"text"},"views":?{"type":?"integer",?"index":?false}}}
}
  • 建議2:在設計階段多花時間,考慮建模的充分性,在創建索引時明確指定需要索引的字段。

  • 建議3:能 ingest pipeline 預處理管道或者 logstash filter 中間過濾階段搞定的,咱們就不要拖到實現階段。

e71f4e908a35f48b3c2f9f7a210b9db2.png

83a399138f19ee2b1fb65ac947b9bfdb.png

如下問題的解決方案就是借助:json processor 實現。相比于更新操作,寫入前的預處理非常有必要!

1a93dfc4e6b50c0df16a238706c3a87b.png

5、結論

頻繁更新文檔是 Elasticsearch 使用中的一個常見誤區。

理解其更新機制和潛在開銷是進行系統優化的關鍵。通過減少更新頻率、使用批量處理、延遲刷新等策略,可以顯著提高系統的性能和資源利用率。Elasticsearch 的強大功能需要合理使用,才能充分發揮其優勢。

希望這篇文章能夠幫助你更好地理解和優化 Elasticsearch 的使用!

參考:

https://betterprogramming.pub/boosting-elasticsearch-cluster-performance-3-proven-tips-9b718a9114bc

https://www.youtube.com/watch?v=gWXkAhnYFYw

Elasticsearch 使用誤區之一——將 Elasticsearch 視為關系數據庫!

Elasticsearch 為什么會產生文檔版本沖突?如何避免?

748d33558fbe1d8669f33a510f773a24.jpeg

更短時間更快習得更多干貨!

和全球2000+?Elastic 愛好者一起精進!

elastic6.cn——ElasticStack進階助手

f7a73b3573aad4b1be626ea8275e19df.gif

比同事搶先一步學習進階干貨!

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

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

相關文章

Spring Cloud實戰:構建分布式系統解決方案

Spring Cloud實戰:構建分布式系統解決方案 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將深入探討如何使用Spring Cloud來構建分布式系統…

剖析DeFi交易產品之UniswapV4:概述篇

本文首發于公眾號:Keegan小鋼 UniswapV4 與 UniswapV3 相比,算法上并沒有什么改變,依然還是采用集中流動性模型,但架構上變化很大,包括功能架構,也包括技術架構。相比之前的版本,UniswapV4 最大…

百元藍牙耳機推薦2024,百元藍牙耳機排行榜盤點

在2024年面對琳瑯滿目的藍牙耳機選項,消費者往往難以抉擇,特別是在預算有限的情況下,如何在眾多產品中挑選出既滿足質量又符合預算的耳機成為了一個不小的挑戰。 為了幫助大家在繁多的選擇中找到真正物有所值的百元藍牙耳機,我們…

UnityUGUI之一:image和Rawimage

image組件的相關屬性 其中SpriteMode,若為單個圖片則為Single,圖片集則為Multiple 圖集的切割 點擊Slice可以進行自動切割 為且每個格子都可以進行單獨的九宮格切割 當圖片被九宮格切割再進行拉伸以后,九宮格的四角不會被拉伸 Tiled&#x…

構建支持多平臺的返利App跨平臺開發策略

構建支持多平臺的返利App跨平臺開發策略 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將討論如何構建支持多平臺的返利App,特別關注跨平臺…

一棵B+樹可以存放多少行數據

以MySQL InnoDB為例。InnoDB存儲引擎最小儲存單元是頁,一頁大小固定是16KB,使用該引擎的表為索引組織表。B樹葉子存的是數據,內部節點存的是鍵值和指針。索引組織表通過非葉子節點的二分查找法以及指針確定數據在哪個頁中,進而再去…

數據治理不再頭疼,篩斗數據為您打造無縫數據處理體驗

在當今數字化時代,數據已成為企業最寶貴的資產之一。然而,隨著數據量的激增和數據來源的多樣化,數據治理成為許多企業面臨的一大挑戰。繁瑣的數據提取、混亂的數據結構和不清晰的數據質量,往往讓企業陷入數據處理的泥潭。幸運的是…

如何在本地一鍵配置最強國產大模型

自從OpenAI的ChatGPT橫空出世以來,國內外各類大語言模型(LLM)層出不窮,其中不乏Google的Gemini、Claude、文心一言等等。相較于競爭激烈的商業模型賽道,以Llama為代表的開源大模型的進步速度也十分驚人。 伴隨著大語言…

CP AUTOSAR標準之MemoryAccess(AUTOSAR_CP_SWS_MemoryAccess)(更新中……)

1 簡介和功能概述 該規范描述了AUTOSAR基礎軟件模塊內存訪問(MemAcc)的功能、API和配置。 ??內存訪問模塊通過基于地址的API提供對不同內存技術設備的訪問。內存訪問模塊始終由一個或多個內存驅動程序(Mem)補充。內存訪問模塊與內存設備技術無關,可與閃存、EEPROM、RAM或相變…

Python Tkinter:開發一款文件加密解密小工具

在這個信息泄露風險日益增加的時代,使用文件加密工具對于保護個人隱私和企業機密至關重要。 本文介紹了一款小工具——encryptDecrypt,它不僅提供了一個易于使用的圖形界面,簡化了加密和解密過程,還確保了數據的安全性&#xff0c…

深入解析 androidx.databinding.BaseObservable

在現代 Android 開發中,數據綁定 (Data Binding) 是一個重要的技術,它簡化了 UI 和數據之間的交互。在數據綁定框架中,androidx.databinding.BaseObservable 是一個關鍵類,用于實現可觀察的數據模型。本文將詳細介紹 BaseObservab…

python-求s=a+aa+aaa+aaaa+aa...a的值(賽氪OJ)

[題目描述] 求 saaaaaaaaaaaa...a 的值,其中 a 是一個一位的整數。 例如 :2222222222222222(此時共有 5 個數相加)。輸入格式: 整數 a 和 n ( n 個數相加)。輸出格式: s 的值。樣例輸入 2 2樣例輸出 24數據…

WSL——忘記root密碼(Ubuntu)

1、問題描述 Windows下的WSL(Ubuntu)忘記了root密碼,無法使用管理員權限。 2、解決方法 關閉 Ubuntu 窗口。打開 Windows 的 Powershell 或 cmd, 以 root 默認登陸 WSL。 wsl -u root 修改對應用戶密碼。 # xxx為要修改密碼的用…

Stable Diffusion【真人模型】:人臉特美的人像攝影大模型wuhaXL_realisticMixV3.0

今天和大家分享一個基于SDXL的真人大模型:wuhaXL_realisticMix。該模型無需使用LORA**就能生成的特別漂亮的人臉,雖然有時候人臉有些假,但是生成的人臉確實非常漂亮。 該模型底模融合了WhiteXL_realisticMix,訓練素材來自于視頻轉…

Dockerfile構建一個包含多個SpringBoot應用程序的鏡像

為什么要使用Dockerfile 構建一個包含多個SpringBoot應用程序的鏡像呢? 1、可移植性:Dockerfile 定義了一個標準化的方式來構建Docker鏡像,意味著無論在哪個系統上(只要它支持Docker), 都可以使用相同的Dockerfile來構建完全相同的…

pytorch統計學分布

1、pytorch統計學函數 import torcha torch.rand(2,2) print(a) print(torch.sum(a, dim0)) print(torch.mean(a, dim0)) print(torch.prod(a, dim0))print(torch.argmax(a, dim0)) print(torch.argmin(a, dim0)) print(torch.std(a)) print(torch.var(a)) print(torch.median…

如何學好AI繪畫?點這里有答案!

前言 地獄難度的求職模式下,“掌握一門技術”的那部分求職者,遠比其他人更有競爭力;而擁有出色技術和技能的設計師、以及未來想做設計師的小伙伴們,怎么才能更好實現工作自由? 只有兩個字:學習。 學習新…

EE trade:白銀什么情況下會暴漲

白銀價格的暴漲通常由多種因素共同作用引發,包括宏觀經濟背景、市場供需變化、地緣政治緊張局勢以及金融市場波動等。本文整理了一些具體情況和實例,說明白銀在什么情況下可能會暴漲。 1. 宏觀經濟因素 通貨膨脹急劇上升 背景:當通貨膨脹急…

電腦怎么錄屏幕視頻帶聲音?2種方法教會你

在數字時代的浪潮中,電腦屏幕視頻錄制已經成為一項潮流且實用的技能。無論是為了創作短視頻、分享游戲過程,還是為了記錄在線會議或教程,電腦錄屏都是非常重要的功能。但是不少的人都會遇上錄制好的視頻沒有聲音的困境,面對這種情…

Jenkins的一些記錄

設置環境變量 在 Jenkins 流水線中,取決于使用的是聲明式還是腳本式流水線,設置環境變量的方法不同。 聲明式流水線支持 environment 指令,而腳本式流水線的使用者必須使用 withEnv 步驟。 pipeline {agent anyenvironment { CC clang}stag…