close

1號店11.11:分佈式搜索引擎的架構實踐

基於近年在微服務基礎架構方面的實戰經驗和平時的學習積累,我想總結並提出一些構建微服務 2.0 技術棧的選型思路,供各位在一線實戰的架構師、工程師參考借鑒。




基於近年在微服務基礎架構方面的實戰經驗和平時的學習積累,我想總結並提出一些構建微服務 2.0 技術棧的選型思路,供各位在一線實戰的架構師、工程師參考借鑒。

聯毅家電生活館|台中家電行|台中家電行推薦


增強學習和人類學習的機制非常相近,DeepMind已經將增強學習應用於AlphaGo以及Atari遊戲等場景當中。作為智能教育領域的引領者,阿凡題研究院首次提出瞭一種基於DQN(Deep Q-Network)的算術應用題自動求解器,能夠將應用題的解題過程轉化成馬爾科夫決策過程,並利用BP神經網絡良好的泛化能力,存儲和逼近增強學習中狀態-動作對的Q值。實驗表明該算法在標準測試集的表現優異,將平均準確...




在數字化轉型的過程中,越來越多的企業開始意識到平臺思維是通過技術解鎖核心業務能力的關鍵。傳統企業在數字化轉型過程中,雖然背負著包括遺留系統在內的歷史包袱,但歷史的資產包括數據、品牌和客戶關系也都是轉型中的競爭優勢。通過數字化平臺戰略,圍繞歷史優勢資產構建一個生態系統,釋放內部創新活力,促進外部生態合作,是企業數字化轉型的不二選擇。企業的 IT 組織如何在數字化平臺戰略下構建新的組織結構...




Andrew Burt在這篇文章中介紹瞭在GDPR實施之後,歐盟企業在收集、存儲和使用用戶數據時需要註意的事情,企業要通過GDPR基本測試需要做些什麼,以及如何把握時機改進企業的數據監管能力。




11.11 是一年一度的電商盛宴,為瞭準備這個一年內最大規模的促銷,1號店各條戰線都在緊張有序地忙碌著。1號店搜索團隊經過幾年的大促歷練,不斷推動架構演進,積累瞭越來越多的經驗。

另,ArchSummit全球架構師峰會北京站將於2015年12月18日~19日在台中富士通冷氣批發北京國際會議中心召開,大會設置瞭《揭秘雙十一背後的技術較量》專題來深入解讀雙十一背後的技術故事,歡迎關註。

11.11的主要特點是流量大和突發性高,這就帶來瞭兩個核心的需求:


如何抗住這樣的流量,針對這個需求,1號店搜索團隊構建瞭分佈式搜索引擎,支持橫向擴展;並且針對業務特點做瞭Routing優化,讓搜索的效率更高。

快速響應

流量越大,單位時間內的流量價值就越大,出現問題的損失也就越大,如何做到快速響應變得非常關鍵。針對這個需求,搜索系統支持自動部署和快速擴容以應對突發流量,索引數據從導入、處理到上線服務會經過層層驗證,同時還有監控體系及時發現線上的問題。


1號店分佈式搜索引擎是Lucene/Solr核心的,結合SOA框架Hedwig構建瞭一層分佈式框架,支持搜索請求的分發和合並,並且構建瞭搜索管理後臺,支持多索引管理、集群管理、全量索引切換和實時索引更新。

選擇自己構建分佈式方案,而不是采用開源的SolrCloud或ElasticSearch,主要是基於以下幾點考慮:

(1) ElasticSearch/SolrCloud都適合於把搜索引擎作為一個黑盒系統來使用,而1號店搜索業務的展現形式多樣性很高,搜索條件有的會很復雜,有的需要通過自定義插件來實現,性能調優時也需要對引擎內部的執行細節進行監控。

(2) 將ElasticSearch/SolrCloud與公司內部的發佈系統、監控系統和SOA體系結合起來,也是一項比較耗時的工作。

(3) 相對於整體使用,我們更傾向於把Lucene/Solr開源傢族中的各個組件按需引入,一方面降低引入復雜工程的可維護性風險,另一方面逐漸深入理解這些組件,可以在必要時替換為定制化的組件。

分佈式搜索是為瞭解決數據增長過程中索引變大和操作時間變長的問題,它將原來的單個索引文件劃分成n個切片(shards),讓每個shard都足夠小,從而保證索引可以在多臺服務器上部署,而且搜索操作可以在較短時間內返回。

如上圖所示,分佈式搜索中有兩個主要組件:Shard Searcher和Broker,其中Shard Searcher與單機搜索引擎類似,基於Lucene/Solr完成基本的搜索任務。Broker負責把針對整個索引的搜索請求轉化為針對單個Shard的搜索請求,它把Shard搜索請求分發給各個ShardSearcher,並且把各個Shard的結果進行合並,生成最終的結果。

