1. SolrCloud介紹
1.1. 什麼是SolrCloud
SolrCloud(solr 雲)是Solr提供的分佈式搜索方案,當你需要大規模,容錯,分佈式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求併發很高,這時需要使用SolrCloud來滿足這些需求。
SolrCloud是基於Solr和Zookeeper的分佈式搜索方案,它的主要思想是使用Zookeeper作爲集羣的配置信息中心。
它有幾個特色功能:
1)集中式的配置信息
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡
1.2. zookeeper是個什麼玩意?
顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分佈式集羣都用到了zookeeper;Zookeeper:是一個分佈式的、開源的程序協調服務,是hadoop項目下的一個子項目。
1.3. Zookeeper可以幹哪些事情
1.3.1. 配置管理
在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一臺服務器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多服務器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在數據庫裏,然後所有需要配置的服務都去這個數據庫讀取配置。但是,因爲很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集羣來提供這個配置服務,但是用集羣提升可靠性,那如何保證配置在集羣中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集羣的配置信息,然後纔可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。
1.3.2. 名字服務
名字服務這個就很好理解了。比如爲了通過網絡訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎麼辦呢?如果我們每臺機器裏都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎麼辦呢?於是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這裏提供統一的入口,那麼維護起來將方便得多了。
1.3.3. 分佈式鎖
其實在第一篇文章中已經介紹了Zookeeper是一個分佈式協調服務。這樣我們就可以利用Zookeeper來協調多個分佈式進程之間的活動。比如在一個分佈式環境中,爲了提高可靠性,我們的集羣的每臺服務器上都部署着同樣的服務。但是,一件事情如果集羣中的每個服務器都進行的話,那相互之間就要協調,編程起來將非常複雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分佈式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分佈式系統中都是這麼做,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是採用這種機制。但要注意的是分佈式鎖跟同一個進程的鎖還是有區別的,所以使用的時候要比同一個進程裏的鎖更謹慎的使用。
1.3.4. 集羣管理
在分佈式的集羣中,經常會由於各種原因,比如硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集羣。這個時候,集羣中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分佈式存儲系統,有一箇中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集羣目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集羣目前的狀態。還有,比如一個分佈式的SOA架構中,服務是一個集羣提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之爲服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作爲服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper作爲Cosnumer的上下線管理。
1.4. SolrCloud結構
SolrCloud爲了降低單機的處理壓力,需要由多臺服務器共同來完成索引和搜索任務。實現的思路是將索引數據進行Shard(分片)拆分,每個分片由多臺的服務器共同完成,當一個索引或搜索請求過來時會分別從不同的Shard的服務器中操作索引。
SolrCloud需要Solr基於Zookeeper部署,Zookeeper是一個集羣管理軟件,由於SolrCloud需要由多臺服務器組成,由zookeeper來進行協調管理。
下圖是一個SolrCloud應用的例子:
對上圖進行圖解,如下:
1.4.1. 物理結構
三個Solr實例( 每個實例包括兩個Core),組成一個SolrCloud。
1.4.2. 邏輯結構
索引集合包括兩個Shard(shard1和shard2),shard1和shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由zookeeper選舉產生,zookeeper控制每個shard上三個Core的索引數據一致,解決高可用問題。
用戶發起索引請求分別從shard1和shard2上獲取,解決高併發問題。
1. collection
Collection在SolrCloud集羣中是一個邏輯意義上的完整的索引結構。它常常被劃分爲一個或多個Shard(分片),它們使用相同的配置信息。
比如:針對商品信息搜索可以創建一個collection。
collection=shard1+shard2+....+shardX
2. Core
每個Core是Solr中一個獨立運行單位,提供 索引和搜索服務。一個shard需要由一個Core或多個Core組成。由於collection由多個shard組成所以collection一般由多個core組成。
3. Master或Slave
Master是master-slave結構中的主結點(通常說主服務器),Slave是master-slave結構中的從結點(通常說從服務器或備服務器)。同一個Shard下master和slave存儲的數據是一致的,這是爲了達到高可用目的。
4. Shard
Collection的邏輯分片。每個Shard被化成一個或者多個replication,通過選舉確定哪個是Leader。
2. SolrCloud搭建
2.1. 架構分析
本課程的這套安裝是單機版的安裝,所以採用僞集羣的方式進行安裝,如果是真正的生產環境,將僞集羣的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下:
2.1.1. 集羣分成兩大部分:
1. zookeeper集羣
a) zookeeper需要保證高可用,需要搭建集羣
b) zookeeper需要進行投票和選舉機制,最少需要三個節點
c) zookeeper的三個節點,注意修改端口號不一樣
2. Solr的集羣
a) 需要四個節點
b) 整個core分成兩個分片,每個分片都由兩個服務器組成,master和slave
c) 每個Tomcat有一個solr服務
2.1.2. 環境:
CentOS 6.5 32位
jdk1.7
單機版的虛擬機內存最好是1G以上
2.2. zookeeper集羣搭建
2.2.1. 複製三份zookeeper
[root@itcast-01 WEB-INF]# cd /usr/local/
[root@itcast-01 local]# cp zookeeper-3.4.6.tar.gz solr/solr-cloud/
[root@itcast-01 local]# cd solr/solr-cloud/
[root@itcast-01 solr-cloud]# tar -zxf zookeeper-3.4.6.tar.gz
[root@itcast-01 solr-cloud]# mv zookeeper-3.4.6 zookeeper01
[root@itcast-01 solr-cloud]# cp -r zookeeper01/ zookeeper02
[root@itcast-01 solr-cloud]# cp -r zookeeper01/ zookeeper03
2.2.2. 配置zookeeper
1. 給每個zookeeper的解壓目錄創建data文件夾
[root@itcast-01 solr-cloud]# mkdir zookeeper01/data
[root@itcast-01 solr-cloud]# mkdir zookeeper02/data
[root@itcast-01 solr-cloud]# mkdir zookeeper03/data
2. 給每個zookeeper的解壓目錄創建myid文件,並分別寫入1,2,3
[root@itcast-01 solr-cloud]# vim zookeeper01/data/myid
1
[root@itcast-01 solr-cloud]# vim zookeeper01/data/myid
2
[root@itcast-01 solr-cloud]# vim zookeeper01/data/myid
3
3. 給每個zookeeper的配置文件改名
[root@itcast-01 solr-cloud]# mv zookeeper01/conf/zoo_sample.cfg zookeeper01/conf/zoo.cfg
[root@itcast-01 solr-cloud]# mv zookeeper02/conf/zoo_sample.cfg zookeeper02/conf/zoo.cfg
[root@itcast-01 solr-cloud]# mv zookeeper03/conf/zoo_sample.cfg zookeeper03/conf/zoo.cfg
4. 修改每個zookeeper的配置文件
[root@itcast-01 solr-cloud]# vim zookeeper01/conf/zoo.cfg
[root@itcast-01 solr-cloud]# vim zookeeper02/conf/zoo.cfg
[root@itcast-01 solr-cloud]# vim zookeeper03/conf/zoo.cfg
修改dataDir和端口號
底部加上:
server.1=192.168.25.154:2881:3881
server.2=192.168.25.154:2882:3882
server.3=192.168.25.154:2883:3883
效果
2.2.3. 啓動zookeeper
[root@itcast-01 solr-cloud]# zookeeper01/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@itcast-01 solr-cloud]# zookeeper02/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@itcast-01 solr-cloud]# zookeeper03/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.2.4. 查看狀態
[root@itcast-01 solr-cloud]# ./zookeeper01/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper01/bin/../conf/zoo.cfg
Mode: follower
[root@itcast-01 solr-cloud]# ./zookeeper02/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper02/bin/../conf/zoo.cfg
Mode: leader
[root@itcast-01 solr-cloud]# ./zookeeper03/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/solr/solr-cloud/zookeeper03/bin/../conf/zoo.cfg
Mode: follower
2.3. 搭建單機版solr服務
2.3.1. 安裝jdk
2.3.2. 安裝Tomcat
1. 上傳
按alt+p進入SFTP界面,進行上傳
sftp> put -r "C:\0423\07taotao\01課前資料\02技術資料\tomcat\apache-tomcat-7.0.47.tar.gz"
2. 解壓
[root@itcast-01 ~]# tar -zxf apache-tomcat-7.0.47.tar.gz
3. 移動
[root@itcast-01 ~]# mkdir /usr/local/solr
[root@itcast-01 ~]# mv apache-tomcat-7.0.47 /usr/local/solr/tomcat
2.3.3. 安裝solr單機版
5. 上傳solr
按alt+p進入SFTP界面,進行上傳
sftp> put -r "C:\0423\07taotao\01課前資料\02技術資料\Solr\solr-4.10.3.tgz.tgz"
6. 移動solr
[root@itcast-01 ~]# mv solr-4.10.3.tgz.tgz /usr/local/solr/
7. 解壓solr
[root@itcast-01 ~]# cd /usr/local/solr/
[root@itcast-01 solr]# tar -zxf solr-4.10.3.tgz.tgz
8. 把solr部署到Tomcat
1. 複製Tomcat並刪除webapps內所有文件,創建ROOT目錄
[root@itcast-01 example]# cd /usr/local/solr/tomcat/webapps/
[root@itcast-01 webapps]# rm -rf *
[root@itcast-01 webapps]# mkdir ROOT
2. 部署solr.war到Tomcat中
[root@itcast-01 webapps]# cp /usr/local/solr/solr-4.10.3/example/webapps/solr.war ROOT/
[root@itcast-01 webapps]# cd ROOT
[root@itcast-01 ROOT]# jar -xf solr.war
3. 刪除war包
[root@itcast-01 ROOT]# rm -f solr.war
4. 把solr-4.10.2/example/lib/ext目錄下的所有的jar包,添加到solr工程中
[root@itcast-01 ROOT]# cd /usr/local/solr/solr-4.10.3/example/lib/ext/
[root@itcast-01 ext]# cp * /usr/local/solr/tomcat/webapps/ROOT/WEB-INF/lib/
9. 創建solrhome
/example/solr目錄就是一個solrhome。複製此目錄到/usr/local/solr/solrhome
[root@itcast-01 ext]# cd /usr/local/solr/solr-4.10.3/example/
[root@itcast-01 example]# cp -r solr /usr/local/solr/solrhome
10. 準備自己的業務域
根據業務需求,添加中文分詞jar包,修改自己的solrcore的schema.xml配置文件的業務域等等。
例如schema.xml增加內容如下:
<!-- IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="item_title" type="string" 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_cid" type="long" indexed="false" stored="true" />
<field name="item_status" type="int" indexed="true" stored="false" />
2.4. solr集羣搭建
solr的集羣應該有4個solr服務
2.4.1. 把solrhome複製到solr-cloud目錄下,複製四份。
[root@itcast-01 example]# cd /usr/local/solr/
[root@itcast-01 solr]# mkdir solr-cloud/
[root@itcast-01 solr]# cp -r solrhome/ solr-cloud/solrhome01
[root@itcast-01 solr]# cp -r solrhome/ solr-cloud/solrhome02
[root@itcast-01 solr]# cp -r solrhome/ solr-cloud/solrhome03
[root@itcast-01 solr]# cp -r solrhome/ solr-cloud/solrhome04
2.4.2. 安裝4個Tomcat ,其實就是複製4個Tomcat
其實就是複製4分之前準備的4個solr單機版
[root@itcast-01 solr]# cp -r tomcat/ solr-cloud/tomcat-solr01
[root@itcast-01 solr]# cp -r tomcat/ solr-cloud/tomcat-solr02
[root@itcast-01 solr]# cp -r tomcat/ solr-cloud/tomcat-solr03
[root@itcast-01 solr]# cp -r tomcat/ solr-cloud/tomcat-solr04
2.4.3. 修改Tomcat端口號8081~8084
[root@itcast-01 solr]# cd solr-cloud/
[root@itcast-01 solr-cloud]# vim tomcat-solr01/conf/server.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr02/conf/server.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr03/conf/server.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr04/conf/server.xml
需要修改3個地方的端口號,
如下圖第一個Tomcat爲例,修改三個端口號8001,8081,8011,其他Tomcat類似
2.4.4. 修改每個Tomcat中solr服務的web.xml
4個Tomcat都要修改爲對應的solrhome
[root@itcast-01 solr-cloud]# vim tomcat-solr01/webapps/ROOT/WEB-INF/web.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr02/webapps/ROOT/WEB-INF/web.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr03/webapps/ROOT/WEB-INF/web.xml
[root@itcast-01 solr-cloud]# vim tomcat-solr04/webapps/ROOT/WEB-INF/web.xml
修改各自的solrhome
例如/usr/local/solr/solr-cloud/solrhome01
2.4.5. 修改4個solrhome裏面的solr.xml,設置運行的端口號
[root@itcast-01 solr-cloud]# vim solrhome01/solr.xml
[root@itcast-01 solr-cloud]# vim solrhome02/solr.xml
[root@itcast-01 solr-cloud]# vim solrhome03/solr.xml
[root@itcast-01 solr-cloud]# vim solrhome04/solr.xml
例如solrhome01需要修改爲8081,其他類似
2.4.6. 把配置文件上傳到zookeeper集羣
進入/usr/local/solr/solr-4.10.3/example/scripts/cloud-scripts,執行命令
[root@itcast-01 solr-cloud]# cd /usr/local/solr/solr-4.10.3/example/scripts/cloud-scripts
需要運行的以下命令,需要修改IP地址和修改solrcore的路徑地址
[root@itcast-01 cloud-scripts]# ./zkcli.sh -zkhost 192.168.37.161:3181,192.168.37.161:3182,192.168.37.161:3183 -cmd upconfig -confdir /usr/local/solr/solr-cloud/solrhome01/collection1/conf -confname myconf
zookeeper是做配置文件的集中管理,
以上命令的作用是把配置文件上傳給zookeeper,由zookeeper管理配置文件
zookeeper把所有的solr集羣的配置文件進行統一管理
2.4.7. 查看zookeeper中的配置文件
進入任意zookeeper,使用客戶端進行查看
[root@itcast-01 cloud-scripts]# cd /usr/local/solr/solr-cloud/zookeeper01/bin
[root@itcast-01 bin]# ./zkCli.sh -server 192.168.37.161:3181
使用ls命令查看zookeeper配置信息
2.4.8. 設置zookeeper的地址給Tomcat
需要修改每個Tomcat的bin/catalina.sh文件
[root@itcast-01 bin]# cd /usr/local/solr/solr-cloud/
[root@itcast-01 solr-cloud]# vim tomcat-solr01/bin/catalina.sh
[root@itcast-01 solr-cloud]# vim tomcat-solr02/bin/catalina.sh
[root@itcast-01 solr-cloud]# vim tomcat-solr03/bin/catalina.sh
[root@itcast-01 solr-cloud]# vim tomcat-solr04/bin/catalina.sh
例如Tomcat01,其他Tomcat都一樣設置,添加JAVA_OPTS
JAVA_OPTS="-DzkHost=192.168.37.161:3181,192.168.37.161:3182,192.168.37.161:3183"
2.4.9. 啓動所有的Tomcat
[root@itcast-01 solr-cloud]# ./tomcat-solr01/bin/startup.sh
[root@itcast-01 solr-cloud]# ./tomcat-solr02/bin/startup.sh
[root@itcast-01 solr-cloud]# ./tomcat-solr03/bin/startup.sh
[root@itcast-01 solr-cloud]# ./tomcat-solr04/bin/startup.sh
2.4.10. 訪問solr集羣
訪問任意一個solr集羣的節點都可以
例如http://192.168.37.161:8081/solr
2.4.11. 集羣分片
如果集羣中有四個solr節點創建新集羣collection2,將集羣分爲兩片,每片一個副本。
http://192.168.37.161:8081/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
效果
2.4.12. 刪除原來的solrcore
http://192.168.37.161:8081/solr/admin/collections?action=DELETE&name=collection1
效果