色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

elasticsearch檢索原理與優化案例

工程師鄧生 ? 來源:博客園 ? 作者:mikevictor ? 2022-09-30 17:25 ? 次閱讀

一、前言

數據平臺已迭代三個版本,從頭開始遇到很多常見的難題,終于有片段時間整理一些已完善的文檔,在此分享以供所需朋友的

實現參考,少走些彎路,在此篇幅中偏重于ES的優化,關于HBase,Hadoop的設計優化估計有很多文章可以參考,不再贅述。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

二、需求說明

項目背景:

在一業務系統中,部分表每天的數據量過億,已按天分表,但業務上受限于按天查詢,并且DB中只能保留3個月的數據(硬件高配),分庫代價較高。

改進版本目標:

數據能跨月查詢,并且支持1年以上的歷史數據查詢與導出。

按條件的數據查詢秒級返回。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

三、elasticsearch檢索原理

3.1 關于ES和Lucene基礎結構

談到優化必須能了解組件的基本原理,才容易找到瓶頸所在,以免走多種彎路,先從ES的基礎結構說起(如下圖):

e89c4d76-3970-11ed-9e49-dac502259ad0.jpg

一些基本概念:

Cluster 包含多個Node的集群

Node 集群服務單元

Index 一個ES索引包含一個或多個物理分片,它只是這些分片的邏輯命名空間

Type 一個index的不同分類,6.x后只能配置一個type,以后將移除

Document 最基礎的可被索引的數據單元,如一個JSON串

Shards 一個分片是一個底層的工作單元,它僅保存全部數據中的一部分,它是一個Lucence實例 (一個lucene索引最大包含2,147,483,519 (= Integer.MAX_VALUE - 128)個文檔數量)

Replicas 分片備份,用于保障數據安全與分擔檢索壓力

ES依賴一個重要的組件Lucene,關于數據結構的優化通常來說是對Lucene的優化,它是集群的一個存儲于檢索工作單元,結構如下圖:

e8d7e336-3970-11ed-9e49-dac502259ad0.jpg

在Lucene中,分為索引(錄入)與檢索(查詢)兩部分,索引部分包含 分詞器過濾器字符映射器 等,檢索部分包含 查詢解析器 等。

一個Lucene索引包含多個segments,一個segment包含多個文檔,每個文檔包含多個字段,每個字段經過分詞后形成一個或多個term。

通過Luke工具查看ES的lucene文件如下,主要增加了_id和_source字段:

e91f2804-3970-11ed-9e49-dac502259ad0.jpg

3.2 Lucene索引實現

Lucene 索引文件結構主要的分為:詞典、倒排表、正向文件、DocValues等,如下圖:

e93e9a68-3970-11ed-9e49-dac502259ad0.jpge98bfaf6-3970-11ed-9e49-dac502259ad0.jpg

注:整理來源于lucene官方

Lucene 隨機三次磁盤讀取比較耗時。其中.fdt文件保存數據值損耗空間大,.tim和.doc則需要SSD存儲提高隨機讀寫性能。

另外一個比較消耗性能的是打分流程,不需要則可屏蔽。

關于DocValues:

倒排索引解決從詞快速檢索到相應文檔ID, 但如果需要對結果進行排序、分組、聚合等操作的時候則需要根據文檔ID快速找到對應的值。

通過倒排索引代價缺很高:需迭代索引里的每個詞項并收集文檔的列里面 token。這很慢而且難以擴展:隨著詞項和文檔的數量增加,執行時間也會增加。Solr docs對此的解釋如下:

For other features that we now commonly associate with search, such as sorting, faceting, and highlighting, this approach is not very efficient. The faceting engine,

for example, must look up each term that appears in each document that will make up the result set and pull the document IDs in order to build the facet list. In Solr, this is maintained in memory, and can be slow to load (depending on the number of documents, terms, etc.)

在lucene 4.0版本前通過FieldCache,原理是通過按列逆轉倒排表將(field value ->doc)映射變成(doc -> field value)映射,問題為逐步構建時間長并且消耗大量內存,容易造成OOM。

DocValues是一種列存儲結構,能快速通過文檔ID找到相關需要排序的字段。在ES中,默認開啟所有(除了標記需analyzed的字符串字段)字段的doc values,如果不需要對此字段做任何排序等工作,則可關閉以減少資源消耗。

3.3 關于ES索引與檢索分片

ES中一個索引由一個或多個lucene索引構成,一個lucene索引由一個或多個segment構成,其中segment是最小的檢索域。

數據具體被存儲到哪個分片上:

shard=hash(routing)%number_of_primary_shards

