淘淘商城23_Linux上的操作_solr叢集的搭建、zookeeper叢集的搭建
安裝包連結:
百度網盤:
連結:https://pan.baidu.com/s/13m_kjoZiN2cVH_nIGs0a9w
提取碼:be17
一、概念理解
1. 什麼是SolrCloud
SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud來滿足這些需求。
SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡
2. zookeeper是個什麼玩意?
之前的文章有提到過
顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分散式叢集都用到了zookeeper;Zookeeper:是一個分散式的、開源的程式協調服務,是hadoop專案下的一個子專案。
3. Zookeeper可以幹哪些事情
3.1、配置管理
在我們的應用中除了程式碼外,還有一些就是各種配置。比如資料庫連線等。一般我們都是使用配置檔案的方式,在程式碼中引入這些配置檔案。但是當我們只有一種配置,只有一臺伺服器,並且不經常修改的時候,使用配置檔案是一個很好的做法,但是如果我們配置非常多,有很多伺服器都需要這個配置,而且還可能是動態的話使用配置檔案就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在資料庫裡,然後所有需要配置的服務都去這個資料庫讀取配置。但是,因為很多服務的正常執行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個叢集來提供這個配置服務,但是用叢集提升可靠性,那如何保證配置在叢集中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源專案使用Zookeeper來維護配置,比如在HBase中,客戶端就是連線一個Zookeeper,獲得必要的HBase叢集的配置資訊,然後才可以進一步操作。還有在開源的訊息佇列Kafka中,也使用Zookeeper來維護broker的資訊。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。
3.2、名字服務
名字服務這個就很好理解了。比如為了通過網路訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎麼辦呢?如果我們每臺機器裡都備有一份域名到IP地址的對映,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎麼辦呢?於是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地儲存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這裡提供統一的入口,那麼維護起來將方便得多了。
3.3、分散式鎖
其實在第一篇文章中已經介紹了Zookeeper是一個分散式協調服務。這樣我們就可以利用Zookeeper來協調多個分散式程序之間的活動。比如在一個分散式環境中,為了提高可靠性,我們的叢集的每臺伺服器上都部署著同樣的服務。但是,一件事情如果叢集中的每個伺服器都進行的話,那相互之間就要協調,程式設計起來將非常複雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分散式鎖,在某個時刻只讓一個服務去幹活,當這臺服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分散式系統中都是這麼做,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是採用這種機制。但要注意的是分散式鎖跟同一個程序的鎖還是有區別的,所以使用的時候要比同一個程序裡的鎖更謹慎的使用。
3.4、叢集管理
在分散式的叢集中,經常會由於各種原因,比如硬體故障,軟體故障,網路問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出叢集。這個時候,叢集中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分散式儲存系統,有一箇中央控制節點負責儲存的分配,當有新的儲存進來的時候我們要根據現在叢集目前的狀態來分配儲存節點。這個時候我們就需要動態感知到叢集目前的狀態。還有,比如一個分散式的SOA架構中,服務是一個叢集提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka佇列就採用了Zookeeper作為Cosnumer的上下線管理。
4. Solr叢集的結構
5. Solr叢集的搭建
本教程的這套安裝是單機版的安裝,所以採用偽叢集的方式進行安裝,如果是真正的生產環境,將偽叢集的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下
注:
需要三個zookeeper節點
四個solr節點。
使用偽分散式實現solr叢集。需要三個zookeeper例項,4個tomcat例項,可以在一臺虛擬機器上模擬。
虛擬機器必須得1G以上記憶體。
二、Zookeeper叢集的搭建
1. 前提條件
三個zookeeper例項。Zookeeper也是java開發的所以需要安裝jdk, tomcat,
2. Jdk和tomcat安裝
安裝步驟略之前的文章有詳細步驟,一下是連結:
https://mp.csdn.net/postedit/85229049
3. 把zookeeper的壓縮包上傳到伺服器
4. 解壓縮
5. 建立solrcloud目錄
[[email protected] ~]# mkdir /usr/local/solrcloud
6. 複製解壓好的zookeeper
複製三份zookeeper檔案到這個目錄下,分別建立資料夾1、2、3
[[email protected] ~]# mv zookeeper-3.4.6 /usr/local/solrcloud/zookeeper1
[[email protected] ~]# cd /usr/local/solrcloud/
[[email protected] solrcloud]# ll
total 4
drwxr-xr-x. 10 1000 1000 4096 Feb 20 2014 zookeeper1
[[email protected] solrcloud]# cp -r zookeeper1/ zookeeper2
[[email protected] solrcloud]# cp -r zookeeper1/ zookeeper3
[[email protected] solrcloud]#
三.配置zookeeper
1. 建立data目錄
在每個zookeeper資料夾下建立一個data目錄
進入到zookeeper1資料夾下建立一個目錄
2. 建立myid檔案
進入到data目錄
[[email protected] zookeeper1]# cd data
[[email protected] data]# echo 1 >> myid
[[email protected] data]# cat myid
1
[[email protected] data]#
在餘下兩個資料夾中建立兩個myid檔案
執行以下命令
[[email protected] data]# cd ..
[[email protected] zookeeper1]# cd ..
[[email protected] solrcloud]# mkdir zookeeper2/data
[[email protected] solrcloud]# echo 2 >> zookeeper2/data/myid
[[email protected] solrcloud]# mkdir zookeeper3/data
[[email protected] solrcloud]# echo 3 >> zookeeper3/data/myid
3. 複製zoo_sample.cfg檔案
進入zookeeper的conf目錄下複製zoo_sample.cfg改名字為zoo.cfg
4. 修改zoo.cfg並儲存
[[email protected] conf]# vim zoo.cfg
dataDir=/usr/local/solrcloud/zookeeper1/data/
server.1=192.168.1.107:2881:3881
server.2=192.168.1.107:2882:3882
server.3=192.168.1.107:2883:3883
5. 配置zookeeper2
[[email protected] zookeeper2]# cd conf
[[email protected] conf]# ll
[[email protected] conf]# cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
6. 配置zookeeper3
[[email protected] solrcloud]# cd zookeeper3
[[email protected] zookeeper3]# cd conf
[[email protected] conf]# cp zoo_sample.cfg zoo.cfg
[[email protected] conf]# vim zoo.cfg
7. 啟動zookeeper
進入zookeeper1下的bin目錄下
啟動命令
[[email protected] bin]# ./zkServer.sh start
停止命令:
./zkServer.sh stop
檢視程序:
./zkServer.sh status
8. 測試
啟動其餘的兩個節點檢視狀態
[[email protected] solrcloud]# zookeeper2/bin/zkServer.sh start
檢視狀態
[[email protected] solrcloud]# zookeeper3/bin/zkServer.sh status
四、 Solr例項的搭建
1. 建立4個tomcat例項
修改埠號8080~ 8083
2. 把單機版下的tomcat複製到叢集版的下面
[[email protected] local]# cp -r /usr/local/solr/tomcat/ /usr/local/solrcloud/tomcat1
3. 修改tomcat2埠號
[[email protected] local]# vim /usr/local/solrcloud/tomcat2/conf/server.xml
4. 修改tomcat3埠號
5. 修改tomcat4埠號
6. 建立啟動和關閉tomcat和zookeeper的指令碼
6.1 關閉指令碼
[[email protected] solrcloud]# vim shutdownall.sh
將以下的新增進去:
zookeeper1/bin/zkServer.sh stop
zookeeper2/bin/zkServer.sh stop
zookeeper3/bin/zkServer.sh stop
tomcat1/bin/shutdown.sh
tomcat2/bin/shutdown.sh
tomcat3/bin/shutdown.sh
tomcat4/bin/shutdown.sh
儲存
:wq
授權
[[email protected] solrcloud]# chmod +x shutdownall.sh
6.2 啟動指令碼
[[email protected] solrcloud]# vim startall.sh
zookeeper1/bin/zkServer.sh start
zookeeper2/bin/zkServer.sh start
zookeeper3/bin/zkServer.sh start
tomcat1/bin/startup.sh
tomcat2/bin/startup.sh
tomcat3/bin/startup.sh
tomcat4/bin/startup.sh
儲存
:wq
授權
chmod +x shutdownall.sh
[[email protected] solrcloud]# chmod +x startall.sh
7. 複製單機版的solrhome資料夾到叢集資料夾solrcloud下
[[email protected] local]# cd solr
[[email protected] solr]# ll
total 8
drwxr-xr-x. 4 root root 4096 Oct 12 16:19 solrhome
drwxr-xr-x. 9 root root 4096 Oct 12 15:13 tomcat
[[email protected] solr]# cp -r solrhome/ ../solrcloud/solrhome1
[[email protected] solr]# cp -r solrhome/ ../solrcloud/solrhome2
[[email protected] solr]# cp -r solrhome/ ../solrcloud/solrhome3
[[email protected] solr]# cp -r solrhome/ ../solrcloud/solrhome4
8. 修改每個tomcat下sorl專案的web.xml檔案
8.1 修改tomcat1下的
[[email protected] solrcloud]# vim tomcat1/webapps/solr/WEB-INF/web.xml
/usr/local/solrcloud/solrhome1
8.2 修改tomcat2下的
8.3 修改tomcat3下的
8.4 修改tomcat4下的
9. 啟動tomcat
[[email protected] solrcloud]# ./startall.sh
檢視tomcat啟動日誌
[[email protected] solrcloud]# tail -f tomcat1/logs/catalina.out
10. 訪問主頁
http://192.168.1.107:8081/solr/#/
五、solr叢集的搭建
1. 上傳solrhome檔案
把solrhome中的配置檔案上傳到zookeeper叢集。使用zookeeper的客戶端上傳。
在sorl的解壓包下:
[[email protected] cloud-scripts]# pwd
/root/solr-4.10.3/example/scripts/cloud-scripts
[[email protected] cloud-scripts]#
客戶端命令位置:/root/solr-4.10.3/example/scripts/cloud-scripts
執行命令:裡面的ip有需要可以替換
./zkcli.sh -zkhost 192.168.1.107:2181,192.168.1.107:2182,192.168.1.107:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf
2. 檢查是否上傳成功
進入到zookeeper1下的資料夾看
使用.zkCli.sh這個命令看
[[email protected] bin]# ./zkCli.sh
3. 修改solrhome下的solr.xml檔案
修改solrhome下的solr.xml檔案,指定當前例項執行的ip地址及埠號。
3.1 修改solrhome1
[[email protected] solrcloud]# vim solrhome1/solr.xml
3.2 修改solrhome2
3.3 修改solrhome3
3.4 修改solrhome4
4. 修改tomcat
修改每一臺solr的tomcat 的 bin目錄下catalina.sh檔案中加入DzkHost指定zookeeper伺服器地址:
JAVA_OPTS="-DzkHost=192.168.1.107:2181,192.168.1.107:2182,192.168.1.107:2183"
注意:因為我是在自己的電腦上配置的多個Tomcat,所以ip是一致的,但是如果在公司的話,ip就可能不一致了
(可以使用vim的查詢功能查詢到JAVA_OPTS的定義的位置,然後新增)
給每一個tomcat都得加這個配置
4.1 修改Tomcat1
[[email protected] solrcloud]# vim tomcat1/bin/catalina.sh
搜尋JAVA_OPTS必須得新增到這個位置,因為下面的程式碼有用到
4.2 修改 tomcat2,tomcat3,tomcat4同上
5. 重新啟動tomcat
一個主節點多個備份節點,叢集只有一片。
6. 建立兩片collection
建立一個兩片的collection,每片是一主一備。
使用以下命令建立:
http://192.168.1.107:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
7. 刪除多餘節點
刪除collection1.
http://192.168.1.107:8080/solr/admin/collections?action=DELETE&name=collection1
六、Solr叢集的使用
1. Solrj測試
public class SolrCloudTest {
@Test
public void testAddDocument() throws Exception {
//建立一個和solr叢集的連線
//引數就是zookeeper的地址列表,使用逗號分隔
String zkHost = "192.168.1.107:2181,192.168.1.107:2182,192.168.1.107:2183";
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//設定預設的collection
solrServer.setDefaultCollection("collection2");
//建立一個文件物件
SolrInputDocument document = new SolrInputDocument();
//向文件中新增域
document.addField("id", "test001");
document.addField("item_title", "測試商品");
//把文件新增到索引庫
solrServer.add(document);
//提交
solrServer.commit();
}
@Test
public void deleteDocument() throws SolrServerException, IOException {
//建立一個和solr叢集的連線
//引數就是zookeeper的地址列表,使用逗號分隔
String zkHost = "192.168.1.107:2181,192.168.1.107:2182,192.168.1.107:2183";
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//設定預設的collection
solrServer.setDefaultCollection("collection2");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
}
2. Solrj和spring整合
修改spring的配置檔案,新增叢集版的配置:applictionContext-solr.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置SolrServer物件 -->
<!-- 單機版 -->
<!-- <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg name="baseURL" value="${SOLR.SERVER.URL}"></constructor-arg>
</bean> -->
<!-- 叢集版 --><!-- 裡面的ip可根據實際情況改變 -->
<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg name="zkHost" value="192.168.1.107:2181,192.168.1.107:2182,192.168.1.107:2183"></constructor-arg>
<property name="defaultCollection" value="collection2"></property>
</bean>
</beans>
啟動專案後:
在後臺就可以看到taotao-search這個工程,一直在跳動,說明資料正在匯入到索引庫
開啟搜尋介面:資料已經出現,說明新增成功
不要在意我的ip的變化,因為我寫這篇文章時沒有在同一個地方,只要你的不變就可以了
在淘淘商城首頁搜尋“手機”,會明顯發現搜尋速度變快了不少,因為這是直接在索引庫中查詢的