分佈式搜索中,一次搜索所需的資源與它要訪問的Shard數和每個Shard要返回的結果數有非常強的關聯關系,在Shard數特別多或結果數特別多時可能會碰到一些的內存、CPU資源使用的問題。針對結果數特別多的情況,可以按照業務場景優化,比如如果對排序無要求,就可以每次指定一個Shard進行搜索,搜完這個Shard再換下一個,這樣就限制瞭每次搜索的Shard數,另一方面也可以考慮使用DeepPaging等技術,減少每次Shard搜索的成本。我們下一小節也會介紹1號店主站搜索是如何減少每次搜索Shard數的。

另外,上圖中的Broker和Shard Searcher僅僅是概念上的劃分,實際部署時有幾種選擇

A) 每個節點上都有Broker和部分Shard的Shard Searcher。

B) Broker單獨部署成一個集群,與Shard Searcher隔離。

C) Broker作為客戶端的一部分,和搜索應用一起部署。

我們開始使用的是A方式,後來主站搜索轉為C方式,主要是考慮到可以節省一次網絡調用(以及請求和結果的序列化開銷),另外Broker在客戶端也可以更多地使用應用邏輯相關的數據進行更高效的Routing。

高效Routing

通過前面的講述,我們不難看出,使用分佈式搜索引擎,面臨的核心問題就是如何選擇高效的Sharding策略和Routing方案。為瞭設計Routing方案,我們需要深入理解業務場景。

1號店有很多的類目,每個類目的業務模式也不盡相同。以圖書和快消品為例,圖書是一種典型的長尾商品,它需要台中電器行索引大量的SKU(Stock Keeping Unit,可以理解為一個獨立的商品),但每個SKU的訪問量和銷量都不高;快消品是另外一個極端,總體SKU數量不高,但是訪問量和效率都很高。這就造成瞭一個不平衡的局面,圖書的SKU數目占比達到瞭50%以上,流量卻小於10%,我們就首先排除瞭按Shard數目取模(id mod N)這種平衡劃分的策略。

1號店搜索有兩個主要入口,一個是搜索框的搜詞,另外是類目導航。在這兩個入口中,類目的點擊肯定是訪問到一個特定的一級類目下,搜詞時用戶其實也隻會關註相關的幾個類目。基於這種訪問模式,我們就采用瞭按照類目來切分Shard的策略。基本操作為:

(1) 按照一級類目切分Shard。

(2) 如果該Shard過大,則按照二級類目繼續切分。

(3) 經過前兩步之後,如果切分後的Shard過小,則按照相關性進行Shard合並。

經過這樣一番嘗試,Sharding策略就確定下來,切分之後的Shard索引大小一般為200~500MB,Shard上單次搜索可以控制在10ms以下。

接下來說到Routing,我們還是分搜詞和類目導航兩種場景,對於類目導航,原理上非常簡單,按照類目ID來查找Sharding策略,就可以確定需要訪問的Shard,雖然現實中還需要考慮擴展類目等特殊場景,但是也不難做出一個簡單的Routing策略。再加上類目數是有限的,Routing規則在Broker本地內存就可以緩存起來。

搜詞場景就復雜很多,僅憑詞本身很難判斷它屬於哪個Shard。我們首先按照詞的熱度分為兩類,采取不同的Routing策略。對於熱詞,搜詞流量同樣符合80-20規則,20%的熱詞占比80%的搜索流量,對於熱詞,我們可以在建完索引之後,就跑一遍熱詞搜索,記錄那些Shard有結果,離線構建出熱詞Routing表。切換索引時,Routing表也一起加載進去。對於非熱詞,則采用首次搜索去訪問所有Shard,根據結果記錄Routing表,這個詞在下次搜索時,就有瞭緩存可用。

基本的Routing策略上線之後,通過監控每個Shard的訪問量,我們又發現瞭新的問題,圖書類目的訪問量比它應有的流量要高出不少。仔細分析之後發現,由於圖書類目的特殊性,很多詞都可以在圖書中找到結果,然而這些結果一般都不是用戶想要的,實際上也不會排到前幾頁,並沒有展示的機會。於是我們又增加瞭一種360-Routing策略,跟進搜索前五頁的結果(每頁72個商品,共360個商品)計算Routing,下次搜索時優先是用這份Routing規則。由於前五頁的流量占比在80%以上,這就進一步減少瞭單次搜索需要訪問的Shard數。

使用瞭以上這些Routing規則,1號店主站搜索每次搜索平均隻需要訪問1/3的索引數據,這就節約瞭2/3的資源,提高瞭搜索效率。

自動部署與快速擴容

文章一開始我們提到11.11要求搜索系統支持快速擴容,為瞭講清楚這個功能,我們首先要從索引部署講起。

按照類目進行Sharding和Routing的方式,在帶來高效的同時,也帶來瞭管理上的成本。按照類目切分,必然會導致各個Shard的大小不平均,而對應的Routing方案,必然會帶來各個Shard的訪問量不平均。這兩個維度不平均就要求更加復雜的索引部署方案,主要的原則為:

(1) 首先根據流量比例和高可用的需求,確定每個Shard的副本數。

