1. 程式人生 > >SolrCloud的搭建以及在Java中的使用(solr叢集)

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叢集環境搭建以及javajedis客戶端叢集程式碼實現

    最近專案中用到了redis,所以就找了相關的資料學習了,然後搭建了redis叢集,以及客戶端的java程式碼實現。由於對linux不太熟悉,所以在Linux上搭建redis叢集的時候碰到了很多問題,下面就大概總結下。 redis相關網站: 作業系統:c

關於SolrCloudsolr叢集預設日誌配置的一些坑

  我們在部署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操作以及JavaAtomic併發包的“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類 JavaUnsafe類詳解 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中文分詞的配置,以及新增CoreAdd Core的方式

在下用的版本是solr7.2.1與ikanalyzer-solr6.5: 說明:在solr版本5之後就可以不用依賴tomcat進行啟動,可以自行啟動,啟動方式下面會進行講解。 需要注意的是:對於solr6以下的版本可用jdk7,從solr6開始只能使用jdk8了。 so