SolrCloud詳解及搭建

1. 什么是SolrCloud

1.1. 什么是SolrCloud

? ? ? ? ? ??SolrCloud(solr 云)是Solr提供的分布式搜索方案,當你需要大規模,容錯,分布式索引和檢索能力時使用SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求并發很高,這時需要使用SolrCloud來滿足這些需求。

? ? ? ? SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。

? ? ? ? 它有幾個特色功能:

? ? ? ? 1)集中式的配置信息

? ? ? ? 2)自動容錯

? ? ? ? 3)近實時搜索

? ? ? ? 4)查詢時自動負載均衡

1.1.1.??zookeeper是個什么玩意?

? ? ? ? 顧名思義zookeeper就是動物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一個分布式的、開源的程序協調服務,是hadoop項目下的一個子項目。

1.1.2.??Zookeeper可以干哪些事情

1、配置管理

? ? ? ?在我們的應用中除了代碼外,還有一些就是各種配置。比如數據庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一臺服務器,并且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多服務器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在數據庫里,然后所有需要配置的服務都去這個數據庫讀取配置。但是,因為很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢?這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然后才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。

2、名字服務

? ? ? ?名字服務這個就很好理解了。比如為了通過網絡訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎么辦呢?如果我們每臺機器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎么辦呢?于是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什么。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這里提供統一的入口,那么維護起來將方便得多了。

3、分布式鎖

? ? ? ?其實在第一篇文章中已經介紹了Zookeeper是一個分布式協調服務。這樣我們就可以利用Zookeeper來協調多個分布式進程之間的活動。比如在一個分布式環境中,為了提高可靠性,我們的集群的每臺服務器上都部署著同樣的服務。但是,一件事情如果集群中的每個服務器都進行的話,那相互之間就要協調,編程起來將非常復雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務去干活,當這臺服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分布式系統中都是這么做,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是采用這種機制。但要注意的是分布式鎖跟同一個進程的鎖還是有區別的,所以使用的時候要比同一個進程里的鎖更謹慎的使用。

4、集群管理

? ? ? ?在分布式的集群中,經常會由于各種原因,比如硬件故障,軟件故障,網絡問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。這個時候,集群中其他機器需要感知到這種變化,然后根據這種變化做出對應的決策。比如我們是一個分布式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集群目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集群目前的狀態。還有,比如一個分布式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要采用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就采用了Zookeeper作為Cosnumer的上下線管理。

1.2. SolrCloud結構

? ? ? ? SolrCloud為了降低單機的處理壓力,需要由多臺服務器共同來完成索引和搜索任務。實現的思路是將索引數據進行Shard(分片)拆分,每個分片由多臺的服務器共同完成,當一個索引或搜索請求過來時會分別從不同的Shard的服務器中操作索引。

? ? ? ? SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一個集群管理軟件,由于SolrCloud需要由多臺服務器組成,由zookeeper來進行協調管理。

下圖是一個SolrCloud應用的例子:

對上圖進行圖解,如下:

1.2.1. 物理結構

? ? ? ?三個Solr實例( 每個實例包括兩個Core),組成一個SolrCloud。

1.2.2. 邏輯結構

? ? ? ?索引集合包括兩個Shard(shard1和shard2),shard1和shard2分別由三個Core組成,其中一個Leader兩個Replication,Leader是由zookeeper選舉產生,zookeeper控制每個shard上三個Core的索引數據一致,解決高可用問題。

? ? ? ?用戶發起索引請求分別從shard1和shard2上獲取,解決高并發問題。

1.1.1.1. ?Collection

? ? ? ?Collection在SolrCloud集群中是一個邏輯意義上的完整的索引結構。它常常被劃分為一個或多個Shard(分片),它們使用相同的配置信息。

? ? ? ? 比如:針對商品信息搜索可以創建一個collection。

? ? ? ? collection=shard1+shard2+....+shardX

1.1.1.2. ?Core

? ? ? ? 每個Core是Solr中一個獨立運行單位,提供索引和搜索服務。一個shard需要由一個Core或多個Core組成。由于collection由多個shard組成所以collection一般由多個core組成。

1.1.1.3. ?Master或Slave

? ? ? ? ?Master是master-slave結構中的主結點(通常說主服務器),Slave是master-slave結構中的從結點(通常說從服務器或備服務器)。同一個Shard下master和slave存儲的數據是一致的,這是為了達到高可用目的。

1.1.1.4. ?Shard

? ? ? ? ?Collection的邏輯分片。每個Shard被化成一個或者多個replication,通過選舉確定哪個是Leader。

2. SolrCloud搭建

? ? ? ? ?本教程的這套安裝是單機版的安裝,所以采用偽集群的方式進行安裝,如果是真正的生產環境,將偽集群的ip改下就可以了,步驟是一樣的。