默認情況下 routing參數是文檔ID (murmurhash3),可通過 URL中的 _routing 參數指定數據分布在同一個分片中,index和search的時候都需要一致才能找到數據

如果能明確根據_routing進行數據分區,則可減少分片的檢索工作,以提高性能。

四、優化案例

在我們的案例中,查詢字段都是固定的,不提供全文檢索功能,這也是幾十億數據能秒級返回的一個大前提:

ES僅提供字段的檢索,僅存儲HBase的Rowkey不存儲實際數據。

實際數據存儲在HBase中,通過Rowkey查詢,如下圖。

一些細節優化項官方與其他的一些文章都有描述,在此文章中僅提出一些本案例的重點優化項。

e9bcafde-3970-11ed-9e49-dac502259ad0.jpg

4.1 優化索引性能

1、批量寫入 ,看每條數據量的大小,一般都是幾百到幾千。

2、多線程寫入 ,寫入線程數一般和機器數相當,可以配多種情況,在測試環境通過Kibana觀察性能曲線。

3、增加segments的刷新時間 ,通過上面的原理知道,segment作為一個最小的檢索單元,比如segment有50個,目的需要查10條數據,但需要從50個segment分別查詢10條,共500條記錄,再進行排序或者分數比較后,截取最前面的10條,丟棄490條。

在我們的案例中將此 "refresh_interval": "-1" ,程序批量寫入完成后進行手工刷新(調用相應的API即可)。

4、內存分配方面 ,很多文章已經提到,給系統50%的內存給Lucene做文件緩存,它任務很繁重,所以ES節點的內存需要比較多(比如每個節點能配置64G以上最好)。

5、磁盤方面配置SSD機械盤做陣列RAID5 RAID10雖然看上去很快,但是隨機IO還是SSD好。

6、 使用自動生成的ID ,在我們的案例中使用自定義的KEY,也就是與HBase的ROW KEY,是為了能根據rowkey刪除和更新數據,性能下降不是很明顯。

7、關于段合并 ,合并在后臺定期執行,比較大的segment需要很長時間才能完成,為了減少對其他操作的影響(如檢索),elasticsearch進行閾值限制,默認是20MB/s,

可配置的參數:"indices.store.throttle.max_bytes_per_sec" : "200mb" (根據磁盤性能調整)

合并線程數默認是:Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),

如果是機械磁盤,可以考慮設置為1:index.merge.scheduler.max_thread_count: 1,在我們的案例中使用SSD,配置了6個合并線程。

4.2 優化檢索性能

1、關閉不需要字段的doc values。

2、盡量使用keyword替代一些long或者int之類,term查詢總比range查詢好 (參考lucene說明 )。

http://lucene.apache.org/core/7_4_0/core/org/apache/lucene/index/PointValues.html

3、關閉不需要查詢字段的_source功能,不將此存儲僅ES中,以節省磁盤空間。

4、評分消耗資源,如果不需要可使用filter過濾來達到關閉評分功能,score則為0,如果使用constantScoreQuery則score為1。

5、關于分頁:

from + size: 每分片檢索結果數最大為 from + size,假設from = 20, size = 20,則每個分片需要獲取20 * 20 = 400條數據,多個分片的結果在協調節點合并(假設請求的分配數為5,則結果數最大為 400*5 = 2000條) 再在內存中排序后然后20條給用戶。

這種機制導致越往后分頁獲取的代價越高,達到50000條將面臨沉重的代價,默認from + size默認如下:index.max_result_window :10000

search_after: 使用前一個分頁記錄的最后一條來檢索下一個分頁記錄

在我們的案例中,首先使用from+size,檢索出結果后再使用search_after,在頁面上我們限制了用戶只能跳5頁,不能跳到最后一頁。

scroll: 用于大結果集查詢,缺陷是需要維護scroll_id

6、關于排序:我們增加一個long字段,它用于存儲時間和ID的組合(通過移位即可),正排與倒排性能相差不明顯。

7、關于CPU消耗,檢索時如果需要做排序則需要字段對比,消耗CPU比較大,如果有可能盡量分配16cores以上的CPU,具體看業務壓力。

8、關于合并被標記刪除的記錄,我們設置為0表示在合并的時候一定刪除被標記的記錄,默認應該是大于10%才刪除:"merge.policy.expunge_deletes_allowed": "0"。

