搭建SolrCloud的詳細步驟
目錄

一、需求

SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。
當一個系統的索引資料量少的時候是不需要使用SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心。

它有幾個特色功能:
集中式的配置資訊
自動容錯
近實時搜尋
查詢時自動負載均衡
需要實現的solr叢集架構

需要實現的solr叢集架構

Zookeeper作為叢集的管理工具。
叢集管理:容錯、負載均衡。
配置檔案的集中管理
叢集的入口

為實現zookeeper 高可用,需要搭建叢集。建議是奇數節點,最少需要三個zookeeper伺服器。

搭建solr叢集需要7臺伺服器。

搭建偽分散式:
需要三個zookeeper節點
需要四個tomcat節點。

環境準備:
CentOS-6.5-i386-bin-DVD1.iso
jdk-7u72-linux-i586.tar.gz(建議虛擬機器的記憶體1G以上。)
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz

二、Zookeeper叢集搭建

第一步:在Linux下,需要安裝jdk環境。
第二步:把zookeeper的壓縮包上傳到伺服器。
第三步:解壓縮。
第四步:把zookeeper複製三份。
[[email protected] ~]# mkdir /usr/local/solr-cloud
[[email protected] ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper01
[[email protected] ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper02
[[email protected] ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper03
第五步:在每個zookeeper目錄下建立一個data目錄。
第六步:在data目錄下建立一個myid檔案,檔名就叫做“myid”。
內容就是每個例項的id。這裡分別為1、2、3
[[email protected] data]# echo 1 >> myid
(建立一個名為myid的檔案,並向檔案中加入1,另外兩個同理,也可用touch myid建立檔案,vim myid 向檔案中寫入)
[[email protected] data]# ll
total 4
-rw-r--r--. 1 root root 2 Apr  7 18:23 myid
[[email protected] data]# cat myid 
1
第七步:修改配置檔案。把conf目錄下的zoo_sample.cfg檔案改名為zoo.cfg
[[email protected] zookeeper01]# cd conf
[[email protected] conf]# ll
總用量 12
-rw-r--r--. 1 root root  535 3月  22 08:43 configuration.xsl
-rw-r--r--. 1 root root 2161 3月  22 08:43 log4j.properties
-rw-r--r--. 1 root root  922 3月  22 08:43 zoo_sample.cfg
修改:
[[email protected] conf]# mv zoo_sample.cfg zoo.cfg
[[email protected] conf]# ll
總用量 12
-rw-r--r--. 1 root root  535 3月  22 08:43 configuration.xsl
-rw-r--r--. 1 root root 2161 3月  22 08:43 log4j.properties
-rw-r--r--. 1 root root  922 3月  22 08:43 zoo.cfg
修改每個例項的配置檔案:zoo.cfg
[[email protected] conf]# vim zoo.cfg 
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/solr-cloud/zookeeper01/data/(當前例項的data目錄)
# the port at which the clients will connect
clientPort=2181(埠號,不能重複2181,2182,2183)
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.25.130:2881:3881
server.2=192.168.25.130:2882:3882
server.3=192.168.25.130:2883:3883
(每個例項的都一樣)
~
~
第八步:啟動每個zookeeper例項(啟動之後先不要關閉,後面搭建solr叢集的時候要用到)
[[email protected] solr-cloud]# ll
總用量 12
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper01
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper02
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper03
啟動指令碼:
[[email protected] solr-cloud]# vim start-zookeeper.sh
cd zookeeper01/bin
./zkServer.sh start
cd ../../
cd zookeeper02/bin
./zkServer.sh start
cd ../../
cd zookeeper03/bin
./zkServer.sh start
cd ../../
"start-zookeeper.sh" [新] 9L, 147C 已寫入                                                             
[[email protected] solr-cloud]# ll
總用量 16
-rw-r--r--.  1 root root  147 3月  22 09:24 start-zookeeper.sh
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper01
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper02
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper03
[[email protected] solr-cloud]# chmod  x start-zookeeper.sh
啟動:
[[email protected] solr-cloud]# ./start-zookeeper.sh 
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[[email protected] solr-cloud]#
狀態指令碼:
[[email protected] solr-cloud]# vim status-zookeeper.sh
cd zookeeper01/bin
./zkServer.sh status
cd ../../
cd zookeeper02/bin
./zkServer.sh status
cd ../../
cd zookeeper03/bin
./zkServer.sh status
cd ../../
"status-zookeeper.sh" [新] 9L, 150C 已寫入                                                            
[[email protected] solr-cloud]# chmod  x status-zookeeper.sh 
檢視狀態:
[[email protected] solr-cloud]# ./status-zookeeper.sh 
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Mode: leader
[[email protected] solr-cloud]#

從上面的狀態可以看出zookeeper03為內部選舉出來的leadder。

zookeeper叢集搭建成功!

三、Solr叢集的搭建

第一步:建立四個tomcat例項。每個tomcat執行在不同的埠。8180、8280、8380、8480
[[email protected] ~]# cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat01
[[email protected] ~]# cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat02
[[email protected] ~]# cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat03
[[email protected] ~]# cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat04
[[email protected] solr-cloud]# vim tomcat01/conf/server.xml
進行如下修改:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

其他tomcat操作一樣,埠不能衝突。
vim tomcat02/conf/server.xml(8205、8280、8209)
vim tomcat03/conf/server.xml(8305、8380、8309)
vim tomcat04/conf/server.xml(8405、8480、8409)
第二步:部署solr的war包。把單機版的solr工程複製到叢集中的tomcat中(首先要已經安裝好單機版的solr)。
cp -r ../tomcat/apache-tomcat-7.0.52/webapps/solr/ tomcat01/webapps/
cp -r ../tomcat/apache-tomcat-7.0.52/webapps/solr/ tomcat02/webapps/
cp -r ../tomcat/apache-tomcat-7.0.52/webapps/solr/ tomcat03/webapps/
cp -r ../tomcat/apache-tomcat-7.0.52/webapps/solr/ tomcat04/webapps/
第三步:為每個solr例項建立一個對應的solrhome。使用單機版的solrhome複製四份(首先要已經安裝好單機版的solrhome)。
[[email protected] solr-cloud]# cp -r ../solrhome/solr/ solrhome01/
[[email protected] solr-cloud]# cp -r ../solrhome/solr/ solrhome02/
[[email protected] solr-cloud]# cp -r ../solrhome/solr/ solrhome03/
[[email protected] solr-cloud]# cp -r ../solrhome/solr/ solrhome04/
[[email protected] solr-cloud]# ll
總用量 52
drwxr-xr-x.  4 root root 4096 3月  22 10:07 solrhome01
drwxr-xr-x.  4 root root 4096 3月  22 10:07 solrhome02
drwxr-xr-x.  4 root root 4096 3月  22 10:07 solrhome03
drwxr-xr-x.  4 root root 4096 3月  22 10:07 solrhome04
-rwxr-xr-x.  1 root root  147 3月  22 09:24 start-zookeeper.sh
-rwxr-xr-x.  1 root root  150 3月  22 09:31 status-zookeeper.sh
drwxr-xr-x.  9 root root 4096 3月  22 10:04 tomcat01
drwxr-xr-x.  9 root root 4096 3月  22 09:45 tomcat02
drwxr-xr-x.  9 root root 4096 3月  22 09:45 tomcat03
drwxr-xr-x.  9 root root 4096 3月  22 09:45 tomcat04
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper01
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper02
drwxr-xr-x. 11 root root 4096 3月  22 08:46 zookeeper03
第四步:需要修改solr的web.xml檔案。把solrhome關聯起來。
[[email protected] solr-cloud]# vim tomcat01/webapps/solr//WEB-INF/web.xml

這裡寫圖片描述

其他三個同理

第五步:配置solrCloud相關的配置。每個solrhome下都有一個solr.xml,把其中的ip及埠號配置好。

這裡寫圖片描述

    host:Linux的ip
hostPort:分別為tomcat的埠號8180、8280、8380、8480
第六步:修改tomcat/bin目錄下的catalina.sh (237行)檔案,關聯solr和zookeeper。
把此配置新增到配置檔案中(每個tomcat中都加):
JAVA_OPTS="-DzkHost=192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183"

這裡寫圖片描述

第七步:讓zookeeper統一管理配置檔案。需要把solrhome/collection1/conf目錄上傳到zookeeper。上傳任意solrhome中的配置檔案即可。
使用工具上傳配置檔案:/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
./zkcli.sh -zkhost 192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183
-cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf
檢視zookeeper上的配置檔案:
使用zookeeper目錄下的bin/zkCli.sh命令檢視zookeeper上的配置檔案:
[[email protected] bin]# ./zkCli.sh (預設連到2181,指定:./zkCli.sh -server 192.168.25.130:2182)
[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
[admin-extra.menu-top.html, currency.xml, protwords.txt, mapping-FoldToASCII.txt,
_schema_analysis_synonyms_english.json, _rest_managed.json, solrconfig.xml, 
_schema_analysis_stopwords_english.json, stopwords.txt, lang, spellings.txt, mapping-ISOLatin1Accent.txt,
admin-extra.html, xslt, synonyms.txt, scripts.conf, update-script.js,
velocity, elevate.xml, admin-extra.menu-bottom.html, clustering, schema.xml]
退出:
[zk: localhost:2181(CONNECTED) 3] quit
第八步:啟動每個tomcat。(zookeeper叢集為啟動狀態)
建立指令碼啟動:
[[email protected] solr-cloud]# vim start-tomcat.sh
/usr/local/solr-cloud/tomcat01/bin/startup.sh
/usr/local/solr-cloud/tomcat02/bin/startup.sh
/usr/local/solr-cloud/tomcat03/bin/startup.sh
/usr/local/solr-cloud/tomcat04/bin/startup.sh
第九步:開啟Linux的埠號,供外部訪問。
solr:
/sbin/iptables -I INPUT -p tcp --dport 8180 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8280 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8380 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8480 -j ACCEPT
zookeeper:
/sbin/iptables -I INPUT -p tcp --dport 2181 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 2182 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 2183 -j ACCEPT
/etc/rc.d/init.d/iptables save
檢視狀態:
/etc/init.d/iptables status

圖片去旅遊了

solr叢集搭建成功!

第十步:訪問叢集。
地址:192.168.25.130:8180/solr

這裡寫圖片描述

第十一步:建立新的Collection進行分片處理。

http://192.168.25.130:8180/solr/admin/collections?
action=CREATE&name=collection2&numShards=2&replicationFactor=2
成功:

這裡寫圖片描述

這裡寫圖片描述

第十二步:刪除不用的Collection。
http://192.168.25.130:8180/solr/admin/collections?action=DELETE&name=collection1

這裡寫圖片描述

這裡寫圖片描述

SolrCloud搭建成功……

測試

@Test
public void addDocument() throws Exception {
// 建立一個SolrServer物件,需要使用CloudSolrServer子類。構造方法的引數是zookeeper的地址列表。
CloudSolrServer solrServer = new CloudSolrServer("192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183");
// 設定DefaultCollection屬性
solrServer.setDefaultCollection("collection2");
// 建立SolrInputDocument物件
SolrInputDocument document = new SolrInputDocument();
// 向文件物件中新增域
document.addField("id", "test001");
document.addField("item_title", "測試商品");
// 把文件物件寫入索引庫
solrServer.add(document);
// 提交
solrServer.commit();
}