分佈式全文檢索系統SolrCloud簡介

前言

本文簡單描述SolrCloud的特性,基本結構和入門,基於Solr4.5版本。 html

Lucene是一個Java語言編寫的利用倒排原理實現的文本檢索類庫。Solr是以Lucene爲基礎實現的文本檢索應用服務。 java

SolrCloud是Solr4.0版本開發出的具備開創意義的基於Solr和Zookeeper的分佈式搜索方案,或者能夠說,SolrCloud是Solr的一種部署方式。Solr能夠以多種方式部署,例如單機方式,多機Master-Slaver方式,這些方式部署的Solr不具備SolrCloud的特點功能。 node

特點

SolrCloud有幾個特點功能: web

  1. 集中式的配置信息 apache

    使用ZK進行集中配置。啓動時能夠指定把Solr的相關配置文件上傳Zookeeper,多機器共用。這些ZK中的配置不會再拿到本地緩存,Solr直接讀取ZK中的配置信息。配置文件的變更,全部機器均可以感知到。 bootstrap

    另外,Solr的一些任務也是經過ZK做爲媒介發佈的。目的是爲了容錯。接收到任務,但在執行任務時崩潰的機器,在重啓後,或者集羣選出候選者時,能夠再次執行這個未完成的任務。 瀏覽器

  2. 自動容錯 緩存

    SolrCloud對索引分片,並對每一個分片建立多個Replication。每一個Replication均可以對外提供服務。一個Replication掛掉不會影響索引服務。 架構

    更強大的是,它還能自動的在其它機器上幫你把失敗機器上的索引Replication重建並投入使用。 負載均衡

  3. 近實時搜索

    當即推送式的replication(也支持慢推送)。能夠在秒內檢索到新加入索引。

  4. 查詢時自動負載均衡

    SolrCloud索引的多個Replication能夠分佈在多臺機器上,均衡查詢壓力。若是查詢壓力大,能夠經過擴展機器,增長Replication來減緩。

  5. 自動分發的索引和索引分片

    發送文檔到任何節點,它都會轉發到正確節點。

  6. 事務日誌

    事務日誌確保更新無丟失,即便文檔沒有索引到磁盤。

其它值得一提的功能有:

  1. 索引存儲在HDFS上

    索引的大小一般在G和幾十G,上百G的不多,這樣的功能或許很難實用。可是,若是你有上億數據來建索引的話,也是能夠考慮一下的。我以爲這個功能最大的好處或許就是和下面這個「經過MR批量建立索引」聯合實用。

  2. 經過MR批量建立索引

    有了這個功能,你還擔憂建立索引慢嗎?

  3. 強大的RESTful API

    一般你能想到的管理功能,均可以經過此API方式調用。這樣寫一些維護和管理腳本就方便多了。

  4. 優秀的管理界面

    主要信息一目瞭然;能夠清晰的以圖形化方式看到SolrCloud的部署分佈;固然還有不可或缺的Debug功能。

概念

  • Collection:在SolrCloud集羣中邏輯意義上的完整的索引。它經常被劃分爲一個或多個Shard,它們使用相同的Config Set。若是Shard數超過一個,它就是分佈式索引,SolrCloud讓你經過Collection名稱引用它,而不須要關心分佈式檢索時須要使用的和Shard相關參數。

  • Config Set: Solr Core提供服務必須的一組配置文件。每一個config set有一個名字。最小須要包括solrconfig.xml (SolrConfigXml)和schema.xml (SchemaXml),除此以外,依據這兩個文件的配置內容,可能還須要包含其它文件。它存儲在Zookeeper中。Config sets能夠從新上傳或者使用upconfig命令更新,使用Solr的啓動參數bootstrap_confdir指定能夠初始化或更新它。

  • Core: 也就是Solr Core,一個Solr中包含一個或者多個Solr Core,每一個Solr Core能夠獨立提供索引和查詢功能,每一個Solr Core對應一個索引或者Collection的Shard,Solr Core的提出是爲了增長管理靈活性和共用資源。在SolrCloud中有個不一樣點是它使用的配置是在Zookeeper中的,傳統的Solr core的配置文件是在磁盤上的配置目錄中。

  • Leader: 贏得選舉的Shard replicas。每一個Shard有多個Replicas,這幾個Replicas須要選舉來肯定一個Leader。選舉能夠發生在任什麼時候間,可是一般他們僅在某個Solr實例發生故障時纔會觸發。當索引documents時,SolrCloud會傳遞它們到此Shard對應的leader,leader再分發它們到所有Shard的replicas。

  • Replica: Shard的一個拷貝。每一個Replica存在於Solr的一個Core中。一個命名爲「test」的collection以numShards=1建立,而且指定replicationFactor設置爲2,這會產生2個replicas,也就是對應會有2個Core,每一個在不一樣的機器或者Solr實例。一個會被命名爲test_shard1_replica1,另外一個命名爲test_shard1_replica2。它們中的一個會被選舉爲Leader。

  • Shard: Collection的邏輯分片。每一個Shard被化成一個或者多個replicas,經過選舉肯定哪一個是Leader。

  • Zookeeper: Zookeeper提供分佈式鎖功能,對SolrCloud是必須的。它處理Leader選舉。Solr能夠之內嵌的Zookeeper運行,可是建議用獨立的,而且最好有3個以上的主機。

架構

索引(collection)的邏輯圖

索引和Solr實體對照圖

建立索引過程

檢索過程

