SolrCloud详解及搭建
1. 什么是SolrCloud
1.1. 什么是SolrCloud
? ? ? ? ? ??SolrCloud(solr 云)是Solr提供的分布式搜索方案,當(dāng)你需要大規(guī)模,容錯(cuò),分布式索引和檢索能力時(shí)使用SolrCloud。當(dāng)一個(gè)系統(tǒng)的索引數(shù)據(jù)量少的時(shí)候是不需要使用SolrCloud的,當(dāng)索引量很大,搜索請(qǐng)求并發(fā)很高,這時(shí)需要使用SolrCloud來滿足這些需求。
? ? ? ? SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。
? ? ? ? 它有幾個(gè)特色功能:
? ? ? ? 1)集中式的配置信息
? ? ? ? 2)自動(dòng)容錯(cuò)
? ? ? ? 3)近實(shí)時(shí)搜索
? ? ? ? 4)查詢時(shí)自動(dòng)負(fù)載均衡
1.1.1.??zookeeper是個(gè)什么玩意?
? ? ? ? 顧名思義zookeeper就是動(dòng)物園管理員,他是用來管hadoop(大象)、Hive(蜜蜂)、pig(小豬)的管理員, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一個(gè)分布式的、開源的程序協(xié)調(diào)服務(wù),是hadoop項(xiàng)目下的一個(gè)子項(xiàng)目。
1.1.2.??Zookeeper可以干哪些事情
1、配置管理
? ? ? ?在我們的應(yīng)用中除了代碼外,還有一些就是各種配置。比如數(shù)據(jù)庫(kù)連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當(dāng)我們只有一種配置,只有一臺(tái)服務(wù)器,并且不經(jīng)常修改的時(shí)候,使用配置文件是一個(gè)很好的做法,但是如果我們配置非常多,有很多服務(wù)器都需要這個(gè)配置,而且還可能是動(dòng)態(tài)的話使用配置文件就不是個(gè)好主意了。這個(gè)時(shí)候往往需要尋找一種集中管理配置的方法,我們?cè)谶@個(gè)集中的地方修改了配置,所有對(duì)這個(gè)配置感興趣的都可以獲得變更。比如我們可以把配置放在數(shù)據(jù)庫(kù)里,然后所有需要配置的服務(wù)都去這個(gè)數(shù)據(jù)庫(kù)讀取配置。但是,因?yàn)楹芏喾?wù)的正常運(yùn)行都非常依賴這個(gè)配置,所以需要這個(gè)集中提供配置服務(wù)的服務(wù)具備很高的可靠性。一般我們可以用一個(gè)集群來提供這個(gè)配置服務(wù),但是用集群提升可靠性,那如何保證配置在集群中的一致性呢?這個(gè)時(shí)候就需要使用一種實(shí)現(xiàn)了一致性協(xié)議的服務(wù)了。Zookeeper就是這種服務(wù),它使用Zab這種一致性協(xié)議來提供一致性。現(xiàn)在有很多開源項(xiàng)目使用Zookeeper來維護(hù)配置,比如在HBase中,客戶端就是連接一個(gè)Zookeeper,獲得必要的HBase集群的配置信息,然后才可以進(jìn)一步操作。還有在開源的消息隊(duì)列Kafka中,也使用Zookeeper來維護(hù)broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實(shí)現(xiàn)服務(wù)治理。
2、名字服務(wù)
? ? ? ?名字服務(wù)這個(gè)就很好理解了。比如為了通過網(wǎng)絡(luò)訪問一個(gè)系統(tǒng),我們得知道對(duì)方的IP地址,但是IP地址對(duì)人非常不友好,這個(gè)時(shí)候我們就需要使用域名來訪問。但是計(jì)算機(jī)是不能是別域名的。怎么辦呢?如果我們每臺(tái)機(jī)器里都備有一份域名到IP地址的映射,這個(gè)倒是能解決一部分問題,但是如果域名對(duì)應(yīng)的IP發(fā)生變化了又該怎么辦呢?于是我們有了DNS這個(gè)東西。我們只需要訪問一個(gè)大家熟知的(known)的點(diǎn),它就會(huì)告訴你這個(gè)域名對(duì)應(yīng)的IP是什么。在我們的應(yīng)用中也會(huì)存在很多這類問題,特別是在我們的服務(wù)特別多的時(shí)候,如果我們?cè)诒镜乇4娣?wù)的地址的時(shí)候?qū)⒎浅2环奖?#xff0c;但是如果我們只需要訪問一個(gè)大家都熟知的訪問點(diǎn),這里提供統(tǒng)一的入口,那么維護(hù)起來將方便得多了。
3、分布式鎖
? ? ? ?其實(shí)在第一篇文章中已經(jīng)介紹了Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù)。這樣我們就可以利用Zookeeper來協(xié)調(diào)多個(gè)分布式進(jìn)程之間的活動(dòng)。比如在一個(gè)分布式環(huán)境中,為了提高可靠性,我們的集群的每臺(tái)服務(wù)器上都部署著同樣的服務(wù)。但是,一件事情如果集群中的每個(gè)服務(wù)器都進(jìn)行的話,那相互之間就要協(xié)調(diào),編程起來將非常復(fù)雜。而如果我們只讓一個(gè)服務(wù)進(jìn)行操作,那又存在單點(diǎn)。通常還有一種做法就是使用分布式鎖,在某個(gè)時(shí)刻只讓一個(gè)服務(wù)去干活,當(dāng)這臺(tái)服務(wù)出問題的時(shí)候鎖釋放,立即fail over到另外的服務(wù)。這在很多分布式系統(tǒng)中都是這么做,這種設(shè)計(jì)有一個(gè)更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是采用這種機(jī)制。但要注意的是分布式鎖跟同一個(gè)進(jìn)程的鎖還是有區(qū)別的,所以使用的時(shí)候要比同一個(gè)進(jìn)程里的鎖更謹(jǐn)慎的使用。
4、集群管理
? ? ? ?在分布式的集群中,經(jīng)常會(huì)由于各種原因,比如硬件故障,軟件故障,網(wǎng)絡(luò)問題,有些節(jié)點(diǎn)會(huì)進(jìn)進(jìn)出出。有新的節(jié)點(diǎn)加入進(jìn)來,也有老的節(jié)點(diǎn)退出集群。這個(gè)時(shí)候,集群中其他機(jī)器需要感知到這種變化,然后根據(jù)這種變化做出對(duì)應(yīng)的決策。比如我們是一個(gè)分布式存儲(chǔ)系統(tǒng),有一個(gè)中央控制節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)的分配,當(dāng)有新的存儲(chǔ)進(jìn)來的時(shí)候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲(chǔ)節(jié)點(diǎn)。這個(gè)時(shí)候我們就需要?jiǎng)討B(tài)感知到集群目前的狀態(tài)。還有,比如一個(gè)分布式的SOA架構(gòu)中,服務(wù)是一個(gè)集群提供的,當(dāng)消費(fèi)者訪問某個(gè)服務(wù)時(shí),就需要采用某種機(jī)制發(fā)現(xiàn)現(xiàn)在有哪些節(jié)點(diǎn)可以提供該服務(wù)(這也稱之為服務(wù)發(fā)現(xiàn),比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務(wù)發(fā)現(xiàn)的底層機(jī)制)。還有開源的Kafka隊(duì)列就采用了Zookeeper作為Cosnumer的上下線管理。
1.2. SolrCloud結(jié)構(gòu)
? ? ? ? SolrCloud為了降低單機(jī)的處理壓力,需要由多臺(tái)服務(wù)器共同來完成索引和搜索任務(wù)。實(shí)現(xiàn)的思路是將索引數(shù)據(jù)進(jìn)行Shard(分片)拆分,每個(gè)分片由多臺(tái)的服務(wù)器共同完成,當(dāng)一個(gè)索引或搜索請(qǐng)求過來時(shí)會(huì)分別從不同的Shard的服務(wù)器中操作索引。
? ? ? ? SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一個(gè)集群管理軟件,由于SolrCloud需要由多臺(tái)服務(wù)器組成,由zookeeper來進(jìn)行協(xié)調(diào)管理。
下圖是一個(gè)SolrCloud應(yīng)用的例子:
對(duì)上圖進(jìn)行圖解,如下:
1.2.1. 物理結(jié)構(gòu)
? ? ? ?三個(gè)Solr實(shí)例( 每個(gè)實(shí)例包括兩個(gè)Core),組成一個(gè)SolrCloud。
1.2.2. 邏輯結(jié)構(gòu)
? ? ? ?索引集合包括兩個(gè)Shard(shard1和shard2),shard1和shard2分別由三個(gè)Core組成,其中一個(gè)Leader兩個(gè)Replication,Leader是由zookeeper選舉產(chǎn)生,zookeeper控制每個(gè)shard上三個(gè)Core的索引數(shù)據(jù)一致,解決高可用問題。
? ? ? ?用戶發(fā)起索引請(qǐng)求分別從shard1和shard2上獲取,解決高并發(fā)問題。
1.1.1.1. ?Collection
? ? ? ?Collection在SolrCloud集群中是一個(gè)邏輯意義上的完整的索引結(jié)構(gòu)。它常常被劃分為一個(gè)或多個(gè)Shard(分片),它們使用相同的配置信息。
? ? ? ? 比如:針對(duì)商品信息搜索可以創(chuàng)建一個(gè)collection。
? ? ? ? collection=shard1+shard2+....+shardX
1.1.1.2. ?Core
? ? ? ? 每個(gè)Core是Solr中一個(gè)獨(dú)立運(yùn)行單位,提供索引和搜索服務(wù)。一個(gè)shard需要由一個(gè)Core或多個(gè)Core組成。由于collection由多個(gè)shard組成所以collection一般由多個(gè)core組成。
1.1.1.3. ?Master或Slave
? ? ? ? ?Master是master-slave結(jié)構(gòu)中的主結(jié)點(diǎn)(通常說主服務(wù)器),Slave是master-slave結(jié)構(gòu)中的從結(jié)點(diǎn)(通常說從服務(wù)器或備服務(wù)器)。同一個(gè)Shard下master和slave存儲(chǔ)的數(shù)據(jù)是一致的,這是為了達(dá)到高可用目的。
1.1.1.4. ?Shard
? ? ? ? ?Collection的邏輯分片。每個(gè)Shard被化成一個(gè)或者多個(gè)replication,通過選舉確定哪個(gè)是Leader。
2. SolrCloud搭建
? ? ? ? ?本教程的這套安裝是單機(jī)版的安裝,所以采用偽集群的方式進(jìn)行安裝,如果是真正的生產(chǎn)環(huán)境,將偽集群的ip改下就可以了,步驟是一樣的。
SolrCloud結(jié)構(gòu)圖如下:
?
2.1 環(huán)境準(zhǔn)備
?
? ? ? ? ??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 環(huán)境安裝
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下,復(fù)制三份分別并將目錄名改為zookeeper1、zookeeper2、zookeeper3
第二步:進(jìn)入zookeeper1文件夾,創(chuàng)建data目錄。并在data目錄中創(chuàng)建一個(gè)myid文件內(nèi)容為“1”(echo 1 >>data/myid)。
第三步:進(jìn)入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 | 
?
第五步:對(duì)zookeeper2、3中的設(shè)置做第二步至第四步修改。
zookeeper2:
myid內(nèi)容為2
dataDir=/usr/local/solrcloud/zookeeper2/data
clientPort=2182
Zookeeper3:
的myid內(nèi)容為3
dataDir=/usr/local/solrcloud/zookeeper3/data
clientPort=2183
第六步:啟動(dòng)三個(gè)zookeeper
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstart
查看集群狀態(tài):
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstatus
第七步:開啟zookeeper用到的端口,或者直接關(guān)閉防火墻。
service iptables stop
2.3 tomcat安裝
第一步:將apache-tomcat-7.0.47.tar.gz解壓
? ? ? ? ? ? ? tar-zxvf apache-tomcat-7.0.47.tar.gz
第二步:把解壓后的tomcat復(fù)制到/usr/local/solrcloud/目錄下復(fù)制四份。
? ? ? ? ? ? ? /usr/local/solrcloud/tomcat1
? ? ? ? ? ? ? /usr/local/solrcloud/tomcat2
? ? ? ? ? ? ? /usr/local/solrcloud/tomcat3
? ? ? ? ? ? ? /usr/local/solrcloud/tomcat4
第三步:修改tomcat的server.xml
? ? ? ? ? ? ? vim tomcat2/conf/server.xml,把其中的端口后都加一。保證兩個(gè)tomcat可以正常運(yùn)行不發(fā)生端口沖突。
2.4. SolrCloud部署
2.4.1. 啟動(dòng)zookeeper
? ? ? ? solrCloud部署依賴zookeeper,需要先啟動(dòng)每一臺(tái)zookeeper服務(wù)器。
2.5.2.??zookeeper管理配置文件
? ? ? ? 由于zookeeper統(tǒng)一管理solr的配置文件(主要是schema.xml、solrconfig.xml), solrCloud各各節(jié)點(diǎn)使用zookeeper管理的配置文件。
? ? ? ? 將上邊部署的solr單機(jī)的conf拷貝到/home/solr下。
? ? ? ? 執(zhí)行下邊的命令將/home/solr/conf下的配置文件上傳到zookeeper(此命令為單條命令,雖然很長(zhǎng)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服務(wù)器查詢配置文件:
? ? ? ? cd /usr/local/zookeeper/bin/
? ? ? ? ./zkCli.sh?
2.5.3.??修改SolrCloud監(jiān)控端口
修改每個(gè)solrhome的solr.xml文件。將host改成虛擬機(jī)ip地址,port改成對(duì)應(yīng)的tomcat的端口號(hào)。
2.5.4.??每一臺(tái)solr和zookeeper關(guān)聯(lián)
修改每一臺(tái)solr的tomcat 的 bin目錄下catalina.sh文件中加入DzkHost指定zookeeper服務(wù)器地址:
JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"
(可以使用vim的查找功能查找到JAVA_OPTS的定義的位置,然后添加)
2.5.5.??啟動(dòng)所有的solr服務(wù)
啟動(dòng)每一臺(tái)solr的tomcat服務(wù)。
2.5.6.??訪問solrcloud
訪問任意一臺(tái)solr,左側(cè)菜單出現(xiàn)Cloud:
?
?
2.5.7 SolrCloud集群配置
上圖中的collection1集群只有一片,可以通過下邊的方法配置新的集群。
?
如果集群中有四個(gè)solr節(jié)點(diǎn)創(chuàng)建新集群collection2,將集群分為兩片,每片兩個(gè)副本。
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
執(zhí)行后原來的collection1刪除,如下:
更多的命令請(qǐng)參數(shù)官方文檔:apache-solr-ref-guide-4.10.pdf
2.5.8.??啟動(dòng)solrCloud注意
啟動(dòng)solrCloud需要先啟動(dòng)solrCloud依賴的所有zookeeper服務(wù)器,再啟動(dòng)每臺(tái)solr服務(wù)器。
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默認(rèn)名稱,比如我的solr服務(wù)器上的collection是collection2_shard1_replica1,就是去掉“_shard1_replica1”的名稱privatestatic String defaultCollection ="collection1";// cloudSolrServer實(shí)際private CloudSolrServercloudSolrServer;// 測(cè)試方法之前構(gòu)造 CloudSolrServer@Beforepublicvoid init() {cloudSolrServer = new CloudSolrServer(zkHostString);cloudSolrServer.setDefaultCollection(defaultCollection);cloudSolrServer.connect();}// 向solrCloud上創(chuàng)建索引@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("文檔個(gè)數(shù):" +docs.getNumFound());System.out.println("查詢時(shí)間:" +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 {// 根據(jù)id刪除UpdateResponse response=cloudSolrServer.deleteById("zhangsan");// 根據(jù)多個(gè)id刪除// cloudSolrServer.deleteById(ids);// 自動(dòng)查詢條件刪除// cloudSolrServer.deleteByQuery("product_keywords:教程");// 提交cloudSolrServer.commit();} }總結(jié)
以上是生活随笔為你收集整理的SolrCloud详解及搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 远程mysql定时删除数据_mysql定
- 下一篇: Java防止用户同一时间重复登录(包括异