SolrCloud結構圖如下:

?

2.1 環境準備

?

? ? ? ? ??CentOS-6.4-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

2.2 環境安裝

2.2.1 CentOs6.4安裝

?

2.2.2 jdk7安裝

2.2.3 zookeeper集群安裝

?

第一步:解壓zookeeper,tar -zxvf zookeeper-3.4.6.tar.gz將zookeeper-3.4.6拷貝到/usr/local/solrcloud下,復制三份分別并將目錄名改為zookeeper1、zookeeper2、zookeeper3

第二步:進入zookeeper1文件夾,創建data目錄。并在data目錄中創建一個myid文件內容為“1”(echo 1 >>data/myid)。

第三步:進入conf文件夾,把zoo_sample.cfg改名為zoo.cfg

第四步:修改zoo.cfg。

修改:

dataDir=/usr/local/solrcloud/zookeeper1/data

clientPort=2181(zookeeper2中為2182、zookeeper3中為2183)

添加:

server.1=192.168.25.154:2881:3881

server.2=192.168.25.154:2882:3882

server.3=192.168.25.154:2883:3883

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/usr/local/solrcloud/zookeeper1/data

# the port at which the clients will connect

clientPort=2181

# the maximum number of client connections.

# increase this if you need to handle more clients

#maxClientCnxns=60

#

# Be sure to read the maintenance section of the

# administrator guide before turning on autopurge.

#

# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

# The number of snapshots to retain in dataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to "0" to disable auto purge feature

#autopurge.purgeInterval=1

server.1=192.168.25.154:2881:3881

server.2=192.168.25.154:2882:3882

server.3=192.168.25.154:2883:3883

?

第五步:對zookeeper2、3中的設置做第二步至第四步修改。

zookeeper2:

myid內容為2

dataDir=/usr/local/solrcloud/zookeeper2/data

clientPort=2182

Zookeeper3:

的myid內容為3

dataDir=/usr/local/solrcloud/zookeeper3/data

clientPort=2183

第六步:啟動三個zookeeper

/usr/local/solrcloud/zookeeper1/bin/zkServer.shstart

/usr/local/solrcloud/zookeeper2/bin/zkServer.shstart

/usr/local/solrcloud/zookeeper3/bin/zkServer.shstart

查看集群狀態:

/usr/local/solrcloud/zookeeper1/bin/zkServer.shstatus

/usr/local/solrcloud/zookeeper2/bin/zkServer.shstatus

/usr/local/solrcloud/zookeeper3/bin/zkServer.shstatus

第七步:開啟zookeeper用到的端口,或者直接關閉防火墻。

service iptables stop

2.3 tomcat安裝

第一步:將apache-tomcat-7.0.47.tar.gz解壓

? ? ? ? ? ? ? tar-zxvf apache-tomcat-7.0.47.tar.gz

第二步:把解壓后的tomcat復制到/usr/local/solrcloud/目錄下復制四份。

? ? ? ? ? ? ? /usr/local/solrcloud/tomcat1

? ? ? ? ? ? ? /usr/local/solrcloud/tomcat2

? ? ? ? ? ? ? /usr/local/solrcloud/tomcat3

? ? ? ? ? ? ? /usr/local/solrcloud/tomcat4

第三步:修改tomcat的server.xml

? ? ? ? ? ? ? vim tomcat2/conf/server.xml,把其中的端口后都加一。保證兩個tomcat可以正常運行不發生端口沖突。

2.4. SolrCloud部署

2.4.1. 啟動zookeeper

? ? ? ? solrCloud部署依賴zookeeper,需要先啟動每一臺zookeeper服務器。

2.5.2.??zookeeper管理配置文件

? ? ? ? 由于zookeeper統一管理solr的配置文件(主要是schema.xml、solrconfig.xml), solrCloud各各節點使用zookeeper管理的配置文件。

? ? ? ? 將上邊部署的solr單機的conf拷貝到/home/solr下。

? ? ? ? 執行下邊的命令將/home/solr/conf下的配置文件上傳到zookeeper(此命令為單條命令,雖然很長o(╯□╰)o)。此命令在solr-4.10.3/example/scripts/cloud-scripts/目錄下:

./zkcli.sh -zkhost 192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf


? ? ? ? 登陸zookeeper服務器查詢配置文件:

? ? ? ? cd /usr/local/zookeeper/bin/

? ? ? ? ./zkCli.sh?

2.5.3.??修改SolrCloud監控端口

修改每個solrhome的solr.xml文件。將host改成虛擬機ip地址,port改成對應的tomcat的端口號。

2.5.4.??每一臺solr和zookeeper關聯

修改每一臺solr的tomcat 的 bin目錄下catalina.sh文件中加入DzkHost指定zookeeper服務器地址:

JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"

