SolrCloud服務(wù)搭建及使用solrj管理集群

什么是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ù)載均衡

Solr集群的系統(tǒng)架構(gòu)

物理結(jié)構(gòu)

三個(gè)Solr實(shí)例( 每個(gè)實(shí)例包括兩個(gè)Core),組成一個(gè)SolrCloud。

邏輯結(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ā)問題。

collection

Collection在SolrCloud集群中是一個(gè)邏輯意義上的完整的索引結(jié)構(gòu)。它常常被劃分為一個(gè)或多個(gè)Shard(分片),它們使用相同的配置信息。
比如:針對(duì)商品信息搜索可以創(chuàng)建一個(gè)collection。
collection=shard1+shard2+....+shardX

Core

每個(gè)Core是Solr中一個(gè)獨(dú)立運(yùn)行單位,提供 索引和搜索服務(wù)。一個(gè)shard需要由一個(gè)Core或多個(gè)Core組成。由于collection由多個(gè)shard組成所以collection一般由多個(gè)core組成。

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á)到高可用目的。

Shard

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

需要實(shí)現(xiàn)的solr集群架構(gòu)

Zookeeper作為集群的管理工具

1.集群管理:容錯(cuò)、負(fù)載均衡。
2.配置文件的集中管理
3.集群的入口
搭建solr集群需要7臺(tái)服務(wù)器。

搭建偽分布式:

需要實(shí)現(xiàn)zookeeper 高可用。
需要搭建集群。建議是奇數(shù)節(jié)點(diǎn)。需要三個(gè)zookeeper服務(wù)器。
需要三個(gè)zookeeper節(jié)點(diǎn)
需要四個(gè)tomcat節(jié)點(diǎn)
建議虛擬機(jī)的內(nèi)容1G以上

環(huán)境準(zhǔn)備

CentOS-6.5-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

安裝步驟

一、Zookeeper集群搭建

第一步:需要安裝jdk環(huán)境。
第二步:把zookeeper的壓縮包上傳到服務(wù)器。
第三步:解壓縮。
第四步:把zookeeper復(fù)制三份。
[root@localhost ~]# mkdir /usr/local/solr-cloud
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper01
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper02
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper03
第五步:在每個(gè)zookeeper目錄下創(chuàng)建一個(gè)data目錄。
第六步:在data目錄下創(chuàng)建一個(gè)myid文件,文件名就叫做“myid”。內(nèi)容就是每個(gè)實(shí)例的id。例如1、2、3
[root@localhost data]# echo 1 >> myid
[root@localhost data]# ll
total 4
-rw-r--r--. 1 root root 2 Apr 7 18:23 myid
[root@localhost data]# cat myid
1
第七步:修改配置文件。把conf目錄下的zoo_sample.cfg文件改名為zoo.cfg


修改zoo.cfg配置4文件
  • dataDir:數(shù)據(jù)保存的目錄
  • clientPort:客戶端連接zookeeper的端口號(hào),保證每個(gè)實(shí)例端口不沖突
  • 三個(gè)server節(jié)點(diǎn):集群中的節(jié)點(diǎn)列表1,2,3代表節(jié)點(diǎn)的id,ip后多的端口號(hào)是zookeeper內(nèi)部通訊的端口和投票選舉的端口,每個(gè)端口不能重復(fù)。
    第八步:?jiǎn)?dòng)每個(gè)zookeeper實(shí)例。
    啟動(dòng)bin/zkServer.sh start
    查看zookeeper的狀態(tài):
    bin/zkServer.sh status
    可以寫一個(gè)批處理文件vim start-all.sh來啟動(dòng)多個(gè)zookeeper:
cd zookeeper01/bin
./zkServer.sh start
cd ../../  
cd zookeeper02/bin
./zkServer.sh start
cd ../../
cd zookeeper03/bin
./zkServer.sh start
cd ../../

寫完必須授權(quán)才可以執(zhí)行:chmod u+x start-all.sh


啟動(dòng)成功

查看狀態(tài)兩個(gè)fllower一個(gè)leader,zookeeper集群搭建成功

Solr集群的搭建

第一步:創(chuàng)建四個(gè)tomcat實(shí)例。每個(gè)tomcat運(yùn)行在不同的端口。8180、8280、8380、8480
第二步:部署solr的war包。把單機(jī)版的solr工程復(fù)制到集群中的tomcat中。
第三步:為每個(gè)solr實(shí)例創(chuàng)建一個(gè)對(duì)應(yīng)的solrhome。使用單機(jī)版的solrhome復(fù)制四份。
第四步:需要修改solr的web.xml文件。把solrhome關(guān)聯(lián)起來。
第五步:配置solrCloud相關(guān)的配置。每個(gè)solrhome下都有一個(gè)solr.xml,把其中的ip及端口號(hào)配置好


第六步:讓zookeeper統(tǒng)一管理配置文件。需要把solrhome/collection1/conf目錄上傳到zookeeper。上傳任意solrhome中的配置文件即可。
查看zookeeper上的配置文件:
使用zookeeper目錄下的bin/zkCli.sh命令查看zookeeper上的配置文件:
[root@localhost bin]# ./zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
[admin-extra.menu-top.html, currency.xml, protwords.txt, mapping-FoldToASCII.txt, _schema_analysis_synonyms_english.json, _rest_managed.json, solrconfig.xml, _schema_analysis_stopwords_english.json, stopwords.txt, lang, spellings.txt, mapping-ISOLatin1Accent.txt, admin-extra.html, xslt, synonyms.txt, scripts.conf, update-script.js, velocity, elevate.xml, admin-extra.menu-bottom.html, clustering, schema.xml]
[zk: localhost:2181(CONNECTED) 3]
退出:
[zk: localhost:2181(CONNECTED) 3] quit
使用以下命令連接指定的zookeeper服務(wù):

