京東雲開發者|ElasticSearch降本增效常見的方法

来源:https://www.cnblogs.com/Jcloud/archive/2022/10/31/16843623.html
-Advertisement-
Play Games

Elasticsearch在db_ranking 的排名又(雙叒叕)上升了一位,如圖1-1所示;由此可見es在存儲領域已經蔚然成風且占有非常重要的地位。隨著Elasticsearch越來越受歡迎,企業花費在ES建設上的成本自然也不少。那如何減少ES的成本呢?今天我們就特地來聊聊ES降本增效的常見方法... ...


Elasticsearch在db_ranking 的排名又(雙叒叕)上升了一位,如圖1-1所示;由此可見es在存儲領域已經蔚然成風且占有非常重要的地位。

隨著Elasticsearch越來越受歡迎,企業花費在ES建設上的成本自然也不少。那如何減少ES的成本呢?今天我們就特地來聊聊ES降本增效的常見方法:

  • 彈性伸縮
  • 分級存儲
  • 其他:(1)數據壓縮(2)off heap

圖 1-1 Elasticsearch db_ranking

1 彈性伸縮

所謂彈性伸縮翻譯成大白話就是隨時快速瘦身與增肥,並且是頭痛醫頭,按需動態調整資源。當計算能力不足的時候我們可以快速擴充出計算資源;當存儲資源不足時,能夠快速擴容磁碟。

1-1 計算存儲分離

ES使用計算存儲分離架構之後,解決了資源預留而造成資源浪費的問題。在早期大家認為的計算存儲分離的實現方式為:使用雲盤代替本地盤,這種實現方式可以提高數據的可靠性、可以快速彈擴磁碟資源和計算資源,但是es自身彈性需求是無法解決,即秒級shard搬遷和replica擴容

那麼如何解決es自身的彈性呢?本文該部分將給出答案。

共用存儲版ES

本文該部分將介紹我們京東雲-中間件搜索團隊,研發的共用存儲版本ES;計算存儲分離架構如圖1-2所示

圖 1-2 計算存儲分離架構(共用)

如圖1-2所示,我們只存儲一份數據,primary shard負責讀寫,replica只負責讀;當我們需要擴容replica的時候無需進行數據搬遷,直接跳過原生es的peer recover兩階段,秒級完成replica的彈擴

當主分片發生relocating時,可以直接跳過原生es的peer recover第一階段(該階段最為耗時),同時也不需要原生es的第二階段發送translog。

共用版本的計算存儲分離ES,相對於原生的ES和普通版本的計算存儲分離,具有如下突出的優勢

  • 數據只保存一份,存儲成本倍數級降低
  • 存儲容量按需自動拓展,幾乎無空間浪費
  • 按實際用量計費,無需容量規劃

性能測試

  • 數據集為esrally提供的http_logs
  • 共用版ES7.10.2: 3個data節點(16C64GB)
  • 原生ES7.10.2: 3個data節點(16C64GB)

表 1-1 副本性能測試對比

我們的初步性能測試結果如表1-1所示;副本數越多,共用版本的es越具有優勢;

從表1-1所示我們可以看出性能似乎提升的不是特別理想,目前我們正從兩個方面進行優化提升:

  • 底層依賴的雲海存儲,目前正在有計劃地進行著性能提升
  • 源碼側,我們也在正在優化ing

在研發es計算存儲分離的過程中,我們攻剋了很多的問題,後續將輸出更加詳細的文章進行介紹,比如:主寫副只讀的具體實現replica的訪問近實時問題ES的主分片切換臟寫問題等等。

1-2 外部構建Segment

對於有大量寫入的場景,通常不會持續的高流量寫入,而只有1-2個小時寫入流量洪峰;在寫入過程中最耗費時間的過程並不是寫磁碟而是構建segment,既然構建segment如此耗時,那麼我們是否可以將該部分功能單獨出來,形成一個可快速擴展的資源(避免去直接改動es源碼而引入其他問題)。

目前業界已經有比較好的案例外部構建Segment,相對於共用存儲版的es實現起來更簡單;它的核心解決方案使用了spark或者map reduce這種批處理引擎進行批量計算處理,然後將構建好的segment搬運到對應的索引shard即可。

外部構建segment的功能也在我們的規劃中。

2 分級存儲

ES實現降本增效的另外一個方向:分級存儲,該解決方案主要是針對數據量大查詢少且對查詢耗時不太敏感的業務。分級存儲,比較成熟的解決方案有es冷熱架構和可搜索快照。

2-1 冷熱架構

冷熱架構適用場景:時序型數據或者同一集群中同時存在這兩個索引(一個熱數據,另外一個冷數據)

es冷熱架構架構,該功能已經在京東雲上線有一段時間了,歡迎大家根據自己的業務形態進行試用,冷數據節點開啟如圖2-1所示

圖 2-1 冷數據節點開啟

建議如果索引表是按天/小時,這種周期存儲的數據,且數據查詢具有冷熱性,建議開啟冷節點;開啟冷節點後你可能會獲得如下的收益:

  • 開啟冷節點後可以降低你的存儲成本,因為存放冷節點的索引我們可以選擇減少副本數、冷節點的存儲介質更便宜
  • 集群可以存放更多的數據
  • 冷數據forcemerge,提升冷數據的查詢性能
  • 冷數據從熱節點遷移走之後,減少熱節點的資源占用,從而使熱查詢更快

