1. 程式人生 > >SolrCloud叢集

SolrCloud叢集

什麼是 SolrCloud

SolrCloud(solr 雲)是 Solr 提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用 SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用 SolrCloud 來滿足這些需求。
SolrCloud 是基於 Solr 和 Zookeeper 的分散式搜尋方案,它的主要思想是使用
Zookeeper 作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡

SolrCloud 系統架構這裡寫圖片描述

【1】物理結構
三個 Solr 例項( 每個例項包括兩個 Core),組成一個 SolrCloud。
【2】邏輯結構
索引集合包括兩個 Shard(shard1 和 shard2),shard1 和 shard2 分別由三個 Core
組成,其中一個 Leader 兩個 Replication,Leader 是由 zookeeper 選舉產生,zookeeper 控制每個 shard 上三個 Core 的索引資料一致,解決高可用問題。
使用者發起索引請求分別從 shard1 和 shard2 上獲取,解決高併發問題。
Collection
Collection 在 SolrCloud 叢集中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個 Shard(分片),它們使用相同的配置資訊。
比如:針對商品資訊搜尋可以建立一個 collection。
collection=shard1+shard2+….+shardX
Core
每個 Core 是 Solr 中一個獨立執行單位,提供 索引和搜尋服務。一個 shard 需要由一個Core 或多個 Core 組成。由於 collection 由多個 shard 組成所以 collection 一般由多個core 組成。
Master 或 或 Slave
Master 是 master-slave 結構中的主結點(通常說主伺服器),Slave 是 master-slave 結構
中的從結點(通常說從伺服器或備伺服器)。同一個 Shard 下 master 和 slave 儲存的資料是一致的,這是為了達到高可用目的。
Shard
Collection 的邏輯分片。每個 Shard 被化成一個或者多個 replication,通過選舉確定哪個是Leader。

搭建 SolrCloud

這裡寫圖片描述


Zookeeper 作為叢集的管理工具
1、叢集管理:容錯、負載均衡。
2、配置檔案的集中管理
3、叢集的入口
需要實現 zookeeper 高可用,需要搭建 zookeeper 叢集。建議是奇數節點。需要三個zookeeper 伺服器。
搭建 solr 叢集需要 7 臺伺服器(搭建偽分散式,建議虛擬機器的記憶體 1G 以上):
需要三個 zookeeper 節點
需要四個 tomcat 節點

準備工作
環境準備
CentOS-6.5-i386-bin-DVD1.iso
jdk-7u72-linux-i586.tar.gz
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz

步驟:
(1)搭建 Zookeeper 叢集(我們在上一小節已經完成)
(2)將已經部署完 solr 的 tomcat 的上傳到 linux
(3)在 linux 中建立資料夾 /usr/local/solr-cloud 建立 4 個 tomcat 例項
[[email protected] ~]# mkdir /usr/local/solr-cloud
[[email protected] ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-1
[[email protected] ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-2
[[email protected] ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-3
[[email protected] ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-4
(4)將本地的 solrhome 上傳到 linux
(5)在 linux 中建立資料夾 /usr/local/solrhomes ,將 solrhome 複製 4 份
(6)修改每個 solr 的 web.xml 檔案, 關聯 solrhome

solr/home
/usr/local/solrhomes/solrhome-1
java.lang.String

(7)修改每個 tomcat 的原執行埠 8085 8080 8009 ,分別為
8185 8180 8109
8285 8280 8209
8385 8380 8309
8485 8480 8409

配置叢集

(1)修改每個 tomcat 例項 bin 目錄下的 catalina.sh 檔案
把此配置新增到 catalina.sh 中( 第 234 行 ) :
JAVA_OPTS=”-DzkHost=192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183”
JAVA_OPTS ,顧名思義,是用來設定 JVM 相關執行引數的變數 . 此配置用於在 tomcat 啟動時
找到 zookeeper 叢集。
(2)配置 solrCloud 相關的配置。每個 solrhome 下都有一個 solr.xml,把其中的 ip 及端
口號配置好(是對應的 tomcat 的 IP 和埠)。
solrhomes/solrhome-1/solr.xml

192.168.25.140
8180
h o s t C o n t e x t : s o l r {zkClientTimeout:30000}
g e n e r i c C o r e N o d e N a m e s : t r u e s o l r h o m e s / s o l r h o m e 2 / s o l r . x m l 192.168.25.140 8280 {hostContext:solr}
z k C l i e n t T i m e o u t : 30000 {genericCoreNodeNames:true}

solrhomes/solrhome-3/solr.xml

192.168.25.140
8380
h o s t C o n t e x t : s o l r {zkClientTimeout:30000}
g e n e r i c C o r e N o d e N a m e s : t r u e s o l r h o m e s / s o l r h o m e 4 / s o l r . x m l 192.168.25.140 8480 {hostContext:solr}
z k C l i e n t T i m e o u t : 30000 {genericCoreNodeNames:true}

(3)讓 zookeeper 統一管理配置檔案。需要把 solrhome 下 collection1/conf 目錄上傳到
zookeeper。上傳任意 solrhome 中的配置檔案即可。
我們需要使用 solr 給我們提供的工具上傳配置檔案:
solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
將 solr-4.10.3 壓縮包上傳到 linux,解壓,然後進入 solr-4.10.3/example/scripts/cloud-scripts
目錄 ,執行下列命令
./zkcli.sh -zkhost 192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183 -cmd upconfig
-confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf

引數解釋
-zkhost :指定 zookeeper 地址列表
-cmd :指定命令。upconfig 為上傳配置的命令
-confdir : 配置檔案所在目錄
-confname : 配置名稱

啟動叢集

(1)啟動每個 tomcat 例項。要保證 zookeeper 叢集是啟動狀態。
(2)訪問叢集
位址列輸入 http://192.168.25.140:8180/solr ,可以看到 Solr 叢集版的介面
這裡寫圖片描述

SpringDataSolr 連線 SolrCloud

在 SolrJ 中提供一個叫做 CloudSolrServer 的類,它是 SolrServer 的子類,用於連線 solrCloud
它的構造引數就是 zookeeper 的地址列表,另外它要求要指定 defaultCollection 屬性(預設的 collection 名稱)

我們現在修改 springDataSolrDemo 工程的配置檔案 ,把原來的 solr-server 登出,替換為CloudSolrServer .指定構造引數為地址列表,設定預設 collection 名稱
solr 伺服器地址

<solr:solr-server id="solrServer" url="http://192.168.25.129:8080/solr" />

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg
value="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183" />
<property name="defaultCollection" value="collection1"></property>
</bean>

分片配置

(1)建立新的 Collection 進行分片處理。
在瀏覽器輸入以下地址,可以按照我們的要求 建立新的 Collection
http://192.168.25.140:8180/solr/admin/collections?action=CREATE&name= collection2 &nu
mShards=2&replicationFactor=2
引數:
name :將被建立的集合的名字
numShard s:集合建立時需要建立邏輯碎片的個數
replicationFactor :分片的副本數。
看到這個提示表示成功
(2)刪除不用的 Collection。執行以下命令
http://192.168.25.140:8480/solr/admin/collections?action=DELETE&name=collection1

模擬叢集異常測試

(1)停止第一個 tomcat 節點,看查詢是否能正常工作 – 能!因為還有從節點
(2)停止第三個 tomcat 節點,看看查詢能夠正常工作 – 不能,因為整個一片資料全沒了,無法正常工作。
(3)恢復第三個 tomcat 節點,看看能否正常工作。恢復時間會比較長,大概 2 分半到 3 分鐘之間。請耐心等待。