solr優化

  海量數據的索引,第一個要解決的是數據存儲的問題,solr提供數據存儲平臺有兩種,第一個是本地磁盤,另一個是HDFS,我們可以通過solrhome的配置來實現。在本次實踐中,我們選擇的是本地磁盤,因爲採用的solrcloud部署模式,本身就是多節點多機器,在存儲上不會有問題,還有另一個重要的原因後面會講到。下面講講具體從哪些方面做了實踐。

solr版本:solr6.0.0;主機:red hat; 網絡:千兆網

性能的具體要求是:

1、在一臺機器上普通硬盤的情況下,索引單個文檔大小爲200字節左右,需要達到的效率爲7WTPS。

2、具有良好的水平擴展性。

3、對數據備份和數據丟失情況,要求不嚴格。

   

         在對索引速度進行優化之前,有必要先對建立索引的整個流程做個大致的瞭解,如下圖所示:

                                                         

說明:
1、 客戶端發送HTTP的POST請求到Solr服務器,報文格式一般有xml、json、javabin(只有java才支持,二進制結構)。
2、 Web服務器將請求派發到Solr的Web應用程序(Servlet)。
3、 Solr根據請求的URI中的Collection名字在solrConfig.xml找到註冊的/update消息處理器;這是單個副本的情況下,如果多個副本的情況下,如果需要判斷此副本是否爲Leader,如果是非Leader,則需要將此文檔發送給此副本的Leader,如果是非直接路由模式,Solr則會根據文檔ID進行hash路由,路由到特定的Leader上。
4、 按照solrConfig.xml配置的請求處理鏈來處理索引,比如分詞處理器等。
5、 寫事務日誌,當發送提交後正式將數據寫入到存儲中,事務日誌可以保證在用戶未提交的情況下數據不丟失。
6、 返回寫索引的結果。



     

        一  提交方式

        solr提供了兩種提交方式:硬提交和軟提交。硬提交(hard commit)指的是在客戶端每提交一批數據都通知服務器把數據刷新到硬盤上,檢索的時候數據可以立馬可見;軟提交(soft commit)是讓服務器自己控制在一定的時間範圍之內刷新數據。很明顯,硬提交是非常損耗性能的操作,並且它還會阻塞其他數據的提交,所以我們選擇軟提交,具體配置方式如下所示:

  1. <autoCommit>   
  2.        <maxTime>${solr.autoCommit.maxTime:30000}</maxTime>   
  3.        <openSearcher>false</openSearcher>   
  4.  </autoCommit>  
  5.   
  6. <autoSoftCommit>   
  7.   <maxTime>${solr.autoSoftCommit.maxTime:60000}</maxTime>   
  8. </autoSoftCommit>  

       在這份配置文件中,我們指定了服務器每隔60秒對數據做一次軟提交,另外推薦opensearch設置爲false,否則每次提交都會開啓一個opensearch,這個也會損耗性能。

     

        二   關閉副本

        solr一個collection會有多個分片(shard),多個shard分別位於不同的節點上,每個節點上可能會有shard的多個複製,其中一個爲leader shard,在追求極限速度的情況下,可以將副本數設置爲1,這樣減去了副本間的數據同步等資源消耗。不過這樣做帶來的弊端就是數據容災性降低,和檢索性能急劇下降。

  

        三   取消分詞器

        很顯然使用分詞器的話會對數據做進一步處理,也是會使得性能大幅度降低的,再不使用全文檢索的情況下可以不使用分詞器來提高速度。

      

        四  增加分片

        在一臺物理機上,我們可以部署多個solr實例,在每個實例上可以設置多個shard,這樣在索引數據的時候,一個collection會有多個shard在同時入數據,顯然速度是可以大幅提升的。不過shard數也不能太多,機器資源是有限的,當太多shard同時寫數據,會導致內存和IO壓力很大,效果適得其反,應該根據自己得硬件情況進行合理設置。另外,如果是採用的SSD硬盤,設置多個solrhome也會有不錯的效果。


        五  劃分collection

        當數據積累的越來越多的時候,哪怕多個shard,每個shard的數量也是巨量的,這個時候,不僅查詢性能急劇下降,由於lucene倒排序索引的原理建索引速度也會越來越慢。所以我們嘗試控制每個shard數據量不會太大,進行了按業務劃分索引庫,或者按天按小時建立索引庫,這樣數據分佈到多個collection中,均衡了每個索引庫的壓力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章