1. 程式人生 > >solr全文檢索技術學習(三)-搭建SolrCloud叢集問題總結

solr全文檢索技術學習(三)-搭建SolrCloud叢集問題總結

  什麼是SolrCloud

         SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。
 SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡
zookeeper介紹
顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分散式叢集都用到了zookeeper;Zookeeper:是一個分散式的、開源的程式協調服務,是hadoop專案下的一個子專案。

  SolrCloud結構

        SolrCloud為了降低單機的處理壓力,需要由多臺伺服器共同來完成索引和搜尋任務。實現的思路是將索引資料進行Shard(分片)拆分,每個分片由多臺的伺服器共同完成,當一個索引或搜尋請求過來時會分別從不同的Shard的伺服器中操作索引。
SolrCloud需要Solr基於Zookeeper部署,Zookeeper是一個叢集管理軟體,由於SolrCloud需要由多臺伺服器組成,由zookeeper來進行協調管理。
下圖是一個SolrCloud應用的例子:

1    物理結構

三個Solr例項( 每個例項包括兩個Core),組成一個SolrCloud。

2    邏輯結構

索引集合包括兩個Shard(shard1和shard2),shard1和shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由zookeeper選舉產生,zookeeper控制每個shard上三個Core的索引資料一致,解決高可用問題。
使用者發起索引請求分別從shard1和shard2上獲取,解決高併發問題。
   collection
Collection在SolrCloud叢集中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個Shard(分片),它們使用相同的配置資訊。
比如:針對商品資訊搜尋可以建立一個collection。
 collection=shard1+shard2+....+shardX
    Core
每個Core是Solr中一個獨立執行單位,提供 索引和搜尋服務。一個shard需要由一個Core或多個Core組成。由於collection由多個shard組成所以collection一般由多個core組成。
    Master或Slave
Master是master-slave結構中的主結點(通常說主伺服器),Slave是master-slave結構中的從結點(通常說從伺服器或備伺服器)。同一個Shard下master和slave儲存的資料是一致的,這是為了達到高可用目的。
   Shard
Collection的邏輯分片。每個Shard被化成一個或者多個replication,通過選舉確定哪個是Leader。

 SolrCloud搭建

基於單機版的安裝搭建,所以採用偽叢集的方式進行安裝,如果是真正的生成環境,將偽叢集的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下:

 搭建基本都是在單機基礎上的實現,文件說的很詳細,這裡主要說碰到的一個問題,在講solrhome的conf配置檔案上傳到zookeeper上時,碰到一個問題:

在cmd命令列輸入如下指令碼時-java -classpath E:\SolrCloud\tomcat1\webapps\solr\WEB-INF\lib/* org.apache.solr.cloud.ZkCLI -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -cmd upconfig -confdir E:\SolrCloud\solrhome1\collection1\conf -confname myconf
老是報:錯誤: 找不到或無法載入主類 E:\SolrCloud\tomcat1\webapps\solr\WEB-INF\lib\asm-4.1.jar 的問題

解決方案:可能是cmd許可權不允許,我將classpath關聯的lib包路徑,加入到java配置的classpath中,然後再在命令列中不再輸入-classpath E:\SolrCloud\tomcat1\webapps\solr\WEB-INF\lib/*,直接就可以自動載入了。

最後效果如圖:


SolrJ專案使用

普通客戶端呼叫,將SolrServer solrServer = new HttpSolrServer("http://localhost:8081/solr")替換成如下連線方式:

String zkHost = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
		CloudSolrServer solrServer = new CloudSolrServer(zkHost);
		//設定預設的collection
		solrServer.setDefaultCollection("collection2");
SpringMVC框架下更換配置
 <!-- 單機版solr -->
	<!--<bean class="org.apache.solr.client.solrj.impl.HttpSolrServer">
		<constructor-arg name="baseURL" value="http://localhost:8081/solr/"></constructor-arg>
	</bean>
	--><!-- 叢集版SolrCloud -->
	<bean class="org.apache.solr.client.solrj.impl.CloudSolrServer">
		<constructor-arg name="zkHost" value="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"></constructor-arg>
		<property name="defaultCollection" value="collection2"></property>
	</bean>