分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試
引言
如果你的項(xiàng)目里有超過(guò)千萬(wàn)上億級(jí)別的數(shù)據(jù),且數(shù)據(jù)日增量較大需要高性能檢索時(shí),如訂單數(shù)據(jù),你該怎么辦?
作為面試官,你需要找一個(gè)能解決這個(gè)問(wèn)題的人!為應(yīng)聘者,你該如何回答面試官這個(gè)問(wèn)題?
你可以了解下使用搜索引擎框架,Elasticsearch (ES)是一個(gè)不錯(cuò)的開(kāi)源搜索引擎框架。我們可以把 ES 當(dāng)做“數(shù)據(jù)庫(kù)”來(lái)使用,全球很多知名社區(qū)的全文檢索都采用ES,如維基百科、Stack Overflow、Github等。
ElasticSearch是開(kāi)源的,它基于lucene,是伸縮性強(qiáng)、分布式、高可用的全?搜索引擎,可以簡(jiǎn)單地通過(guò)RESTful 使用JSON格式索引數(shù)據(jù)。
嘗試想一下,如果你做的是一個(gè)知識(shí)庫(kù)系統(tǒng),系統(tǒng)里有大量文章,如果你想通過(guò)某一個(gè)或關(guān)鍵字檢索文章的內(nèi)容,如果用MySQL來(lái)做這件事,光靠 like 查詢(xún)根本無(wú)法滿足,全文檢索就是對(duì)一篇文章進(jìn)行索引,ES可以把內(nèi)容根據(jù)詞的意義進(jìn)行分詞,然后分別創(chuàng)建索引,例如”我要?jiǎng)?lì)志做一個(gè)有追求的程序員” ,經(jīng)過(guò)ES分詞后是:“我“,“我要”,”勵(lì)志“,“一個(gè)“,”有追求“,“程序員”,無(wú)論你根據(jù)哪個(gè)關(guān)鍵詞去檢索,都會(huì)檢索到這句話。
讓你不需要了解背后復(fù)雜的邏輯,即可完成搜索,Elasticsearch致力于隱藏分布式系統(tǒng)的復(fù)雜性。以下這些操作都是在底層自動(dòng)完成的:
- 將你的文檔分區(qū)到不同的容器或者分片(shards)中,它們可以存在于一個(gè)或多個(gè)節(jié)點(diǎn)中。
- 將分片均勻的分配到各個(gè)節(jié)點(diǎn),對(duì)索引和搜索做負(fù)載均衡。
根據(jù)ES支持全文索引這個(gè)特性,我們還可以通過(guò)它做很多所有關(guān)于模糊搜索的功能,大數(shù)據(jù)量多維度聚合也是ES的強(qiáng)項(xiàng),如天貓商城,通過(guò)關(guān)鍵字搜索商品,輸入iph后就會(huì)自動(dòng)加載iphone相關(guān)的所有商品,這是典型的搜索引擎使用場(chǎng)景。
1、面試官:
我看你簡(jiǎn)歷有寫(xiě)項(xiàng)目里有使用了ES,哪些場(chǎng)景用到了ES?
問(wèn)題分析: 凡事大數(shù)據(jù)量且需要檢索的,這個(gè)時(shí)候你都可以想到ES,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)查詢(xún)速度變慢,數(shù)據(jù)庫(kù)分表聯(lián)合查詢(xún)速度慢。
答:有這樣一個(gè)需求場(chǎng)景,運(yùn)營(yíng)系統(tǒng)需要一個(gè)訂單分析工具,當(dāng)時(shí)我們的訂單庫(kù)總數(shù)已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)億級(jí)別數(shù)據(jù)量,每天增量在百萬(wàn)級(jí)。
系統(tǒng)初期訂單查詢(xún)主要采用MySQL查詢(xún),并沒(méi)有使用其他數(shù)據(jù)庫(kù),隨著業(yè)務(wù)的發(fā)展,系統(tǒng)主要面臨兩個(gè)挑戰(zhàn):
- 隨著數(shù)據(jù)增多,MySQL 分庫(kù)分表后單張表數(shù)據(jù)依然增加到了幾千萬(wàn)數(shù)據(jù)量級(jí),查詢(xún)?cè)絹?lái)越慢。
- 查詢(xún)中帶有大量聚合運(yùn)算,如過(guò)濾計(jì)算異常訂單總數(shù),完成訂單總數(shù),計(jì)算訂單金額等,MySQL并不擅長(zhǎng)使用sql做大規(guī)模運(yùn)算。
針對(duì)上述兩個(gè)問(wèn)題,我使用了 Elasticsearch 完美地應(yīng)對(duì)慢查詢(xún)這個(gè)問(wèn)題,我使用ES作為主查詢(xún)數(shù)據(jù)源,MySQL作為降級(jí)備案,如果 ES 集群因?yàn)楦鞣N原因不可用了,系統(tǒng)會(huì)把訂單查詢(xún)數(shù)據(jù)源自動(dòng)切換到 MySQL 數(shù)據(jù)源,對(duì)于運(yùn)營(yíng)系統(tǒng),雖然查詢(xún)會(huì)變慢,但是不會(huì)耽誤正常使用,而且這種降級(jí)的概率也極少發(fā)生。
系統(tǒng)架構(gòu)圖這樣的:(盡量給面試官展示明白這個(gè)圖)
重點(diǎn)關(guān)注紅色框,我使用了 ES 作為首選訂單查詢(xún)?cè)?,MySQL作為備份數(shù)據(jù)源,中間加入自動(dòng)降級(jí)開(kāi)關(guān)。
2、面試官:
那使用了ES后結(jié)果如何?
答:使用 ES 后,查詢(xún)速度當(dāng)然是大大的提高。
使用MySQL的時(shí)候99%的查詢(xún)時(shí)間在10s+,架構(gòu)引入ES后上線后,查詢(xún)時(shí)間迅速降低到毫秒級(jí)別。
我還保留了性能監(jiān)控的圖放在我述職報(bào)告里,為升級(jí)加薪打下扎實(shí)的基礎(chǔ)。
面試官一直點(diǎn)頭,對(duì)我這一波操作非常認(rèn)可。
3、面試官:
關(guān)于ES的一些概念名字你了解多少?如索引,文檔,倒排索引這些東西你是怎么理解的?
問(wèn)題分析:有些人剛剛接觸 Elasticsearch 的時(shí)候,只顧用,只知道ES快,能裝很多數(shù)據(jù),但是面試官稍微問(wèn)了一個(gè)倒排索引就懵逼了,還好意思說(shuō)你會(huì)用搜索引擎?
答:先說(shuō)說(shuō)ES中的 Index,Document,Type,以及對(duì)應(yīng)MySQL數(shù)據(jù)庫(kù)
索引(Index):
索引的概念相當(dāng)于MySQL里數(shù)據(jù)庫(kù)的概念,用ES創(chuàng)建一個(gè)索引就是創(chuàng)建一個(gè)庫(kù),比如電商系統(tǒng)里給訂單創(chuàng)建一個(gè)訂單的索引,那客服系統(tǒng)就可以通過(guò)訂單索引快速查詢(xún)訂單所有信息快速處理客訴。
文檔(Document):
ES屬于文檔型數(shù)據(jù)庫(kù),文檔的概念就相當(dāng)于MySQL里一條數(shù)據(jù)的概念,很多個(gè)文檔(很多條數(shù)據(jù))構(gòu)成了一個(gè)索引。
類(lèi)型(Type)
上面說(shuō)文檔的概念就相當(dāng)于MySQL里一條數(shù)據(jù)的概念,MySQL里一條數(shù)據(jù)有很多個(gè)字段,比如訂單號(hào),用戶(hù)手機(jī)號(hào),訂單金額等,Type 的概念相當(dāng)于根據(jù)每個(gè)字段聚合所一張表,如根據(jù)訂單號(hào)分組,按照手機(jī)號(hào)分組,這種分組就叫做 Type,它是虛擬的邏輯分組,用來(lái)過(guò)濾文檔,無(wú)論根據(jù)哪個(gè)字段搜索都有對(duì)應(yīng)的Type(表)。
如果還不明白,直接給你整理成表:ES VS Mysql
ElasticSearch | 關(guān)系型數(shù)據(jù)庫(kù):MySQL | |
---|---|---|
對(duì)應(yīng)關(guān)系: | 索引 | 庫(kù) |
對(duì)應(yīng)關(guān)系: | 類(lèi)型type | 數(shù)據(jù)表 |
對(duì)應(yīng)關(guān)系: | 文檔 | 行 |
對(duì)應(yīng)關(guān)系: | 字段Field | 列 |
最重要的倒排索引
Tip: 如果你使用過(guò) Elasticsearch 不知道倒排索引的概念那恐怕有點(diǎn)說(shuō)不過(guò)去,倒排索引也叫反向索引(Inverted Index)
(開(kāi)始給面試官舉例分析倒排索引,我可是貨真價(jià)實(shí)做過(guò)功課的)
有這樣三段話:
- hello everyone
- this article is based on inverted index
- which is hashmap like data structure
使用ES保存后結(jié)構(gòu)如下:
hello (1, 1)
everyone (1, 2)
this (2, 1)
article (2, 2)
is (2, 3); (3, 2)
based (2, 4)
on (2, 5)
inverted (2, 6)
index (2, 7)
which (3, 1)
hashmap (3, 3)
like (3, 4)
data (3, 5)
structure (3, 6)
hello 出現(xiàn)在第1句話第1個(gè)單詞,所以是(1, 1) ,is (2, 3); (3, 2) 表示is出現(xiàn)在第2句第3個(gè)單詞和第3句第2個(gè)單詞,這樣經(jīng)過(guò)拆分后,每個(gè)關(guān)鍵詞出現(xiàn)在哪句話哪個(gè)位置都一目了然,非常方便檢索,這便是倒排索引的概念。試想一下,我們使用的百度或是谷歌檢索,是不是這種數(shù)據(jù)結(jié)構(gòu)更容易讓我們找到你想要的所有內(nèi)容,這便是倒排索引帶給我們的便利之處,倒排索引允許快速全文搜索,但是在將文檔添加到數(shù)據(jù)庫(kù)時(shí)會(huì)增加處理成本
面試官: 行了行了,我知道你理解了,時(shí)間有限咱先不聊這個(gè)了。
這才是面試?yán)硐胄Ч?,讓面試官無(wú)話可說(shuō)。
總結(jié)
- 如果你要做分布式的實(shí)時(shí)文件存儲(chǔ),每個(gè)字段都被索引并可被搜索;
- 如果你要做實(shí)時(shí)分析搜索;
- 如果你要處理PB級(jí)結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù);
這個(gè)時(shí)候請(qǐng)先想到使用搜索引擎。
關(guān)于 ES 的特性是使用場(chǎng)景概括:
大數(shù)據(jù)量聚合檢索和排序,如計(jì)算用戶(hù)訂單總金額,訂單數(shù)據(jù)等。自動(dòng)補(bǔ)全,如搜索框通過(guò)關(guān)鍵字自動(dòng)補(bǔ)全。高亮查詢(xún)。關(guān)鍵字檢索,模糊檢索,拼音查詢(xún)。記錄系統(tǒng)后臺(tái)日志,日志檢索。
以上就是分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試的詳細(xì)內(nèi)容,更多關(guān)于分布式ElasticSearch大數(shù)據(jù)量檢索面試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java 1.8 動(dòng)態(tài)代理源碼深度分析
下面小編就為大家?guī)?lái)一篇java 1.8 動(dòng)態(tài)代理源碼深度分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06淺析Java中對(duì)稱(chēng)與非對(duì)稱(chēng)加密算法原理與使用
密碼學(xué)是研究編制密碼和破譯密碼的技術(shù)科學(xué)。這篇文章主要為大家介紹了Java中對(duì)稱(chēng)與非對(duì)稱(chēng)加密算法的原理與使用,感興趣的小伙伴可以了解一下2023-03-03Springboot實(shí)現(xiàn)自定義錯(cuò)誤頁(yè)面的方法(錯(cuò)誤處理機(jī)制)
這篇文章主要介紹了Springboot實(shí)現(xiàn)自定義錯(cuò)誤頁(yè)面的方法(錯(cuò)誤處理機(jī)制),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01在SpringBoot項(xiàng)目中實(shí)現(xiàn)讀寫(xiě)分離的流程步驟
SpringBoot作為一種快速開(kāi)發(fā)框架,廣泛應(yīng)用于Java項(xiàng)目中,在一些大型應(yīng)用中,數(shù)據(jù)庫(kù)的讀寫(xiě)分離是提升性能和擴(kuò)展性的一種重要手段,本文將介紹如何在SpringBoot項(xiàng)目中優(yōu)雅地實(shí)現(xiàn)讀寫(xiě)分離,并通過(guò)適當(dāng)?shù)拇a插入,詳細(xì)展開(kāi)實(shí)現(xiàn)步驟,同時(shí)進(jìn)行拓展和分析2023-11-11@Conditional注解的使用場(chǎng)景和源碼解析
這篇文章主要介紹了@Conditional注解的使用場(chǎng)景和源碼解析,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,如果滿足條件,則將Bean注冊(cè)進(jìn)IOC中,如果不滿足條件,則不進(jìn)行注冊(cè),需要的朋友可以參考下2023-11-11SpringBoot中注解實(shí)現(xiàn)定時(shí)任務(wù)的兩種方式
這篇文章主要介紹了SpringBoot中注解實(shí)現(xiàn)定時(shí)任務(wù)的兩種方式,SpringBoot 定時(shí)任務(wù)是一種在SpringBoot應(yīng)用中自動(dòng)執(zhí)行任務(wù)的機(jī)制,通過(guò)使用Spring框架提供的@Scheduled注解,我們可以輕松地創(chuàng)建定時(shí)任務(wù),需要的朋友可以參考下2023-10-10