99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

elasticsearch檢索原理與優(yōu)化案例

工程師鄧生 ? 來源:博客園 ? 作者:mikevictor ? 2022-09-30 17:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

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

實(shí)現(xiàn)參考,少走些彎路,在此篇幅中偏重于ES的優(yōu)化,關(guān)于HBase,Hadoop的設(shè)計(jì)優(yōu)化估計(jì)有很多文章可以參考,不再贅述。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

二、需求說明

項(xiàng)目背景:

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

改進(jìn)版本目標(biāo):

數(shù)據(jù)能跨月查詢,并且支持1年以上的歷史數(shù)據(jù)查詢與導(dǎo)出。

按條件的數(shù)據(jù)查詢秒級返回。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

三、elasticsearch檢索原理

3.1 關(guān)于ES和Lucene基礎(chǔ)結(jié)構(gòu)

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

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

一些基本概念:

Cluster 包含多個(gè)Node的集群

Node 集群服務(wù)單元

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

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

Document 最基礎(chǔ)的可被索引的數(shù)據(jù)單元,如一個(gè)JSON串

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

Replicas 分片備份,用于保障數(shù)據(jù)安全與分擔(dān)檢索壓力

ES依賴一個(gè)重要的組件Lucene,關(guān)于數(shù)據(jù)結(jié)構(gòu)的優(yōu)化通常來說是對Lucene的優(yōu)化,它是集群的一個(gè)存儲(chǔ)于檢索工作單元,結(jié)構(gòu)如下圖:

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

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

一個(gè)Lucene索引包含多個(gè)segments,一個(gè)segment包含多個(gè)文檔,每個(gè)文檔包含多個(gè)字段,每個(gè)字段經(jīng)過分詞后形成一個(gè)或多個(gè)term。

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

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

3.2 Lucene索引實(shí)現(xiàn)

Lucene 索引文件結(jié)構(gòu)主要的分為:詞典、倒排表、正向文件、DocValues等,如下圖:

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

注:整理來源于lucene官方

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

另外一個(gè)比較消耗性能的是打分流程,不需要?jiǎng)t可屏蔽。

關(guān)于DocValues:

倒排索引解決從詞快速檢索到相應(yīng)文檔ID, 但如果需要對結(jié)果進(jìn)行排序、分組、聚合等操作的時(shí)候則需要根據(jù)文檔ID快速找到對應(yīng)的值。

通過倒排索引代價(jià)缺很高:需迭代索引里的每個(gè)詞項(xiàng)并收集文檔的列里面 token。這很慢而且難以擴(kuò)展:隨著詞項(xiàng)和文檔的數(shù)量增加,執(zhí)行時(shí)間也會(huì)增加。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,原理是通過按列逆轉(zhuǎn)倒排表將(field value ->doc)映射變成(doc -> field value)映射,問題為逐步構(gòu)建時(shí)間長并且消耗大量內(nèi)存,容易造成OOM。

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

3.3 關(guān)于ES索引與檢索分片

ES中一個(gè)索引由一個(gè)或多個(gè)lucene索引構(gòu)成,一個(gè)lucene索引由一個(gè)或多個(gè)segment構(gòu)成,其中segment是最小的檢索域。

數(shù)據(jù)具體被存儲(chǔ)到哪個(gè)分片上:

shard=hash(routing)%number_of_primary_shards

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

如果能明確根據(jù)_routing進(jìn)行數(shù)據(jù)分區(qū),則可減少分片的檢索工作,以提高性能。

四、優(yōu)化案例

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

ES僅提供字段的檢索,僅存儲(chǔ)HBase的Rowkey不存儲(chǔ)實(shí)際數(shù)據(jù)。

實(shí)際數(shù)據(jù)存儲(chǔ)在HBase中,通過Rowkey查詢,如下圖。

一些細(xì)節(jié)優(yōu)化項(xiàng)官方與其他的一些文章都有描述,在此文章中僅提出一些本案例的重點(diǎn)優(yōu)化項(xiàng)。

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

4.1 優(yōu)化索引性能

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

2、多線程寫入 ,寫入線程數(shù)一般和機(jī)器數(shù)相當(dāng),可以配多種情況,在測試環(huán)境通過Kibana觀察性能曲線。

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

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

4、內(nèi)存分配方面 ,很多文章已經(jīng)提到,給系統(tǒng)50%的內(nèi)存給Lucene做文件緩存,它任務(wù)很繁重,所以ES節(jié)點(diǎn)的內(nèi)存需要比較多(比如每個(gè)節(jié)點(diǎn)能配置64G以上最好)。

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

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

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

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

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

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