(2) 然後按照單個節點不能放置同一Shard的多個副本,節點上的承擔的流量總和與節點的服務能力成正比。

(3) 每個節點上的索引總大小盡量也保持差異最小。

按照流量比例,副本數計算如下:




Shard數增多之後,人工計算部署方案就顯得較為復雜,於是我們就把部署方案生成做成瞭自動化,一個基本的Packing算法就可以完成這個工作。除瞭初始部署之外,自動部署工具還可以支持節點增加、減少和更換。

在11.11的場景下,這個自動化部署工具也可以支持快速擴容,基本過程為:

(1) Index Server(部署工具界面)計算出擴容之後的部署方案,寫入到ZooKeeper。這裡的算法與初始部署有些不同,它需要保證現有服務器的Shard盡量不變。

(2) 每個Shard Searcher服務器都會監聽ZooKeeper上的部署方案,方案改變之後,Shard Searcher會獲取新的方案與本地方案對比,進行增減操作。

(3) Shard Searcher從HDFS上獲取索引數據,與最近的實時更新數據合並之後,啟動索引提供服務。

有瞭自動擴容工具,11.11容量規劃確定之後,新的服務器就可以很快部署上線,也減少瞭人工操作可能引入的失誤等問題。大促期間如果需要緊急擴容,也可以在幾分鐘內提高整個系統的服務能力。

實時監控體系

11.11大促期間每一分鐘都影響很大,我們需要實時瞭解線上數據和服務情況,確保系統處於一致和可用的狀態,為此,我們構建瞭搜索的監控體系。

在索引數據方面,從源頭開始對索引數據準備的各個環節進行驗證,包括數據的條數、處理過程中的異常、最後生成的索引在常見搜索中的執行結果差異等,層層預防,防止有問題的索引數據被用到線上。

在搜索服務方面,監控系統會定時執行常見的搜索,對比排序結果,結果差異較大時及時告警。同時大促期間會有一些商品很快賣完,這些商品繼續顯示在搜索結果中也沒有價值,搜索監控也會及時發現這些商品,觸發索引更新,把商品排到後面。

每年11.11對系統都是一次大閱兵,通過構建分佈式搜索引擎,我們實現瞭基礎架構的可擴展性,結合業務場景設計的Routing規則,保證瞭搜索的高效執行,自動化工具支持大促必需的自動擴容,配合成體系的驗證和監控,我們有信心應對更高流量的沖擊,保障大促平穩度過。


您需要 註冊一個InfoQ賬號 或者

登錄 才能進行評論。在您完成註冊後還需要進行一些設置。

獲得來自InfoQ的更多體驗。


索引是以文件的方式存儲,那些具體的商品信息以什麼樣的方式存儲呢?還有就是如果訪問多個shard都有數據返回的話,那又是怎麼做聚合呢?謝謝


索引是以文件的方式存儲,那些具體的商品信息以什麼樣的方式存儲呢?
具體信息存儲於一個K-V服務中(類似於redis),搜索過程隻返回商品的ID,然後再去獲取具體信息。

還有就是如果訪問多個shard都有數據返回的話,那又是怎麼做聚合呢?謝謝
如果訪問多個shard都有數據返回,會在Broker進行數據歸並排序,然後返回最終的結果。


歸並的時候應該是按doc得分進行合並的,有考慮各shard上數據分佈不均勻,導致term的idf不一樣的情況嗎?如一個doc在shard1得分很高排在第一位,但如果放在shard2上搜索的話得分很低排在第50位。有對不同shard上的得分進行歸一化嗎?


歸並的時候應該是按doc得分進行合並的,有考慮各shard上數據分佈不均勻,導致term的idf不一樣的情況嗎?如一個doc在shard1得分很高排在第一位,但如果放在shard2上搜索的話得分很低排在第50位。有對不同shard上的得分進行歸一化嗎?
得分的歸一化是在建索引過程中計算產品的各項得分時考慮的,在搜索過程中不需要再對各個shard的產品得分不均的問題做特殊處理。需要做的,也是在本文360-Routing中提到的,如果這次請求隻需要36個結果,而shard2上最好的產品隻能排在50位,那麼下次同樣的條件搜索前36個結果,就不需要請求到shard2瞭。


這裡的響應時間10ms以下 是值整個搜索的過程嗎?包括query分析,基礎檢索和排序? 還是其中的某些部分?






我們發現您在使用ad blocker。

我們理解您使用ad blocker的初衷,但為瞭保證InfoQ能夠繼續以免費方式為您服務,我們需要您的支持。InfoQ絕不會在未經您許可的情聯毅家電生活館|台中電器批發|台中電器批發商況下將您的數據提供給第三方。我們僅將其用於向讀者發送相關廣告內容。請您將InfoQ添加至白名單,感謝您的理解與支持。

聯毅家電生活館|台中家電批發|台中家電批發商


83370DF35BA9F6B1

arrow
arrow
    創作者介紹
    創作者 jurdi45438 的頭像
    jurdi45438

    均均的網購推薦

    jurdi45438 發表在 痞客邦 留言(0) 人氣()