W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
《深入淺出搜索架構(gòu)(上篇)》詳細(xì)介紹了:
(1)全網(wǎng)搜索引擎架構(gòu)與流程
(2)站內(nèi)搜索引擎架構(gòu)與流程
(3)搜索原理與核心數(shù)據(jù)結(jié)構(gòu)
本文重點(diǎn)介紹:
(4)流量數(shù)據(jù)量由小到大,常見(jiàn)搜索方案與架構(gòu)變遷
(5)數(shù)據(jù)量、并發(fā)量、擴(kuò)展性方案
任何互聯(lián)網(wǎng)需求,或多或少有檢索需求,還是以58同城的帖子業(yè)務(wù)場(chǎng)景為例,帖子的標(biāo)題,帖子的內(nèi)容有很強(qiáng)的用戶(hù)檢索需求,在業(yè)務(wù)、流量、并發(fā)量逐步遞增的各個(gè)階段,應(yīng)該如何實(shí)現(xiàn)檢索需求呢?
原始階段-LIKE
數(shù)據(jù)在數(shù)據(jù)庫(kù)中可能是這么存儲(chǔ)的:
t_tiezi(tid, title, content)
滿足標(biāo)題、內(nèi)容的檢索需求可以通過(guò)LIKE實(shí)現(xiàn):
select tid from t_tiezi where content like ‘%天通苑%’
能夠快速滿足業(yè)務(wù)需求,存在的問(wèn)題也顯而易見(jiàn):
(1)效率低,每次需要全表掃描,計(jì)算量大,并發(fā)高時(shí)cpu容易100%
(2)不支持分詞
初級(jí)階段-全文索引
如何快速提高效率,支持分詞,并對(duì)原有系統(tǒng)架構(gòu)影響盡可能小呢,第一時(shí)間想到的是建立全文索引:
alter table t_tiezi add fulltext(title,content)
使用match和against實(shí)現(xiàn)索引字段上的查詢(xún)需求。
全文索引能夠快速實(shí)現(xiàn)業(yè)務(wù)上分詞的需求,并且快速提升性能(分詞后倒排,至少不要全表掃描了),但也存在一些問(wèn)題:
(1)只適用于MyISAM
(2)由于全文索引利用的是數(shù)據(jù)庫(kù)特性,搜索需求和普通CURD需求耦合在數(shù)據(jù)庫(kù)中:檢索需求并發(fā)大時(shí),可能影響CURD的請(qǐng)求;CURD并發(fā)大時(shí),檢索會(huì)非常的慢;
(3)數(shù)據(jù)量達(dá)到百萬(wàn)級(jí)別,性能還是會(huì)顯著降低,查詢(xún)返回時(shí)間很長(zhǎng),業(yè)務(wù)難以接受
(4)比較難水平擴(kuò)展
中級(jí)階段-開(kāi)源外置索引
為了解決全文索的局限性,當(dāng)數(shù)據(jù)量增加到大幾百萬(wàn),千萬(wàn)級(jí)別時(shí),就要考慮外置索引了。外置索引的核心思路是:索引數(shù)據(jù)與原始數(shù)據(jù)分離,前者滿足搜索需求,后者滿足CURD需求,通過(guò)一定的機(jī)制(雙寫(xiě),通知,定期重建)來(lái)保證數(shù)據(jù)的一致性。
原始數(shù)據(jù)可以繼續(xù)使用Mysql來(lái)存儲(chǔ),外置索引如何實(shí)施?Solr,Lucene,ES都是常見(jiàn)的開(kāi)源方案。
樓主強(qiáng)烈推薦ES(ElasticSearch),原因是Lucene雖好,但始終有一些不足:
(1)Lucene只是一個(gè)庫(kù),潛臺(tái)詞是,需要自己做服務(wù),自己實(shí)現(xiàn)高可用/可擴(kuò)展/負(fù)載均衡等復(fù)雜特性
(2)Lucene只支持Java,如果要支持其他語(yǔ)言,還是得自己做服務(wù)
(3)Lucene不友好,這是很致命的,非常復(fù)雜,使用者往往需要深入了解搜索的知識(shí)來(lái)理解它的工作原理,為了屏蔽其復(fù)雜性,一個(gè)辦法是自己做服務(wù)
…
…
為了改善Lucene的各項(xiàng)不足,解決方案都是“封裝一個(gè)接口友好的服務(wù),屏蔽底層復(fù)雜性”,于是有了ES:
(1)ES是一個(gè)以Lucene為內(nèi)核來(lái)實(shí)現(xiàn)搜索功能,提供REStful接口的服務(wù)
(2)ES能夠支持很大數(shù)據(jù)量的信息存儲(chǔ),支持很高并發(fā)的搜索請(qǐng)求
(3)ES支持集群,向使用者屏蔽高可用/可擴(kuò)展/負(fù)載均衡等復(fù)雜特性
目前58到家使用ES作為核心,實(shí)現(xiàn)了自己的搜索服務(wù)平臺(tái),能夠通過(guò)在平臺(tái)上簡(jiǎn)單的配置,實(shí)現(xiàn)業(yè)務(wù)方的搜索需求。
搜索服務(wù)數(shù)據(jù)量最大的“接口耗時(shí)數(shù)據(jù)收集”需求,數(shù)據(jù)量大概在7億左右;并發(fā)量最大的“經(jīng)緯度,地理位置搜索”需求,線上平均并發(fā)量大概在600左右,壓測(cè)數(shù)據(jù)并發(fā)量在6000左右。
高級(jí)階段-自研搜索引擎
當(dāng)數(shù)據(jù)量進(jìn)一步增加,達(dá)到10億、100億數(shù)據(jù)量;并發(fā)量也進(jìn)一步增加,達(dá)到每秒10萬(wàn)吞吐;業(yè)務(wù)個(gè)性也逐步增加的時(shí)候,就需要自研搜索引擎了,定制化實(shí)現(xiàn)搜索內(nèi)核了。
到了定制化自研搜索引擎的階段,超大數(shù)據(jù)量、超高并發(fā)量為設(shè)計(jì)重點(diǎn),為了達(dá)到“無(wú)限容量、無(wú)限并發(fā)”的需求,架構(gòu)設(shè)計(jì)需要重點(diǎn)考慮“擴(kuò)展性”,力爭(zhēng)做到:增加機(jī)器就能擴(kuò)容(數(shù)據(jù)量+并發(fā)量)。
(1)上層proxy(粉色)是接入集群,為對(duì)外門(mén)戶(hù),接受搜索請(qǐng)求,其無(wú)狀態(tài)性能夠保證增加機(jī)器就能擴(kuò)充proxy集群性能
(2)中層merger(淺藍(lán)色)是邏輯集群,主要用于實(shí)現(xiàn)搜索合并,以及打分排序,業(yè)務(wù)相關(guān)的rank就在這一層實(shí)現(xiàn),其無(wú)狀態(tài)性也能夠保證增加機(jī)器就能擴(kuò)充merger集群性能
(3)底層searcher(暗紅色大框)是檢索集群,服務(wù)和索引數(shù)據(jù)部署在同一臺(tái)機(jī)器上,服務(wù)啟動(dòng)時(shí)可以加載索引數(shù)據(jù)到內(nèi)存,請(qǐng)求訪問(wèn)時(shí)從內(nèi)存中l(wèi)oad數(shù)據(jù),訪問(wèn)速度很快
(3.1)為了滿足數(shù)據(jù)容量的擴(kuò)展性,索引數(shù)據(jù)進(jìn)行了水平切分,增加切分份數(shù),就能夠無(wú)限擴(kuò)展性能,如上圖searcher分為了4組
(3.2)為了滿足一份數(shù)據(jù)的性能擴(kuò)展性,同一份數(shù)據(jù)進(jìn)行了冗余,理論上做到增加機(jī)器就無(wú)限擴(kuò)展性能,如上圖每組searcher又冗余了2份
為了滿足搜索業(yè)務(wù)的需求,隨著數(shù)據(jù)量和并發(fā)量的增長(zhǎng),搜索架構(gòu)一般會(huì)經(jīng)歷這么幾個(gè)階段:
(1)原始階段-LIKE
(2)初級(jí)階段-全文索引
(3)中級(jí)階段-開(kāi)源外置索引
(4)高級(jí)階段-自研搜索引擎
實(shí)時(shí)搜索引擎核心技術(shù),站長(zhǎng)發(fā)布1個(gè)新網(wǎng)頁(yè),Google如何做到15分鐘后檢索出來(lái)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: