概述
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在進行2nd phrase搜索時需要使用這個unique key進行數據一致性的二次確認與獲取搜索要求查詢的字段數據。
- 分布在不同服務器中的索引文件中包含的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服務器將分布式查詢結果返回給客戶端
注意:當前的版本中,分布式查詢中如果有某一個Shard異常,整體的查詢將失敗。