{
"mappings":{
"data":{
"dynamic":"false",
"_source":{
"includes":["XXX"]--僅將查詢結果所需的數據存儲僅_source中
},
"properties":{
"state":{
"type":"keyword",--雖然state為int值,但如果不需要做范圍查詢,盡量使用keyword,因為int需要比keyword增加額外的消耗。
"doc_values":false--關閉不需要字段的doc values功能,僅對需要排序,匯聚功能的字段開啟。
},
"b":{
"type":"long"--使用了范圍查詢字段,則需要用long或者int之類(構建類似KD-trees結構)
}
}
}
},
"settings":{......}
}

五、性能測試

優化效果評估基于基準測試,如果沒有基準測試無法了解是否有性能提升,在這所有的變動前做一次測試會比較好。在我們的案例中:

單節點5千萬到一億的數據量測試,檢查單點承受能力。

集群測試1億-30億的數量,磁盤IO/內存/CPU/網絡IO消耗如何。

隨機不同組合條件的檢索,在各個數據量情況下表現如何。

另外SSD與機械盤在測試中性能差距如何。

性能的測試組合有很多,通常也很花時間,不過作為評測標準時間上的投入有必要,否則生產出現性能問題很難定位或不好改善。

對于ES的性能研究花了不少時間,最多的關注點就是lucene的優化,能深入了解lucene原理對優化有很大的幫助。

六、生產效果

目前平臺穩定運行,幾十億的數據查詢100條都在3秒內返回,前后翻頁很快,如果后續有性能瓶頸,可通過擴展節點分擔數據壓力。


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SSD
    SSD
    +關注

    關注

    21

    文章

    2907

    瀏覽量

    118280
  • 過濾器
    +關注

    關注

    1

    文章

    434

    瀏覽量

    19843
  • RBAC
    +關注

    關注

    0

    文章

    44

    瀏覽量

    10020