4.2 優(yōu)化檢索性能

1、關(guān)閉不需要字段的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、關(guān)閉不需要查詢字段的_source功能,不將此存儲(chǔ)僅ES中,以節(jié)省磁盤空間。

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

5、關(guān)于分頁:

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

這種機(jī)制導(dǎo)致越往后分頁獲取的代價(jià)越高,達(dá)到50000條將面臨沉重的代價(jià),默認(rèn)from + size默認(rèn)如下:index.max_result_window :10000

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

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

scroll: 用于大結(jié)果集查詢,缺陷是需要維護(hù)scroll_id

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

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

8、關(guān)于合并被標(biāo)記刪除的記錄,我們設(shè)置為0表示在合并的時(shí)候一定刪除被標(biāo)記的記錄,默認(rèn)應(yīng)該是大于10%才刪除:"merge.policy.expunge_deletes_allowed": "0"。

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

五、性能測試

優(yōu)化效果評估基于基準(zhǔn)測試,如果沒有基準(zhǔn)測試無法了解是否有性能提升,在這所有的變動(dòng)前做一次測試會(huì)比較好。在我們的案例中:

單節(jié)點(diǎn)5千萬到一億的數(shù)據(jù)量測試,檢查單點(diǎn)承受能力。

集群測試1億-30億的數(shù)量,磁盤IO/內(nèi)存/CPU/網(wǎng)絡(luò)IO消耗如何。

隨機(jī)不同組合條件的檢索,在各個(gè)數(shù)據(jù)量情況下表現(xiàn)如何。

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

性能的測試組合有很多,通常也很花時(shí)間,不過作為評測標(biāo)準(zhǔn)時(shí)間上的投入有必要,否則生產(chǎn)出現(xiàn)性能問題很難定位或不好改善。

對于ES的性能研究花了不少時(shí)間,最多的關(guān)注點(diǎn)就是lucene的優(yōu)化,能深入了解lucene原理對優(yōu)化有很大的幫助。

六、生產(chǎn)效果

目前平臺(tái)穩(wěn)定運(yùn)行,幾十億的數(shù)據(jù)查詢100條都在3秒內(nèi)返回,前后翻頁很快,如果后續(xù)有性能瓶頸,可通過擴(kuò)展節(jié)點(diǎn)分擔(dān)數(shù)據(jù)壓力。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • SSD
    SSD
    +關(guān)注

    關(guān)注

    21

    文章

    2984

    瀏覽量

    119614
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    439

    瀏覽量

    20401
  • RBAC
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    10204

