Solr叢集(偽叢集)搭建
什麼是SolrCloud:
SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。
SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡
SolrCloud結構:
SolrCloud為了降低單機的處理壓力,需要由多臺伺服器共同來完成索引和搜尋任務。實現的思路是將索引資料進行
SolrCloud需要Solr基於Zookeeper部署,Zookeeper是一個叢集管理軟體,由於SolrCloud需要由多臺伺服器組成,由zookeeper來進行協調管理。
下圖是一個SolrCloud應用的例子:
物理結構:需要實現能看到、配置得了的東西。
邏輯結構:看不見、莫不著的。
環境搭建:3個zookeeper例項、4個tomcat例項、在一臺虛擬機器上模擬。
採用偽叢集的方式進行安裝,如果是真正的生產環境,將偽叢集的ip改下就可以了,步驟是一樣的。
環境準備:
centos6.5
jdk1.7
apache-tomcat7
zookeeper
solr
環境安裝:
centos6.5:略 、
jdk:略
solr叢集搭建:
1、先建立4個tomcat例項。
上傳解壓tomcat安裝包,複製4個解壓檔案到/usr/local/solrcloud/目錄下,分別命名tomcat1、tomcat2、tomcat3、tomcat4
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat1 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat2 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat3 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat4 -r
2、修改埠8080:8083
示範tomcat2,改3個地方。其它一樣:
3、安裝solr(跟單機版一樣)
上傳、解壓安裝檔案,從解壓檔案dist目錄中複製solr.war到tomcat中。
cd solr-4.10.3/dist/
cp solr-4.10.3.war /usr/local/solrcloud/tomcat1/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat2/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat3/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat4/webapps/solr.war
啟動tomcat來解壓solr.war
cd /usr/local/solrcloud/
tomcat1/bin/startup.sh
tomcat2/bin/startup.sh
tomcat3/bin/startup.sh
tomcat4/bin/startup.sh
為了方便可以寫個指令碼啟動和關閉
啟動:./startall.sh
停止:./shutdownall.sh
將原來的solr.war刪除。
4、拷貝example\lib\ext 目錄下所有jar包到Tomcat的webapp\solr\WEB-INF\lib目錄下
cd solr-4.10.3/example/lib/ext/
cp ./* /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/lib/
5、在Tomcat下webapps\solr\WEB-INF目錄中建立檔案classes資料夾,拷貝log4j.properties檔案
mkdir /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes
cd solr-4.10.3/example/resources/
cp log4j.properties /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes/
4、進入example目錄下拷貝4次solr到solrcloud下面,存放solr配置檔案
cd solr-4.10.3/example/
cp -r solr /usr/local/solrcloud/solrhome1
cp -r solr /usr/local/solrcloud/solrhome2
cp -r solr /usr/local/solrcloud/solrhome3
cp -r solr /usr/local/solrcloud/solrhome4
5、修改web.xml找到對應配置檔案目錄
cd /usr/local/solrcloud/
vi tomcat1/webapps/solr/WEB-INF/web.xml
記得去掉註釋!
啟動訪問測試:
./startall.sh
192.168.132.132:8080/solr
192.168.132.132:8081/solr
192.168.132.132:8082/solr
192.168.132.132:8083/solr
把solrhome中的配置檔案上傳到zookeeper叢集,使用zookeeper的客戶端上傳
在solr-4.10.3/example/scripts/cloud-scripts/目錄下執行下面命令:
./zkcli.sh -zkhost 192.168.132.132:2181,192.168.132.132:2182,192.168.132.132:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf
登入zookeeper伺服器查詢配置檔案
cd /usr/local/zookeeper/bin/
./zkCli.sh
6、修改4個solrhome下的solr.xml檔案,指定當前例項執行的ip地址及埠
7、修改每一臺的tomcat的bin目錄下catalina.sh檔案中加入DzkHost指定zookeeper伺服器地址:
JAVA_OPTS="-DzkHost=192.168.132.132:2181,192.168.132.132:2182,192.168.132.132:2183"
啟動tomcat:
./startall.sh
隨便訪問一個就看到左邊多了一個cloud
一主多備,叢集只有一片,目的是要有2片,每片都是一主一備
8、建立一個兩片的collection,每片都是一主一備
在瀏覽器下使用一下命令:
http://192.168.132.132:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
重新再訪問一次叢集:
再把collection1刪除掉就可以了(可以共存多個collection)
http://192.168.132.132:8080/solr/admin/collections?action=DELETE&name=collection1
8、配置業務欄位
在solr中預設是中文分析器,需要手工配置,配置一個FieldType,在FieldType中指定中文分析器。solr中的欄位必須是先定義後使用。
使用IKAnalyzer,把分析器的資料夾拖到伺服器
cd IK Analyzer 2012FF_hf1
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/lib/
把IKAnalyzer需要的擴充套件詞典及停用詞詞典和配置檔案複製到solr工程的classpath
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes/
配置FieldType和業務欄位:
業務欄位判斷標準:
1、在搜尋時是否需要在此欄位上進行搜尋(結合商城例如:商品名稱、賣點、描述)
2、後續的業務是否需要用到此欄位
在/usr/local/solrhome1/collection2/conf/schema.xml:
如果每個solrhome下面沒有collection2就從解壓檔案裡面拷貝過來,並改名為collection2
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
測試:
spring整合:相對於單機版只需要改一下xml配置檔案,如下:
結合工程匯入資料:
http://localhost:8084/search/manager/importall