原文標題:Elasticsearch 億級數據檢索性能優化案例實戰

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    海康威視文搜存儲系列:跨模態檢索,安防新境界

    海康威視推出的文搜存儲系列產品,引領了安防領域的信息檢索新革命。該產品憑借多模態大模型技術,實現了自然語言與視頻圖像的跨模態信息檢索,將安防錄像回溯帶入了全新的智能時代。 用戶只需輸入一句話或一個
    的頭像 發表于 02-18 14:08 ?223次閱讀

    【「基于大模型的RAG應用開發與優化」閱讀體驗】RAG基本概念

    知識,提升輸出質量。 RAG的相關關鍵技術有很多,這里只走馬觀花地看了幾個,總結如下: 檢索性能優化 在向量檢索加速方面,書中提出采用HNSW(Hierarchical Navigable Small
    發表于 02-08 00:22

    【「基于大模型的RAG應用開發與優化」閱讀體驗】+第一章初體驗

    3降低幻覺風險:通過引入權威數據源(如學術論文、企業文檔),RAG為生成過程提供“事實錨點”,減少模型虛構內容的可能性。 4輕量化部署:開發者無需頻繁微調大模型,僅需優化檢索模塊即可提升系統性
    發表于 02-07 10:42

    華為云 X 實例部署 Docker 應用的性能評測優化與實踐指南

    ? 3.2 使用Docker部署Elasticsearch ? 3.3 使用Docker部署MySQL ? 3.4 使用Docker部署Nginx ? 4. 性能測試與評測標準 ? 4.1 資源占用分析
    的頭像 發表于 01-23 18:03 ?164次閱讀
    華為云 X 實例部署 Docker 應用的性能評測<b class='flag-5'>優化</b>與實踐指南

    【「基于大模型的RAG應用開發與優化」閱讀體驗】+Embedding技術解讀

    生成回答。在特定領域或任務中,可以通過微調Embedding模型來提高檢索的相關性和準確性。Embedding在大模型RAG技術中發揮著至關重要的作用。它不僅實現了文本向量化,還為信息檢索和文本生成提供了基礎。通過不斷優化和迭代
    發表于 01-17 19:53

    如何在Linux環境下高效安裝部署和配置Elasticsearch

    /CentOS-7-x86_64-DVD-2009.iso elasticsearch-7.10.0-linux-x86_64.tar.gz https://www.elastic.co/cn/downloads/past-releases
    的頭像 發表于 01-16 11:49 ?423次閱讀

    在華為云上通過 Docker 容器部署 Elasticsearch 并進行性能評測

    ? 2.2 安裝 Docker ? 2.3 啟動 Docker ? 3. 使用Docker部署Elasticsearch ? 3.1 拉取Elasticsearch鏡像 ? 3.2 啟動
    的頭像 發表于 01-13 13:36 ?171次閱讀
    在華為云上通過 Docker 容器部署 <b class='flag-5'>Elasticsearch</b> 并進行性能評測

    構建高效搜索解決方案,Elasticsearch &amp; Kibana 的完美結合

    前言 構建高效搜索解決方案,FlexusX 服務器與 Elasticsearch & Kibana 的完美結合,為企業帶來云端搜索新體驗。FlexusX 實例以其卓越性能與靈活擴展性,確保高并發搜索
    的頭像 發表于 12-27 13:48 ?161次閱讀
    構建高效搜索解決方案,<b class='flag-5'>Elasticsearch</b> &amp; Kibana 的完美結合

    浪潮信息發布“源”Yuan-EB助力RAG檢索精度新高

    近日,浪潮信息發布 “源”Yuan-EB(Yuan-embedding-1.0,嵌入模型),在C-MTEB榜單中斬獲檢索任務第一名,以78.41的平均精度刷新大模型RAG檢索最高成績,將基于元腦企
    的頭像 發表于 11-26 13:54 ?308次閱讀
    浪潮信息發布“源”Yuan-EB助力RAG<b class='flag-5'>檢索</b>精度新高

    Elasticsearch 再次開源

    Elasticsearch 和 Kibana 又可以被稱為開源了。很難表達這句話讓我有多高興。我激動得簡直要跳起來了。我們 Elastic 的所有人都是如此。開源是我的 DNA。這也是Elastic的DNA。能夠再次將 Elasticsearch 稱為開源,我感到非常高興
    的頭像 發表于 11-13 12:14 ?226次閱讀
    <b class='flag-5'>Elasticsearch</b> 再次開源

    AD軟件打開DigIPCBA工作區,希望可以按照文件夾檢索

    希望在AD軟件中打開工作區的時候,工作區內的文件夾能顯示,文件可以按照文件夾檢索,如果工作區內PCB項目很多,不能區分文件夾,不方便訪問
    發表于 11-01 11:15

    軟件系統的數據檢索設計

    軟件系統的數據檢索設計 隨著業務量加大,數據檢索量也會日益增多,為了減輕數據庫壓力,本系統采用ElasticSearch來實現數據檢索功能。 簡單來說,
    的頭像 發表于 08-22 14:08 ?342次閱讀
    軟件系統的數據<b class='flag-5'>檢索</b>設計

    mdk5添加頭文件路徑檢索不出來文件是怎么回事?

    mdk5添加頭文件路徑檢索不出來文件
    發表于 05-29 07:39

    微軟應用商店無法下載內容,錯誤顯示“信息檢索中”

    用戶反映只要試圖啟動微軟應用商店并進行應用安裝操作時,頁面便立即顯示“正在從微軟應用商店檢索信息”的提示,但是此過程可能會長達數小時之久。
    的頭像 發表于 05-14 09:44 ?754次閱讀

    什么是RAG,RAG學習和實踐經驗

    高級的RAG能很大程度優化原始RAG的問題,在索引、檢索和生成上都有更多精細的優化,主要的優化點會集中在索引、向量模型優化
    的頭像 發表于 04-24 09:17 ?1299次閱讀
    什么是RAG,RAG學習和實踐經驗

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 亚洲精品久久午夜麻豆 | 美国色情三级欧美三级纸匠情挑 | 久久电影院久久国产 | 久爱在线中文在观看 | 一边吃奶一边啪啪真舒服 | 久久久视频2019午夜福利 | 热综合一本伊人久久精品 | 四虎国产精品免费观看视频 | 偷窥美女3 | 国产成人刺激视频在线观看 | 最近更新2019中文字幕免费 | 亚洲精品AV中文字幕在线 | 5G在线观看免费年龄确认18 | AV多人爱爱XXx | 国内高清在线观看视频 | 凹凸精品视频分类视频 | 女人被躁到高潮嗷嗷叫免费 | 好吊妞国产欧美日韩视频 | a级全黄试频试看30分钟 | 91精品国产高清久久久久久 | 性xxx免费视频 | 秋霞午夜一级理论片久久 | 亚洲精品国产高清嫩草影院 | 99在线精品国自产拍 | 亚洲视频在线免费观看 | 亚洲在线视频自拍精品 | 熟女理发厅| 亚洲视频欧美在线专区 | 免费看毛片网 | 综合精品欧美日韩国产在线 | 高H短篇辣肉纯肉 | 男女床上黄色 | 久久爱狠狠综合网 | chinesetoilet美女沟 | 国产传媒18精品A片在线观看 | 6080yy亚洲久久无码 | 伊人精品久久久大香线蕉99 | 成人精品视频在线 | 久久精品国产免费中文 | 男人一进一出桶女人视频 | 男人一进一出桶女人视频 |