./zkCli.sh -server 192.168.25.138:2183

第七步:修改tomcat/bin目錄下的catalina.sh 文件,關(guān)聯(lián)solr和zookeeper。
把此配置添加到配置文件中:

JAVA_OPTS="DzkHost=192.168.25.138:2181,192.168.25.138:2182,192.168.25.138:2183"

第八步:?jiǎn)?dòng)每個(gè)tomcat實(shí)例。要包裝zookeeper集群是啟動(dòng)狀態(tài)。
可以寫個(gè)批出理文件:

/usr/local/solr-cloud/tomcat1/bin/startup.sh
/usr/local/solr-cloud/tomcat2/bin/startup.sh
/usr/local/solr-cloud/tomcat3/bin/startup.sh
/usr/local/solr-cloud/tomcat4/bin/startup.sh

給文件授權(quán):chmod u+x start-tomcat-all.sh

第九步:訪問集群


集群搭建成功

第十步:創(chuàng)建新的Collection進(jìn)行分片處理。

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

分片成功

第十一步:刪除不用的Collection。
http://192.168.25.138:8180/solr/admin/collections?action=DELETE&name=collection1

刪除成功

使用solrJ管理集群

添加文檔

使用步驟:
第一步:把solrJ相關(guān)的jar包添加到工程中。
第二步:創(chuàng)建一個(gè)SolrServer對(duì)象,需要使用CloudSolrServer子類。構(gòu)造方法的參數(shù)是zookeeper的地址列表。
第三步:需要設(shè)置DefaultCollection屬性。
第四步:創(chuàng)建一SolrInputDocument對(duì)象。
第五步:向文檔對(duì)象中添加域
第六步:把文檔對(duì)象寫入索引庫。
第七步:提交。

@Test
    public void testSolrCloudAddDocument() throws Exception {
        // 第一步:把solrJ相關(guān)的jar包添加到工程中。
        // 第二步:創(chuàng)建一個(gè)SolrServer對(duì)象,需要使用CloudSolrServer子類。構(gòu)造方法的參數(shù)是zookeeper的地址列表。
        //參數(shù)是zookeeper的地址列表,使用逗號(hào)分隔
        CloudSolrServer solrServer = new CloudSolrServer("192.168.25.138:2181,192.168.25.138:2182,192.168.25.138:2183");
        // 第三步:需要設(shè)置DefaultCollection屬性。
        solrServer.setDefaultCollection("collection2");
        // 第四步:創(chuàng)建一SolrInputDocument對(duì)象。
        SolrInputDocument document = new SolrInputDocument();
        // 第五步:向文檔對(duì)象中添加域
        document.addField("item_title", "測(cè)試商品");
        document.addField("item_price", "100");
        document.addField("id", "test001");
        // 第六步:把文檔對(duì)象寫入索引庫。
        solrServer.add(document);
        // 第七步:提交。
        solrServer.commit();

    }

查詢文檔

@Test
    public void testQueryDocument() throws Exception {
        //創(chuàng)建一個(gè)CloudSolrServer對(duì)象
        CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.25.138:2181,192.168.25.138:2182,192.168.25.138:2183");
        //設(shè)置默認(rèn)的Collection
        cloudSolrServer.setDefaultCollection("collection2");
        //創(chuàng)建一個(gè)查詢對(duì)象
        SolrQuery query = new SolrQuery();
        //設(shè)置查詢條件
        query.setQuery("*:*");
        //執(zhí)行查詢
        QueryResponse queryResponse = cloudSolrServer.query(query);
        //取查詢結(jié)果
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        System.out.println("總記錄數(shù):" + solrDocumentList.getNumFound());
        //打印
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("title"));
            System.out.println(solrDocument.get("item_title"));
            System.out.println(solrDocument.get("item_price"));
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 兩年前用過solr5.1版本的,當(dāng)時(shí)只是簡(jiǎn)單入個(gè)門,拿來在項(xiàng)目里建個(gè)全文索引,然后再query,其他什么也沒做,還...
    Coselding閱讀 3,235評(píng)論 3 22
  • 1.什么是SolrCloud? ??SolrCloud(solr 云)是Solr提供的分布式搜索方案,當(dāng)你需要大規(guī)...
    泛空秋慕閱讀 1,530評(píng)論 0 0
  • 在一臺(tái)虛擬機(jī)上搭建Solr集群 1. Solr技術(shù)群的系統(tǒng)架構(gòu) Collection:Collection在Sol...
    東方舵手閱讀 554評(píng)論 0 0
  • Solr是什么? Solr 是Apache下的一個(gè)頂級(jí)開源項(xiàng)目,采用Java開發(fā),它是基于Lucene的全文搜索服...
    FTOLsXD閱讀 798評(píng)論 0 4
  • 前言:用單機(jī)版的時(shí)候是不是感覺速度很慢,如果只有一個(gè)服務(wù)的話,掛了就直接GG拉。所以在實(shí)際的業(yè)務(wù)的時(shí)候我們一般用s...
    __y閱讀 1,480評(píng)論 0 0

友情鏈接更多精彩內(nèi)容