Solr分散式搜尋技術實現分析
阿新 • • 發佈:2019-01-12
概述
Solr單機支援的搜尋資料量是有一定上限的,這個取決於搜尋的複雜程度,伺服器的硬體配置與業務的要求等等,所以將搜尋功能分佈化將是對於大資料搜尋的一個必然趨勢。
Solr從1.3版本開始,自帶了分散式搜尋(Distributed Search)。這個功能使得Solr能夠通過多伺服器進行橫行擴充套件,對資料進行水平拆分,從而支援海量資料的搜尋功能。
Solr-3.6.1版本對分散式搜尋的支援功能如下:
搜尋功能模組 |
是否支援分散式搜尋 |
Query component |
Y |
Facet component |
Y |
Highlighting component |
Y |
Spell Check Component |
Y |
Terms Component |
Y |
Stats component |
Y |
Term Vector Component |
Y |
Debug component |
Y |
Grouping component |
Y |
QueryElevationComponent |
N |
MoreLikeThis |
N |
Join |
N |
由於業務功能和時間的緣故,本文將只討論Query component的技術實現邏輯。
注意事項
在使用Solr進行分散式搜尋的時候,需要注意以下細節:
- schema.xml中定義的
- 分佈在不同伺服器中的索引檔案中包含的unique key不要有重複。因為Solr在進行1st phrase搜尋時需要根據這些unique key進行排序與去重,如果unique key有重複,包含相同unique key的doc結果將隨機返回。
- 搜尋結果不要有過多的翻頁。因為Solr的分散式搜尋中,會將需要翻頁排序後的總結果全部返回給proxy solr server進行彙總排序,如果翻頁過多,那麼對網路頻寬將會照成一定的壓力。
- 注意HTTP連線數。因為Solr的分散式搜尋中,伺服器可能既是search server又是proxy server,一遍等待http請求應答有一遍處理http請求,多臺伺服器之間就可能會出現死鎖。
分散式搜尋邏輯實現
Query component的實現原則為:Multi-phased approach, allowing for inconsistency,具體的實現細節如下:
- 客戶端傳送搜尋請求給Solr叢集中的任意一臺伺服器SP。
- SP伺服器處理分散式查詢請求
- Phase One
- 構建查詢請求,只獲取查詢Doc的unique key與sort field欄位。
- 將構建好的請求通過HTTP傳送給每一個Solr Shard節點。
- 等待Solr Shard節點返回查詢結果。
- 根據排序規則,逐個合併Solr Shard節點返回的查詢結果。
- Phase Two
- 構建查詢請求,根據unique key查詢客戶端查詢的相關欄位資料。
- 將構建好的請求通過HTTP傳送給每一個需要請求的Solr Shard節點。
- 等待Solr Shard節點返回查詢結果。
- 逐個合併Solr Shard節點返回的查詢結果,構建本次查詢的最終結果。
- SP伺服器將分散式查詢結果返回給客戶端
- Phase One
注意:當前的版本中,分散式查詢中如果有某一個Shard異常,整體的查詢將失敗。