Linux Centos 搭建 SolrCloud 分散式
SolrCloud簡介
在這裡插入程式碼片SolrCloud(solr 雲)是 Solr 提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用 SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用 SolrCloud 來滿足這些需求。
SolrCloud 是基於 Solr
和Zookeeper
的分散式搜尋方案,它的主要思想是使用 Zookeeper作為叢集的配置資訊中心。
SolurCloud主要有以下幾個特色功能
- 集中式的配置資訊
- 自動容錯
- 近實時搜尋
- 查詢時自動負載均衡
SolorCloud系統架構
1、物理結構
三個 Solr 例項( 每個例項包括兩個 Core),組成一個 SolrCloud。
2、邏輯結構
索引集合包括兩個 Shard(shard1 和 shard2),shard1 和 shard2 分別由三個 Core 組成,其中一個 Leader 兩個 Replication,Leader 是由 zookeeper 選舉產生,zookeeper 控制每個shard上三個 Core 的索引資料一致,解決高可用問題。
使用者發起索引請求分別從 shard1 和 shard2 上獲取,解決高併發問題。
2.1、Collection
Collection 在 SolrCloud 叢集中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個 Shard(分片),它們使用相同的配置資訊。
比如:針對商品資訊搜尋可以建立一個 collection。
collection=shard1+shard2+…+shardX
2.2、Core
每個 Core 是 Solr 中一個獨立執行單位,提供索引和搜尋服務。一個 shard 需要由一個Core 或多個 Core 組成。由於 collection 由多個 shard 組成所以 collection 一般由多個 core 組成。
2.3、Master或 Slave
Master 是 master-slave 結構中的主結點(通常說主伺服器),Slave 是 master-slave 結構中的從結點(通常說從伺服器或備伺服器)。同一個 Shard 下 master 和 slave 儲存的資料是一致的,這是為了達到高可用目的。
2.4、Shard
Collection 的邏輯分片。每個 Shard 被化成一個或者多個 replication,通過選舉確定哪個是 Leader。
搭建SolrCloud
本次搭建的solor架構
Zookeeper作為叢集管理工具
1、叢集管理:容錯、負載均衡。
2、配置檔案的集中管理
3、叢集的入口
需要實現 zookeeper 高可用,需要搭建zookeeper叢集。建議是奇數節點。需要三個 zookeeper 伺服器。
- 搭建 solr 叢集需要 7 臺伺服器(這裡同樣是偽分散式)
- 需要三個Zookeeper節點
- 需要四個Tomcat節點。
準備工作
1、環境準備
- Linux Centos伺服器(本次使用騰訊雲)
- JDK1.8
- Tomcat8.5
- Zookeeper3.4.10
- Solor4.10.3
2、搭建步驟
2.1、搭建Zookeeper叢集(已單獨搭建好,請參考上篇文章:連結地址)
2.2、上傳部署完成Solor的tomcat的上傳到伺服器(Solor部署請參考我的SOlor搭建:連結地址)
2.3、在伺服器上建立資料夾 /usr/local/solr-cloud
建立4個tomcat例項
mkdir /usr/local/solr-cloud
cp -r apache-tomcat-solr /usr/local/solr-cloud/tomcat-1
cp -r apache-tomcat-solr /usr/local/solr-cloud/tomcat-2
cp -r apache-tomcat-solr /usr/local/solr-cloud/tomcat-3
cp -r apache-tomcat-solr /usr/local/solr-cloud/tomcat-4
2.4、上傳solorhome到伺服器
2.5、在伺服器建立資料夾 /usr/local/solrhomes
,將solrhome複製4份
mkdir /usr/local/solrhomes
cp -r solrhome /usr/local/solrhomes/solrhome-1
cp -r solrhome /usr/local/solrhomes/solrhome-2
cp -r solrhome /usr/local/solrhomes/solrhome-3
cp -r solrhome /usr/local/solrhomes/solrhome-4
2.6、修改每個solr的web.xml檔案,關聯solrhome,對應目錄/usr/local/solr-cloud/tomcat-1/webapps/solr/WEB-INF/web.xml
,每個tomcat的對應每個solorhome。
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solrhomes/solrhome-1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
2.7、修改每個tomcat的埠,原埠分別為 8085 8080 8009。對應目錄/usr/local/solr-cloud/tomcat-1/conf/server.xml
。
8005埠是用來關閉TOMCAT服務的埠。
8080埠,負責建立HTTP連線。在通過瀏覽器訪問Tomcat伺服器的Web應用時,使用的就是這個聯結器。
8009埠,負責和其他的HTTP伺服器建立連線。在把Tomcat與其他HTTP伺服器整合時,就需要用到這個聯結器。
修改:tomcat-1 8185 8180 8109
修改:tomcat-2 8285 8280 8209
修改:tomcat-3 8385 8380 8309
修改:tomcat-4 8485 8480 8409
每個一一對應
<Server port="8105" shutdown="SHUTDOWN">
<Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
叢集配置
1、修改每個tomcat例項bin目錄下的 catalina.sh
檔案。
新增以下配置(位置大概在230到300行之間)
JAVA_OPTS="-DzkHost=119.29.181.129:2181,119.29.181.129:2182,119.29.181.129:2183"
- JAVA_OPTS 是用來設定JVM相關執行引數的變數。此配置用於在tomcat啟動時找到 zookeeper叢集。
2、配置好solrCloud相關的配置,第個solrhome下都有一個solr.xml,把IP及埠號配置好(對應的是tomcat的IP和埠) - /usr/local/solrhomes/solrhome-1/solr.xml
<solrcloud>
<str name="host">119.29.181.129</str>
<int name="hostPort">8180</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
- /usr/local/solrhomes/solrhome-2/solr.xml
<solrcloud>
<str name="host">119.29.181.129</str>
<int name="hostPort">8480</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
- /usr/local/solrhomes/solrhome-3/solr.xml
<solrcloud>
<str name="host">119.29.181.129</str>
<int name="hostPort">8480</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
- /usr/local/solrhomes/solrhome-4/solr.xml
<solrcloud>
<str name="host">119.29.181.129</str>
<int name="hostPort">8480</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
3、讓 zookeeper 統一管理配置檔案。需要把 solrhome下collection1/conf 目錄上傳到zookeeper。上傳任意 solrhome 中的配置檔案即可。
這裡我們需要使用到solr提供的工具上傳配置檔案,下載solr-4.10.3解壓,進到solr-4.10.3/example/scripts/cloud-scripts
目錄
wget http://archive.apache.org/dist/lucene/solr/4.10.3/solr-4.10.3.tgz
tar -xzvf solr-4.10.3.taz
cd solr-4.10.3/example/scripts/cloud-scripts
執行命令
./zkcli.sh -zkhost 119.29.181.129:2181,119.29.181.129:2182,119.29.181.129:2183 -cmd upconfig -confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf
引數解釋
-zkhost:指定zookeeper地址列表
-cmd:指定命令。upconfig 為上傳配置的命令
-confdir:配置檔案所在目錄
-confname:配置名稱
啟動叢集
1、啟動每個tomcat例項,要保證Zookeeper叢集是啟動狀態。
這邊需要注意一個問題,需要給solr-cloud
資料夾授權,不授權的情況下不能執行啟動檔案。
chmod -R 777 solr-cloud
看到變成綠色即可執行
啟動
tomcat-1/bin/startup.sh
tomcat-2/bin/startup.sh
tomcat-3/bin/startup.sh
tomcat-4/bin/startup.sh
2、訪問叢集
位址列輸入 http://ip:8180/solr,可以看到以下介面,就說明搭建成功。
此時可以看到有一個主節點,三個從節點。
SpringDataSolr連線SolorCloud
在SolorJ中提供一個叫做CloudSolrServer的類,它是SolrServer的子類,用於連線solrCloud 它的構造引數就是zookeeper的地址列表,另外它要求要指定defaultCollection屬性(預設的 collection名稱)
修改工程的Solor配置檔案
<!-- solr叢集伺服器地址 -->
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg value="119.29.181.129:2181,119.29.181.129:2182,119.29.181.129:2183"></constructor-arg>
<property name="defaultCollection" value="collection1"></property>
</bean>
<!-- solr模板,使用solr模板可對索引庫進行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
分片配置
1、建立新的 Collection 進行分片處理,在瀏覽器輸入以下地址,可以按照我們的要求 建立新的Collection。
http://119.29.181.129:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
引數解釋
- name:將被建立的集合的名字
- numShards:集合建立時需要建立邏輯碎片的個數
- replicationFactor:分片的副本數。
看到success表示分片成功
2、刪除不用的 Collection1。執行命令
http://119.29.181.129:8180/solr/admin/collections?action=DELETE&name=collection1
刪除成功會看到
模擬叢集異常測試
1、停止第一個tomcat節點,看查詢是否能正常工作 – 能!因為還有從節點
2、停止第三個tomcat節點,看看查詢能夠正常工作 – 不能,因為整個一片資料全沒了,無法正常工作。
3、恢復第三個tomcat節點,看看能否正常工作。–能!因為節點重新恢復了。