Shard Splitting

入門

安裝配置

前提,你須要先安裝好Java,6.0+。 假設咱們有5臺機器要安裝Solr。

  1. 安裝外部zookeeper

    Solr默認是用內置的Zookeeper,爲了方便管理和維護,建議使用外部Zookeeper。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    wget http : //apache.dataguru.cn/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz
    tar - zxvf zookeeper - 3.4.3.tar.gz
    Java的程序解壓後就能夠運行,不須要安裝。
    修改或者建立配置文件 $ ZOOKEEPER_HOME / conf / zoo . cfg,內容以下:
    # 注意修改成你的真實路徑
    dataDir = / home / hadoop / zookeeper - 3.4.3 / data
    clientPort = 2181
    # 編號從1開始,solr1-3每一個是一臺主機,共3個
    server . 1 = solr1 : 2888 : 3888
    server . 2 = solr2 : 2888 : 3888
    server . 3 = solr3 : 2888 : 3888
     

    在3臺機器上都一樣安裝。

    另外,還須要在$dataDir中配置myid,zookeeper是以此文件肯定本機身份。

    1
    2
    3
    4
    5
    # 注意每臺機器上的不同
    echo "1" > myid #在solr1上
    echo "2" > myid #在solr2上
    echo "3" > myid #在solr3上
     

    啓動, 須要在3臺機器上分別啓動

    1
    2
    3
    4
    $ ZOOKEEPER_HOME / bin / zkServer . sh start
    # 查看狀態,確認啓動成功
    $ ZOOKEEPER_HOME / bin / zkServer . sh status
     
  2. Solr安裝下載

    在5臺機上作一樣操做

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    wget http : //apache.mirrors.pair.com/lucene/solr/4.5.0/solr-4.5.0.tgz
    tar - xzf solr - 4.5.0.tgz
    cd solr - 4.5.0
    cp - r example node1
    cdo node1
    # 第一條solr機器
    java - Dbootstrap_confdir = . / solr / collection1 / conf - Dcollection . configName = myconf - DnumShards = 2 - DzkHost = solr1 : 2181 , solr2 : 2181 , solr3 : 2181 - jar start . jar
    # 其它solr機器
    java - DzkHost = solr1 : 2181 , solr2 : 2181 , solr3 : 2181 - jar start . jar
     

    啓動成功後,你能夠經過瀏覽器8983看到solr的Web頁面。

  3. 索引

    1
    2
    3
    cd $ SOLR_HOME / node1 / exampledocs
    java - Durl = http : //solr1:8983/solr/collection1/update -jar post.jar ipod_video.xml
     
  4. 檢索

    你能夠在web界面選定一個Core,而後查詢。solr有查詢語法文檔。

  5. 若是要想把數據寫到HDFS

    在$SOLR_HOME/node1/solr/collection1/conf/solrconfig.xml 增長

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    < directoryFactory name = "DirectoryFactory" class = "solr.HdfsDirectoryFactory" >
         < str name = "solr.hdfs.home" > hdfs : //mycluster/solr</str>
         < bool name = "solr.hdfs.blockcache.enabled" > true < / bool >
         < int name = "solr.hdfs.blockcache.slab.count" > 1 < / int >
         < bool name = "solr.hdfs.blockcache.direct.memory.allocation" > true < / bool >
         < int name = "solr.hdfs.blockcache.blocksperbank" > 16384 < / int >
         < bool name = "solr.hdfs.blockcache.read.enabled" > true < / bool >
         < bool name = "solr.hdfs.blockcache.write.enabled" > true < / bool >
         < bool name = "solr.hdfs.nrtcachingdirectory.enable" > true < / bool >
         < int name = "solr.hdfs.nrtcachingdirectory.maxmergesizemb" > 16 < / int >
         < int name = "solr.hdfs.nrtcachingdirectory.maxcachedmb" > 192 < / int >
         < str name = "solr.hdfs.confdir" > $ { user . home } / local / hadoop / etc / hadoop < / int >
    < / directoryFactory >
     

    從新啓動

    1
    2
    java - Dsolr . directoryFactory = HdfsDirectoryFactory - Dsolr . lock . type = hdfs - Dsolr . data . dir = hdfs : //mycluster/solr -Dsolr.updatelog=hdfs://mycluster/solrlog -jar start.jar
     

    能夠增長以下參數設定直接內存大小,優化Hdfs讀寫速度。

    1
    2
    - XX : MaxDirectMemorySize = 1g
     

其它

  • NRT 近實時搜索

    Solr的建索引數據是要在提交時寫入磁盤的,這是硬提交,確保即使是停電也不會丟失數據;爲了提供更實時的檢索能力,Solr設定了一種軟提交方式。

    軟提交(soft commit):僅把數據提交到內存,index可見,此時沒有寫入到磁盤索引文件中。

    一個一般的用法是:每1-10分鐘自動觸發硬提交,每秒鐘自動觸發軟提交。

  • RealTime Get 實時獲取

    容許經過惟一鍵查找任何文檔的最新版本數據,而且不須要從新打開searcher。這個主要用於把Solr做爲NoSQL數據存儲服務,而不只僅是搜索引擎。

    Realtime Get當前依賴事務日誌,默認是開啓的。另外,即使是Soft Commit或者commitwithin,get也能獲得真實數據。 注:commitwithin是一種數據提交特性,不是馬上,而是要求在必定時間內提交數據

參考文檔

相關文章
相關標籤/搜索