SolrCloud的搭建以及在Java中的使用(solr叢集)
學習前提:
已掌握Solr單機版的搭建以及使用。未掌握的請參考Solr單機版教程;
什麼是SolrCloud
SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的索引資料量少的時候是不需要使用SolrCloud的,當索引量很大,搜尋請求併發很高,這時需要使用SolrCloud滿足這些需求。
SolrCloud不同於redis叢集自帶叢集,SolrCloud是基於Solr和Zookeeper的分散式搜尋方案,它的主要思想是使用Zookeeper作為叢集的配置資訊中心。
它有幾個特色功能:
1)集中式的配置資訊
2)自動容錯
3)近實時搜尋
4)查詢時自動負載均衡
SolrCloud結構
SolrCloud為了降低單機的處理壓力,需要由多臺伺服器共同來完成索引和搜尋任務。實現的思路是將索引資料進行Shard(分片)拆分,每個分片由多臺的伺服器共同完成,當一個索引或搜尋請求過來時會分別從不同的Shard的伺服器中操作索引。
SolrCloud需要Solr基與zookeeper部署,Zookeeper是一個叢集管理軟體,由於SolrCloud需要由多臺伺服器組成,由zookeeper來進行協調管理。
下圖是一個SolrCloud應用的例子:
物理結構:
三個Solr例項( 每個例項包括兩個Core),組成一個SolrCloud。
邏輯結構:
索引集合包括兩個Shard(shard1和shard2),shard1和shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由zookeeper選舉產生,zookeeper控制每個shard上三個Core的索引資料一致,解決高可用問題。使用者發起索引請求分別從shard1和shard2上獲取,解決高併發問題。
core:
每個Core是Solr中一個獨立執行單位,提供 索引和搜尋服務。一個shard需要由一個Core或多個Core組成。由於collection由多個shard組成所以collection一般由多個core組成。
Master&Slave:
Master是master-slave構中的主結點(通常說主伺服器),Slave是master-slave結構中的從結點(通常說從伺服器或備伺服器)。同一個Shard下master和slave儲存的資料是一致的,這是為了達到高可用目的
SolrCloud搭建
因為沒有很強勁的電腦,開不了8、9臺虛擬機器,所以我這裡採用偽叢集的方式進行安裝,如果是真正的生成環境,將偽叢集的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下:
搭建環境
OS:CentOS 7
JDK:jdk 1.8.0
Tomcat:tomcat 7
zookeeper:zookeeper 3.4.6
solr:solr 4.10.3
安裝包在對應的官網上都能下載到,jdk和tomcat的安裝很簡單,在這裡就不說了。
zookeeper叢集搭建
第一步:解壓zookeeper,tar -zxvf zookeeper-3.4.6.tar.gz然後將解壓得到的zookeeper-3.4.6拷貝到/usr/local/solrcloud下,複製三份分別並將目錄名改為zookeeper01、zookeeper02、zookeeper03
第二步:進入zookeeper01資料夾,建立data目錄。並在data目錄中建立一個myid檔案內容為“1”(echo 1 >>data/myid)。然後分別進入02和03資料夾,進行同樣的操作,把1換成2和3:
第三步:進入zookeeper01/conf資料夾,複製一份zoo_sample.cfg命名為zoo.cfg
cp zoo_sample.cfg zoo.cfg,在三個zookeeper中都執行這個操作
第四步:修改zoo.cfg。
修改:
dataDir=/usr/local/solrcloud/zookeeper1/data
clientPort=2181(zookeeper02中為2182、zookeeper03中為2183)
這個是客戶端連線zookeeper的埠,即zookeeper提供服務的埠
在檔案最後新增:
server.1=192.168.25.150:2881:3881
server.2=192.168.25.150:2882:3882
server.3=192.168.25.150:2883:3883
含義:zookeeper節點列表
server.節點id(myid檔案) = 節點ip : zookeeper節點之間進行通訊的埠 : 節點之間投票選舉的埠
第五步:啟動三個zookeeper
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstart
或者建立批處理檔案:
chmod u+x start-all-zookeeper.sh
執行:
檢視叢集狀態:
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstatus
一個leader,兩個follower
第六步:關閉防火牆,或者開啟zookeeper用到的埠,我這裡選擇的是關閉防火牆,因為埠實在是太多了。
CentOS 7關閉防火牆:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
------------------------------------至此 zookeeper叢集搭建完成------------------------------------
SolrCloud部署
第一步:新建目錄/usr/local/solr-cloud然後複製四分tomcat,並將配置好的單機版solr複製到四臺tomcat中(單機版的solr配置參考前面的連線文章):
第二步:修改tomcat的server.xml,vim tomcat01/conf/server.xml 修改內容:
<Server port="8105"shutdown="SHUTDOWN">
<Connector port="8180"protocol="HTTP/1.1" connectionTimeout="20000" redirect…….
<Connector port="8109" protocol="AJP/1.3"redirectPort="8443" />
另外三臺分別修改為:8205 8280 8209 | 8305 8380 8309 | 8405 8480 8409
第三步:為每一份solr複製一份solrhome,命名為solrhome01 - solrhome04
截至目前,/usr/local/solr-cloud的目錄結構:
三臺zookeeper組成zookeeper叢集;
四臺tomcat上面部署了四分solr;
四個solrhome對應了四分silr;
第四步:修改每一份solr的web.xml,指向正確的solrhome地址:
/usr/local/solr-cloud/tomcat01/webapps/solr/WEB-INF/web.xml
第五步:修改每一份的solrhome配置:solrhome0*/solr.xml
第六步:讓每一臺solr和zookeeper關聯:
修改每一份solr的tomcat的bin目錄下的catalina.sh檔案,加入DzkHost指定zookeeper伺服器地址,將zookeeper地址列表作為引數傳過去:
JAVA_OPTS="-DzkHost=192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183"
注:JAVA_OPTS賦值的位置一定要放在引用該變數之前,可以使用vim查詢功能查詢到JAVA_OPTS的定義位置,然後新增
第七步:使用zookeeper統一管理solr配置檔案:
使用zookeeper統一管理solr的配置檔案(主要是schema.xml、solrconfig.xml),solrCloud各各節點使用zookeeper管理的配置檔案,由於這裡是直接複製的之前單機版配置好的solrhome(添加了一箇中文分詞器,定義了業務域)所以配置檔案就不需要再修改了,直接交給zookeeper管理就好了。
進入/root/solr-4.10.3/example/scripts/cloud-scripts/目錄下:
執行命令:./zkcli.sh -zkhost 192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf
上傳任意一個solrhome下的配置檔案即可。-zkhost:指定zookeeper的地址列表;upconfig :上傳配置檔案;-confdir :指定配置檔案所在目錄;-confname:指定上傳到zookeeper後的目錄名。
登入zookeeper伺服器檢查配置檔案是否上傳成功:
/usr/local/solr-cloud/zookeeper01/bin
./zKCli.sh -server 192.168.25.130:2182
到這裡,solr叢集就搭建完成了,然後啟動所有的solr服務,即啟動四臺tomcat(啟動前需啟動zookeeper叢集),批處理檔案:
檢視啟動狀態:
訪問solrCloud
訪問叢集中的任意一臺solr均可,可以看到相較於單機版,多了一個Cloud:
solrCloud叢集配置
上圖中的collection1叢集只有一片,可以通過下邊的方法配置新的叢集,分為2片。
叢集中有四個solr節點建立新叢集collection2,將叢集分為兩片,每片兩個副本(一主一被):
http://192.168.25.130:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
刪除不使用的collection:
http://192.168.25.130:8180/solr/admin/collections?action=DELETE&name=collection1 執行後原來的collection1刪除:
------------------------------solrCloud叢集搭建及配置完成------------------------------
Java操作solrCloud
在java中操作solrCloud和操作solr一樣,都是通過solrJ,只不過初始化solrServer物件時有點不同:
簡單示例:
@Test
public void testAddDocument() throws Exception {
// zkHost:zookeeper的地址列表
String zkHost = "192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183";
// 建立一個叢集的連線,應該使用CloudSolrServer建立
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
// 設定一個defaultCollection屬性
solrServer.setDefaultCollection("collection2");
// 建立一個文件物件
SolrInputDocument document = new SolrInputDocument();
// 向文件中新增域
document.setField("id", "solrCloud01");
document.setField("item_title", "測試商品01");
document.setField("item_price", 123);
// 把檔案內容寫入索引庫
solrServer.add(document);
// 提交
solrServer.commit();
}
測試結果:
如果要在Spring中使用叢集版本solr,配置如下:
該配置和單機版的配置同時只能存在一份,不然會報不唯一異常!
<!-- 叢集版solrJ,引數為zookeeper的地址列表 -->
<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg index="0" value="192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183"/>
<property name="defaultCollection" value="collection2"/>
</bean>
然後在程式碼中通過:
@Autowired
private SolrServer solrServer;
自動注入即可使用,注入後的使用方法和單機版的是一樣的,Solr單機版教程。
相關推薦
SolrCloud的搭建以及在Java中的使用(solr叢集)
學習前提: 已掌握Solr單機版的搭建以及使用。未掌握的請參考Solr單機版教程;什麼是SolrCloud SolrCloud(solr 雲)是Solr提供的分散式搜尋方案,當你需要大規模,容錯,分散式索引和檢索能力時使用 SolrCloud。當一個系統的
redis叢集環境搭建以及java中jedis客戶端叢集程式碼實現
最近專案中用到了redis,所以就找了相關的資料學習了,然後搭建了redis叢集,以及客戶端的java程式碼實現。由於對linux不太熟悉,所以在Linux上搭建redis叢集的時候碰到了很多問題,下面就大概總結下。 redis相關網站: 作業系統:c
關於SolrCloud(solr叢集)預設日誌配置的一些坑
我們在部署solr叢集的時候,需要在伺服器/userdata/solr-cloud/tomcat-solr01/webapps/solr/WEB-INF/classes目錄中增加log4j.properties日誌 ,而這個log4j.properties在/userdata/solr
java中(優先佇列)PriorityQueue的使用
import java.util.*; public class test1 { public static void PrintPr(Queue<?> queue){ while(queue.peek()!=null){ System.ou
Java多執行緒程式設計-(14)-無鎖CAS操作以及Java中Atomic併發包的“18羅漢”
原文出自 : https://blog.csdn.net/xlgen157387/article/details/78364246 上一篇: Java多執行緒程式設計-(13)- 關於鎖優化的幾點建議 一、背景 通過上面的學習,我們應該很清楚的
java中的 Future詳解(以及ExecutorService中的各種方法)
關於這一塊一前一直是一個盲點,看了看原始碼總結一下把。這一塊內容和執行緒池也是息息相關的執行緒池的頂級介面是Executor介面,裡面只有一個未實現方法是void execute(Runnable command);下來是ExecutorService介面,繼承自Execut
zk叢集搭建以及java客戶端連線zk
專案終於不忙了.閒來無事,想起上次面試被人問了一個zk把我給問住了.看來要好好了解一下zk了.於是開始了zk的學習之路. 首先帶大家搭建一下zk叢集環境,這個很簡單,我就不說那麼詳細了, 首先準備三臺機器,來安裝zk叢集 要有root許可權,因為要改hosts 下
阿里雲伺服器連線以及centos 搭建 web java環境(linux java部署 tomcat部署)
最近弄了個試用阿里雲伺服器倒騰了半天終於部署好,分享一下。 1.登入阿里雲開啟你申請的是雲伺服器的例項: 點選重置密碼---重置密碼後重啟伺服器才能生效(一般需要重置密碼。這裡設定的密碼是使用xhell等工具連結的密碼,使用者名稱為root) 2.點選更
工廠模式(think in java中的設計模式)
org 我們 import lac otf 返回值 類型 int ava 工廠模式:工廠模式是利用工廠類的工廠方法創建對象的一種設計模式,目的是創建對象,但是很多時候創建對象我們會考慮很多其他因素~~~~比如限定輸入,限定返回值是否某個,比如在創建的過程中進行一些判斷,通過
叠代器模式(think in java中的設計模式)
一個 div 封裝 imp 叠代器 方法 println rri 數字 叠代器模式:用來叠代一個容器集合數組的一種模式。可能大家很多時候是用for循環進行叠代的,但是實際上for循環內部不能使用remove方法,但是叠代器可以,這是因為叠代器內部進行了該方法的邏輯處理。同樣
模板方法模式(think in java中的設計模式)
方法 bst pac code pri ack 單點 size clas 模板方法模式:模板方法模式顧名思義就是一種構造模塊化的設計模式。將一次行為分為多種行為,靈活的調用不同模塊進行工作。比如在飯店吃飯,分為:點菜,吃飯,買單等行為無論什麽飯店大致都是這三種行為。因此我們
八大排序算法原理以及Java實現(直接插入排序)
不能 oat 設立 side 堆排 八大排序 算法 line load 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 我們這裏說說八大排序就是內部排序。
Java面試題收集以及參考答案(100道)
str 單元 特殊的表 常見 文件的 邏輯判斷 浮點 類與對象 integer 不積跬步無以至千裏,這裏會不斷收集和更新Java基礎相關的面試題,目前已收集100題。 1.什麽是B/S架構?什麽是C/S架構 B/S(Browser/Server),瀏覽器/服務器程序
流----Java.io包中(精講)
1流 API查詢在Java.io包中。 1.1概述 電流, 水流, 車流 , 流是有起點和終點的有序位元組序列的集合 Java中程式中可能會讀寫檔案內容,需要使用IO流, 這個IO流指java.io包中的相關流類 流的分類: 輸入流/輸出流 是以當前程式為參照, 如果程式從外面讀
MySql儲存過程中傳參和不傳參以及java中呼叫程式碼
資料庫表結構 1.mysql不傳參寫儲存過程 create procedure product() -- product為儲存過程名稱 begin select * from book; end 呼叫此儲存過程為 CALL product
Java併發(十二):CAS Unsafe Atomic 說一說Java的Unsafe類 說一說Java的Unsafe類 Java中Unsafe類詳解 Unsafe與CAS
一、Unsafe Java無法直接訪問底層作業系統,而是通過本地(native)方法來訪問。不過儘管如此,JVM還是開了一個後門,JDK中有一個類Unsafe,它提供了硬體級別的原子操作。 這個類儘管裡面的方法都是public的,但是並沒有辦法使用它們,JDK API文件也沒有提供任何關於這個類的方法的解
redis叢集實戰(單臺機器Windows環境下搭建3主3從redis叢集)
本文主要展示在單臺win10機器上搭建三主三從redis叢集。 搭建過程 主要參考作者: 每天都在變得更好的阿飛 的兩篇部落格 《Redis叢集主從複製(一主兩從)搭建配置教程【Windows環境】》https://blog.csdn.net/u010648555/
Java併發(十九):final實現原理 淺談Java中的final關鍵字
final在Java中是一個保留的關鍵字,可以宣告成員變數、方法、類以及本地變數。 一旦你將引用宣告作final,你將不能改變這個引用了,編譯器會檢查程式碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。 一、final變數 final成員變量表示常量,只能被賦值一次,賦值後值不再改變(fin
Java多執行緒----執行緒的同步,鎖和死鎖,問題以及解決方法(例子說明)
一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他
solr與ik中文分詞的配置,以及新增Core(Add Core)的方式
在下用的版本是solr7.2.1與ikanalyzer-solr6.5: 說明:在solr版本5之後就可以不用依賴tomcat進行啟動,可以自行啟動,啟動方式下面會進行講解。 需要注意的是:對於solr6以下的版本可用jdk7,從solr6開始只能使用jdk8了。 so