冷熱架構的核心技術為
shard-allocation-filtering;
冷熱架構實現原理:
es的hot節點增加如下配置

node.attr.box_type: hot   


es的warm節點增加如下配置

node.attr.box_type: warm   


熱數據索引setting增加如下配置,即可限制shard分配在hot節點

"index.routing.allocation.require.box_type": "hot"


當數據查詢減弱,我們通過如下配置,即可使數據由hot節點遷移到warm節點

"index.routing.allocation.require.box_type": "warm"


2-2 可搜索快照

可搜索快照是在冷熱架構的基礎上更進一步的分級存儲,在之前我們將數據快照之後是無法對快照的數據進行搜索,如果要對快照的數據進行搜索,則需將快照數據先restore(restore的過程可能會比較長)之後才能被搜索。

在引入可搜索快照之後,我們可以直接搜索快照中的數據,大大降低了沒必要的資源使用.

3 其他

3-1 數據壓縮

除了從資源的角度進行降低存儲成本之外,基於數據自身的特性,使用優秀的壓縮演算法也是一種必不可少的搜索;針對時序數據facebook開源了一個非常優秀的壓縮演算法zstd,目前已經在業界被大量使用。

表 3-1 三種壓縮演算法的對比測試結果

目前在lucene的代碼庫中也有開源愛好者提交了custom codec providing Zstandard compression/decompression (zstd pr)

3-2 off heap

es單個節點存儲數據量受到jvm堆記憶體的限制,為了使單個節點能夠存儲更多的數據,因此我們需要減少堆記憶體中的數據。

ES 堆中常駐記憶體中占據比重最大是 FST,即 tip(terms index) 文件占據的空間,1TB 索引大約占用2GB 或者更多的記憶體,因此為了節點穩定運行,業界通常認為一個節點 open 的索引不超過5TB。現在,從 ES 7.3版本開始,將 tip 文件修改為通過mmap的方式載入,這使 FST占據的記憶體從堆內轉移到了堆外(即off Heap技術 )由操作系統的 pagecache 管理[6]。

使用esrally官方數據集geonames寫入索引1TB,使用 _cat/segments API 查看 segments.memory記憶體占用量,對比 offheap 後的記憶體占用效果,如表3-2所示;JVM 記憶體占用量降低了78%左右

表 3-2 segments.memory記憶體占用量

4 參考

[1] Indexing Service
[2] ES-Fastloader
[3] 大規模測試新的 Elasticsearch 冷層可搜索快照
[4] Introducing Elasticsearch searchable snapshots
[5] 7.7 版本中的新改進:顯著降低 Elasticsearch 堆記憶體使用量
[6] Elasticsearch 7.3 的 offheap 原理

作者:楊松柏


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 我們經常遠程連接伺服器去查看日誌,比較麻煩,如果直接訪問項目的某個頁面就能實時查看日誌就比較奈斯了,花了1天研究了下.net core 日誌的原理,結合blazor實現了基本效果。 實現原理 自定義日誌提供器,將日誌記錄到記憶體中,滾動10W條刪除。 提供blazor組件,實時從記憶體中讀取後顯示 ...
  • 長連接與短連接 所謂長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做線上維持。 短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,一般銀行都使用短連接。 比如http的, ...
  • Ubuntu20.04 MRS和Makefile開發環境配置. 使用 MounRiver Studio Community IDE 進行開發是比較簡單的一種方式, 前往http://mounriver.com/download下載 MounRiver_Studio_Community_Linux_V... ...
  • 沁恆最近推出的低價CH32V003系列, 基於青稞RISC-V2A內核, 48MHz主頻, 2KB SRAM, 16KB Flash, 工作電壓相容3.3V和5V. Win10下的開發環境是比較簡單的, 軟體就是MounRiver, 版本v1.82, 軟體集成了代碼編輯, 編譯環境和燒錄工具. 直接... ...
  • 一、FlinkSql的概念 核心概念 Flink 的 Table API 和 SQL 是流批統一的 API。 這意味著 Table API & SQL 在無論有限的批式輸入還是無限的流式輸入下,都具有相同的語義。 因為傳統的關係代數以及 SQL 最開始都是為了批式處理而設計的, 關係型查詢在流式場景 ...
  • 搭建mycat 一、準備工作 1、確保jdk已安裝成功,並且jdk版本選用1.7以上版本 2、準備一臺新的主機mysql_mycat放到master的前面做代理 mycat ip 192.168.232.13 3、將三台機器互做本地解析 192.168.232.11 mysql_master 192 ...
  • TablePlus是一款管理開發資料庫的原生應用,它可以幫助您輕鬆編輯資料庫中的數據和結構。TablePlus還包含許多安全功能以更好地保護您的數據安全,包括使用本地libssh和TLS來加密您的連接等。 Mac版詳情:TablePlus for Mac(原生資料庫開發應用) win版詳情:Tabl ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Oozie是一個基於工作流引擎的開源框架,它能夠提供對Hadoop作業的任務調度與協調。Oozie是一個工作流引擎服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...