先自我介紹一下,小編浙江大學畢業(yè),去過華為、字節(jié)跳動等大廠,目前阿里P7
深知大多數(shù)程序員,想要提升技能,往往是自己摸索成長,但自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年最新軟件測試全套學習資料》,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友。
既有適合小白學習的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學習提升的進階課程,涵蓋了95%以上軟件測試知識點,真正體系化!
由于文件比較多,這里只是將部分目錄截圖出來,全套包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、大綱路線、講解視頻,并且后續(xù)會持續(xù)更新
如果你需要這些資料,可以添加V獲?。簐ip1024b (備注軟件測試)
正文
轉(zhuǎn)載自:https://zhuanlan.zhihu.com/p/60458049
面試題
es 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)如何提高查詢效率啊?
面試官心理分析
這個問題是肯定要問的,說白了,就是看你有沒有實際干過 es,因為啥?其實 es 性能并沒有你想象中那么好的。很多時候數(shù)據(jù)量大了,特別是有幾億條數(shù)據(jù)的時候,可能你會懵逼的發(fā)現(xiàn),跑個搜索怎么一下?5~10s
,坑爹了。第一次搜索的時候,是5~10s
,后面反而就快了,可能就幾百毫秒。
你就很懵,每個用戶第一次訪問都會比較慢,比較卡么?所以你要是沒玩兒過 es,或者就是自己玩玩兒 demo,被問到這個問題容易懵逼,顯示出你對 es 確實玩兒的不怎么樣?
面試題剖析
說實話,es 性能優(yōu)化是沒有什么銀彈的,啥意思呢?就是不要期待著隨手調(diào)一個參數(shù),就可以萬能的應對所有的性能慢的場景。也許有的場景是你換個參數(shù),或者調(diào)整一下語法,就可以搞定,但是絕對不是所有場景都可以這樣。
性能優(yōu)化的殺手锏——filesystem cache
你往 es 里寫的數(shù)據(jù),實際上都寫到磁盤文件里去了,查詢的時候,操作系統(tǒng)會將磁盤文件里的數(shù)據(jù)自動緩存到?filesystem cache
?里面去。
es 的搜索引擎嚴重依賴于底層的?filesystem cache
,你如果給?filesystem cache
?更多的內(nèi)存,盡量讓內(nèi)存可以容納所有的?idx segment file
?索引數(shù)據(jù)文件,那么你搜索的時候就基本都是走內(nèi)存的,性能會非常高。
性能差距究竟可以有多大?我們之前很多的測試和壓測,如果走磁盤一般肯定上秒,搜索性能絕對是秒級別的,1秒、5秒、10秒。但如果是走?filesystem cache
,是走純內(nèi)存的,那么一般來說性能比走磁盤要高一個數(shù)量級,基本上就是毫秒級的,從幾毫秒到幾百毫秒不等。
這里有個真實的案例。某個公司 es 節(jié)點有 3 臺機器,每臺機器看起來內(nèi)存很多,64G,總內(nèi)存就是?64 * 3 = 192G
。每臺機器給 es jvm heap 是?32G
,那么剩下來留給?filesystem cache
?的就是每臺機器才?32G
,總共集群里給?filesystem cache
?的就是?32 * 3 = 96G
?內(nèi)存。而此時,整個磁盤上索引數(shù)據(jù)文件,在 3 臺機器上一共占用了?1T
?的磁盤容量,es 數(shù)據(jù)量是?1T
,那么每臺機器的數(shù)據(jù)量是?300G
。這樣性能好嗎??filesystem cache
?的內(nèi)存才 100G,十分之一的數(shù)據(jù)可以放內(nèi)存,其他的都在磁盤,然后你執(zhí)行搜索操作,大部分操作都是走磁盤,性能肯定差。
歸根結(jié)底,你要讓 es 性能要好,最佳的情況下,就是你的機器的內(nèi)存,至少可以容納你的總數(shù)據(jù)量的一半。
根據(jù)我們自己的生產(chǎn)環(huán)境實踐經(jīng)驗,最佳的情況下,是僅僅在 es 中就存少量的數(shù)據(jù),就是你要用來搜索的那些索引,如果內(nèi)存留給?filesystem cache
?的是 100G,那么你就將索引數(shù)據(jù)控制在?100G
?以內(nèi),這樣的話,你的數(shù)據(jù)幾乎全部走內(nèi)存來搜索,性能非常之高,一般可以在 1 秒以內(nèi)。
比如說你現(xiàn)在有一行數(shù)據(jù)。id,name,age ....
?30 個字段。但是你現(xiàn)在搜索,只需要根據(jù)?id,name,age
?三個字段來搜索。如果你傻乎乎往 es 里寫入一行數(shù)據(jù)所有的字段,就會導致說?90%
?的數(shù)據(jù)是不用來搜索的,結(jié)果硬是占據(jù)了 es 機器上的?filesystem cache
?的空間,單條數(shù)據(jù)的數(shù)據(jù)量越大,就會導致?filesystem cahce
?能緩存的數(shù)據(jù)就越少。其實,僅僅寫入 es 中要用來檢索的少數(shù)幾個字段就可以了,比如說就寫入 es?id,name,age
?三個字段,然后你可以把其他的字段數(shù)據(jù)存在 mysql/hbase 里,我們一般是建議用?es + hbase
?這么一個架構(gòu)。
hbase 的特點是適用于海量數(shù)據(jù)的在線存儲,就是對 hbase 可以寫入海量數(shù)據(jù),但是不要做復雜的搜索,做很簡單的一些根據(jù) id 或者范圍進行查詢的這么一個操作就可以了。從 es 中根據(jù) name 和 age 去搜索,拿到的結(jié)果可能就 20 個?doc id
,然后根據(jù)?doc id
?到 hbase 里去查詢每個?doc id
?對應的完整的數(shù)據(jù),給查出來,再返回給前端。
寫入 es 的數(shù)據(jù)最好小于等于,或者是略微大于 es 的 filesystem cache 的內(nèi)存容量。然后你從 es 檢索可能就花費 20ms,然后再根據(jù) es 返回的 id 去 hbase 里查詢,查 20 條數(shù)據(jù),可能也就耗費個 30ms,可能你原來那么玩兒,1T 數(shù)據(jù)都放 es,會每次查詢都是 5~10s,現(xiàn)在可能性能就會很高,每次查詢就是 50ms。
數(shù)據(jù)預熱
假如說,哪怕是你就按照上述的方案去做了,es 集群中每個機器寫入的數(shù)據(jù)量還是超過了?filesystem cache
?一倍,比如說你寫入一臺機器 60G 數(shù)據(jù),結(jié)果?filesystem cache
?就 30G,還是有 30G 數(shù)據(jù)留在了磁盤上。
其實可以做數(shù)據(jù)預熱。
舉個例子,拿微博來說,你可以把一些大V,平時看的人很多的數(shù)據(jù),你自己提前后臺搞個系統(tǒng),每隔一會兒,自己的后臺系統(tǒng)去搜索一下熱數(shù)據(jù),刷到?filesystem cache
?里去,后面用戶實際上來看這個熱數(shù)據(jù)的時候,他們就是直接從內(nèi)存里搜索了,很快。
或者是電商,你可以將平時查看最多的一些商品,比如說 iphone 8,熱數(shù)據(jù)提前后臺搞個程序,每隔 1 分鐘自己主動訪問一次,刷到?filesystem cache
?里去。
對于那些你覺得比較熱的、經(jīng)常會有人訪問的數(shù)據(jù),最好做一個專門的緩存預熱子系統(tǒng),就是對熱數(shù)據(jù)每隔一段時間,就提前訪問一下,讓數(shù)據(jù)進入?filesystem cache
?里面去。這樣下次別人訪問的時候,性能一定會好很多。
冷熱分離
es 可以做類似于 mysql 的水平拆分,就是說將大量的訪問很少、頻率很低的數(shù)據(jù),單獨寫一個索引,然后將訪問很頻繁的熱數(shù)據(jù)單獨寫一個索引。最好是將冷數(shù)據(jù)寫入一個索引中,然后熱數(shù)據(jù)寫入另外一個索引中,這樣可以確保熱數(shù)據(jù)在被預熱之后,盡量都讓他們留在?filesystem os cache
?里,別讓冷數(shù)據(jù)給沖刷掉。
你看,假設(shè)你有 6 臺機器,2 個索引,一個放冷數(shù)據(jù),一個放熱數(shù)據(jù),每個索引 3 個 shard。3 臺機器放熱數(shù)據(jù) index,另外 3 臺機器放冷數(shù)據(jù) index。然后這樣的話,你大量的時間是在訪問熱數(shù)據(jù) index,熱數(shù)據(jù)可能就占總數(shù)據(jù)量的 10%,此時數(shù)據(jù)量很少,幾乎全都保留在?filesystem cache
?里面了,就可以確保熱數(shù)據(jù)的訪問性能是很高的。但是對于冷數(shù)據(jù)而言,是在別的 index 里的,跟熱數(shù)據(jù) index 不在相同的機器上,大家互相之間都沒什么聯(lián)系了。如果有人訪問冷數(shù)據(jù),可能大量數(shù)據(jù)是在磁盤上的,此時性能差點,就 10% 的人去訪問冷數(shù)據(jù),90% 的人在訪問熱數(shù)據(jù),也無所謂了。
網(wǎng)上學習資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。
需要這份系統(tǒng)化的資料的朋友,可以添加V獲?。簐ip1024b (備注軟件測試)
一個人可以走的很快,但一群人才能走的更遠!不論你是正從事IT行業(yè)的老鳥或是對IT行業(yè)感興趣的新人,都歡迎加入我們的的圈子(技術(shù)交流、學習資源、職場吐槽、大廠內(nèi)推、面試輔導),讓我們一起學習成長!
1575840)]文章來源:http://www.zghlxwxcb.cn/news/detail-858710.html
一個人可以走的很快,但一群人才能走的更遠!不論你是正從事IT行業(yè)的老鳥或是對IT行業(yè)感興趣的新人,都歡迎加入我們的的圈子(技術(shù)交流、學習資源、職場吐槽、大廠內(nèi)推、面試輔導),讓我們一起學習成長!文章來源地址http://www.zghlxwxcb.cn/news/detail-858710.html
到了這里,關(guān)于es 在數(shù)據(jù)量很大的情況下(數(shù)十億級別)如何提高查詢效率?_es能存多少數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!