原文標(biāo)題:Elasticsearch 億級數(shù)據(jù)檢索性能優(yōu)化案例實(shí)戰(zhàn)

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    單節(jié)點(diǎn)Elasticsearch+Filebeat+Kibana安裝指南

    單節(jié)點(diǎn)Elasticsearch+Filebeat+Kibana安裝指南
    的頭像 發(fā)表于 05-21 11:06 ?373次閱讀
    單節(jié)點(diǎn)<b class='flag-5'>Elasticsearch</b>+Filebeat+Kibana安裝指南

    DevEco Studio AI輔助開發(fā)工具兩大升級功能 鴻蒙應(yīng)用開發(fā)效率再提升

    。 主要實(shí)現(xiàn)技術(shù): (1) 使用大型語言模型(LLM):結(jié)合檢索到的上下文生成回答 (2) 提示工程(Prompt Engineering):通過優(yōu)化提示模板,引導(dǎo)生成模型合理利用檢索結(jié)果。 (3
    發(fā)表于 04-18 14:43

    將NXP RT1166更換為RT1064,可以使用JTAG/SWD存儲(chǔ)和檢索其閃存上的數(shù)據(jù)嗎?

    我在我的項(xiàng)目中使用了 RT1166,但是,其中一個(gè)要求是芯片應(yīng)該具有可被 JTAG/SWD 訪問的內(nèi)部閃存。 RT1166 有,但 RT1064 有 4MB 的內(nèi)部 Flash。 我可以使用 JTAG/SWD 存儲(chǔ)和檢索其閃存上的數(shù)據(jù)嗎?
    發(fā)表于 04-07 06:29

    ??低曃乃汛鎯?chǔ)系列:跨模態(tài)檢索,安防新境界

    ??低曂瞥龅奈乃汛鎯?chǔ)系列產(chǎn)品,引領(lǐng)了安防領(lǐng)域的信息檢索新革命。該產(chǎn)品憑借多模態(tài)大模型技術(shù),實(shí)現(xiàn)了自然語言與視頻圖像的跨模態(tài)信息檢索,將安防錄像回溯帶入了全新的智能時(shí)代。 用戶只需輸入一句話或一個(gè)
    的頭像 發(fā)表于 02-18 14:08 ?704次閱讀

    【「基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化」閱讀體驗(yàn)】RAG基本概念

    知識(shí),提升輸出質(zhì)量。 RAG的相關(guān)關(guān)鍵技術(shù)有很多,這里只走馬觀花地看了幾個(gè),總結(jié)如下: 檢索性能優(yōu)化 在向量檢索加速方面,書中提出采用HNSW(Hierarchical Navigable Small
    發(fā)表于 02-08 00:22

    【「基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化」閱讀體驗(yàn)】+第一章初體驗(yàn)

    3降低幻覺風(fēng)險(xiǎn):通過引入權(quán)威數(shù)據(jù)源(如學(xué)術(shù)論文、企業(yè)文檔),RAG為生成過程提供“事實(shí)錨點(diǎn)”,減少模型虛構(gòu)內(nèi)容的可能性。 4輕量化部署:開發(fā)者無需頻繁微調(diào)大模型,僅需優(yōu)化檢索模塊即可提升系統(tǒng)性
    發(fā)表于 02-07 10:42

    華為云 X 實(shí)例部署 Docker 應(yīng)用的性能評測優(yōu)化與實(shí)踐指南

    ? 3.2 使用Docker部署Elasticsearch ? 3.3 使用Docker部署MySQL ? 3.4 使用Docker部署Nginx ? 4. 性能測試與評測標(biāo)準(zhǔn) ? 4.1 資源占用分析
    的頭像 發(fā)表于 01-23 18:03 ?439次閱讀
    華為云 X 實(shí)例部署 Docker 應(yīng)用的性能評測<b class='flag-5'>優(yōu)化</b>與實(shí)踐指南

    【「基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化」閱讀體驗(yàn)】+Embedding技術(shù)解讀

    生成回答。在特定領(lǐng)域或任務(wù)中,可以通過微調(diào)Embedding模型來提高檢索的相關(guān)性和準(zhǔn)確性。Embedding在大模型RAG技術(shù)中發(fā)揮著至關(guān)重要的作用。它不僅實(shí)現(xiàn)了文本向量化,還為信息檢索和文本生成提供了基礎(chǔ)。通過不斷優(yōu)化和迭代
    發(fā)表于 01-17 19:53

    如何在Linux環(huán)境下高效安裝部署和配置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
    的頭像 發(fā)表于 01-16 11:49 ?1039次閱讀

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

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

    構(gòu)建高效搜索解決方案,Elasticsearch &amp; Kibana 的完美結(jié)合

    前言 構(gòu)建高效搜索解決方案,F(xiàn)lexusX 服務(wù)器與 Elasticsearch & Kibana 的完美結(jié)合,為企業(yè)帶來云端搜索新體驗(yàn)。FlexusX 實(shí)例以其卓越性能與靈活擴(kuò)展性,確保高并發(fā)搜索
    的頭像 發(fā)表于 12-27 13:48 ?398次閱讀
    構(gòu)建高效搜索解決方案,<b class='flag-5'>Elasticsearch</b> &amp; Kibana 的完美結(jié)合

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

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

    Elasticsearch 再次開源

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

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

    希望在AD軟件中打開工作區(qū)的時(shí)候,工作區(qū)內(nèi)的文件夾能顯示,文件可以按照文件夾檢索,如果工作區(qū)內(nèi)PCB項(xiàng)目很多,不能區(qū)分文件夾,不方便訪問
    發(fā)表于 11-01 11:15

    軟件系統(tǒng)的數(shù)據(jù)檢索設(shè)計(jì)

    軟件系統(tǒng)的數(shù)據(jù)檢索設(shè)計(jì) 隨著業(yè)務(wù)量加大,數(shù)據(jù)檢索量也會(huì)日益增多,為了減輕數(shù)據(jù)庫壓力,本系統(tǒng)采用ElasticSearch來實(shí)現(xiàn)數(shù)據(jù)檢索功能。 簡單來說,
    的頭像 發(fā)表于 08-22 14:08 ?493次閱讀
    軟件系統(tǒng)的數(shù)據(jù)<b class='flag-5'>檢索</b>設(shè)計(jì)