(可以使用vim的查找功能查找到JAVA_OPTS的定義的位置,然后添加)

2.5.5.??啟動所有的solr服務

啟動每一臺solr的tomcat服務。

2.5.6.??訪問solrcloud

訪問任意一臺solr,左側菜單出現Cloud:

?

?

2.5.7 SolrCloud集群配置

上圖中的collection1集群只有一片,可以通過下邊的方法配置新的集群。

?

如果集群中有四個solr節點創建新集群collection2,將集群分為兩片,每片兩個副本。

http://192.168.25.154:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

?

?

刪除集群命令;

http://192.168.25.154:8080/solr/admin/collections?action=DELETE&name=collection1

執行后原來的collection1刪除,如下:

更多的命令請參數官方文檔:apache-solr-ref-guide-4.10.pdf

2.5.8.??啟動solrCloud注意

啟動solrCloud需要先啟動solrCloud依賴的所有zookeeper服務器,再啟動每臺solr服務器。

3.??solrJ訪問solrCloud

publicclass SolrCloudTest {// zookeeper地址privatestatic String zkHostString ="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";// collection默認名稱,比如我的solr服務器上的collection是collection2_shard1_replica1,就是去掉“_shard1_replica1”的名稱privatestatic String defaultCollection ="collection1";// cloudSolrServer實際private CloudSolrServercloudSolrServer;// 測試方法之前構造 CloudSolrServer@Beforepublicvoid init() {cloudSolrServer = new CloudSolrServer(zkHostString);cloudSolrServer.setDefaultCollection(defaultCollection);cloudSolrServer.connect();}// 向solrCloud上創建索引@TestpublicvoidtestCreateIndexToSolrCloud() throws SolrServerException,IOException {SolrInputDocument document =newSolrInputDocument();document.addField("id","100001");document.addField("title","李四");cloudSolrServer.add(document);cloudSolrServer.commit();}// 搜索索引@TestpublicvoidtestSearchIndexFromSolrCloud() throws Exception {SolrQuery query = new SolrQuery();query.setQuery("*:*");try {QueryResponse response =cloudSolrServer.query(query);SolrDocumentList docs =response.getResults();System.out.println("文檔個數:" +docs.getNumFound());System.out.println("查詢時間:" +response.getQTime());for (SolrDocumentdoc : docs) {ArrayList title= (ArrayList) doc.getFieldValue("title");String id = (String)doc.getFieldValue("id");System.out.println("id: " + id);System.out.println("title: " + title);System.out.println();}} catch (SolrServerException e){e.printStackTrace();} catch (Exception e) {System.out.println("Unknowned Exception!!!!");e.printStackTrace();}}// 刪除索引@TestpublicvoidtestDeleteIndexFromSolrCloud() throws SolrServerException, IOException {// 根據id刪除UpdateResponse response=cloudSolrServer.deleteById("zhangsan");// 根據多個id刪除// cloudSolrServer.deleteById(ids);// 自動查詢條件刪除// cloudSolrServer.deleteByQuery("product_keywords:教程");// 提交cloudSolrServer.commit();}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Intellij IDEA 快捷鍵整理

【常規】CtrlShift Enter,語句完成“!”,否定完成,輸入表達式時按 “!”鍵CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftClick,可以關閉文件Ctrl[ OR ],可以跑到大括…

談談Java開發中的對象拷貝

在Java開發工作中,有很多時候我們需要將不同的兩個對象實例進行屬性復制,從而基于源對象的屬性信息進行后續操作,而不改變源對象的屬性信息。這兩個對象實例有可能是同一個類的兩個實例,也可能是不同類的兩個實例,但是…

gitmaven命令

git命令 git diff #查看差異 git push origin feature/recover_pwd_bug #推送 git commit -m ‘perf #重置密碼邏輯優化 git log #查看提交版本號 git reset --hard <版本號> #本地回退到相應的版本 git push origin <分支名> --force #遠端的倉庫也回退到相應…

【算法系列之一】二叉樹最小深度

題目&#xff1a; 給定一個二叉樹&#xff0c;找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 返回它的最小深度 2. 答案&#xf…

【算法系列之二】反波蘭式

問題&#xff1a; 用反波蘭式表示算術表達式的值。 有效運算符是,-,*,/。每個操作數可以是一個整數或另一個表達式。 一些例子&#xff1a; ["2", "1", "", "3", "*"] -> ((2 1) * 3) -> 9["4", "13…

【算法系列之三】單鏈表反轉

問題&#xff1a; 實現單鏈表反轉 答案&#xff1a; 鏈表準備 class Node {private int Data;// 數據域private Node Next;// 指針域public Node(int Data) {// super();this.Data Data;}public int getData() {return Data;}public void setData(int Data) {this.Data D…

Java常見異常總結

1、java.lang.NullPointerException(空指針異常)   調用了未經初始化的對象或者是不存在的對象 經常出現在創建圖片&#xff0c;調用數組這些操作中&#xff0c;比如圖片未經初始化&#xff0c;或者圖片創建時的路徑錯誤等等。對數組操作中出現空指針&#xff0c; 即把數組的…

從數據庫表中隨機獲取N條記錄的SQL語句

Oracle: select * from (select * from tableName order by dbms_random.value) where rownum < N; MS SQLServer: select top N * from tableName order by newid(); My SQL: select * from tableName order by rand() limit N; 轉自&#xff1a;http://blog.csdn.net/sent…

Linux下的MySQL安裝及卸載

1.1 查看mysql的安裝路徑&#xff1a; [rootbogon ~]# whereis mysql mysql: /usr/bin/mysql /usr/lib/mysql/usr/share/mysql /usr/share/man/man1/mysql.1.gz 1.2 查看mysql的安裝包&#xff1a; [rootbogon ~]# rpm -qa|grep mysql mysql-community-client-5.6.26-2.…

mysql explain用法

explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法&#xff0c;在select語句前加上explain就可以了&#xff0c;如&#xff1a;explain select * from statuses_status where id11;創建測試表&#xff1a;CR…

Linux 性能檢查命令總結

如果你的Linux服務器突然負載暴增&#xff0c;告警短信快發爆你的手機&#xff0c;如何在最短時間內找出Linux性能問題所在&#xff1f;

線程池的各種使用場景

&#xff08;1&#xff09;高并發、任務執行時間短的業務&#xff0c;線程池線程數可以設置為CPU核數1&#xff0c;減少線程上下文的切換 &#xff08;2&#xff09;并發不高、任務執行時間長的業務要區分開看&#xff1a; a&#xff09;假如是業務時間長集中在IO操作上…

Java線程面試題 Top 50

不管你是新程序員還是老手&#xff0c;你一定在面試中遇到過有關線程的問題。Java語言一個重要的特點就是內置了對并發的支持&#xff0c;讓Java大受企業和程序員的歡迎。大多數待遇豐厚的Java開發職位都要求開發者精通多線程技術并且有豐富的Java程序開發、調試、優化經驗&…

深入理解Semaphore

使用 Semaphore是計數信號量。Semaphore管理一系列許可證。每個acquire方法阻塞&#xff0c;直到有一個許可證可以獲得然后拿走一個許可證&#xff1b;每個release方法增加一個許可證&#xff0c;這可能會釋放一個阻塞的acquire方法。然而&#xff0c;其實并沒有實際的許可證這…

【算法系列之四】柱狀圖儲水

題目&#xff1a; 給定一個數組&#xff0c;每個位置的值代表一個高度&#xff0c;那么整個數組可以看做是一個直方圖&#xff0c; 如果把這個直方圖當作容器的話&#xff0c;求這個容器能裝多少水 例如&#xff1a;3&#xff0c;1&#xff0c;2&#xff0c;4 代表第一個位…

鹽城大數據產業園人才公寓_岳西大數據產業園規劃設計暨建筑設計方案公布,搶先一睹效果圖...

近日&#xff0c;岳西縣大數據產業園規劃設計暨建筑設計方案公布。岳西縣大數據產業園項目總占地面積17014.10㎡(約合25.52畝)&#xff0c;擬建總建筑面積約為61590.84㎡(地上建筑面積39907.49㎡&#xff0c;地下建筑面積21602.35㎡)。以“科技圓環”為主題&#xff0c;組建出一…

【算法系列之五】對稱二叉樹

給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1/ \2 2/ \ / \ 3 4 4 3但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1/ \2 2\ \3 3 說明: 如果你可以運用遞歸和迭代兩種方法解決這個問題&a…

【算法系列之六】兩整數之和

不使用運算符 和 - &#xff0c;計算兩整數 a 、b 之和。 示例 1: 輸入: a 1, b 2 輸出: 3示例 2: 輸入: a -2, b 3 輸出: 1 方法一&#xff1a;遞歸 public static int getSum1(int a, int b) {if ((a & b) ! 0) { // 判斷是否有進位return getSum1(a ^ b, (a &…

cuda默認函數與c++沖突_好程序員Python教程系列-第8講:函數和模塊

好程序員Python教程系列-第8講&#xff1a;函數和模塊&#xff0c;在講解本章節的內容之前&#xff0c;我們先來研究一道數學題&#xff0c;請說出下面的方程有多少組正整數解。事實上&#xff0c;上面的問題等同于將8個蘋果分成四組每組至少一個蘋果有多少種方案&#xff0c;所…

【算法系列之七】合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 示例&#xff1a; 輸入&#xff1a;1->2->4, 1->3->4 輸出&#xff1a;1->1->2->3->4->4/*** Definition for singly-linked list.* public cla…