1. 程式人生 > >Linux Centos 搭建 SolrCloud 分散式

Linux Centos 搭建 SolrCloud 分散式

SolrCloud簡介

在這裡插入程式碼片SolrCloud(solr 雲)是 Solr 提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用 SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用 SolrCloud 來滿足這些需求。
SolrCloud 是基於 SolrZookeeper的分散式搜尋方案,它的主要思想是使用 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節點,看看能否正常工作。–能!因為節點重新恢復了。