本文簡單描述SolrCloud的特性,基本結構和入門,基於Solr4.5版本。 html
Lucene是一個Java語言編寫的利用倒排原理實現的文本檢索類庫。Solr是以Lucene爲基礎實現的文本檢索應用服務。 java
SolrCloud是Solr4.0版本開發出的具備開創意義的基於Solr和Zookeeper的分佈式搜索方案,或者能夠說,SolrCloud是Solr的一種部署方式。Solr能夠以多種方式部署,例如單機方式,多機Master-Slaver方式,這些方式部署的Solr不具備SolrCloud的特點功能。 node
SolrCloud有幾個特點功能: web
集中式的配置信息 apache
使用ZK進行集中配置。啓動時能夠指定把Solr的相關配置文件上傳Zookeeper,多機器共用。這些ZK中的配置不會再拿到本地緩存,Solr直接讀取ZK中的配置信息。配置文件的變更,全部機器均可以感知到。 bootstrap
另外,Solr的一些任務也是經過ZK做爲媒介發佈的。目的是爲了容錯。接收到任務,但在執行任務時崩潰的機器,在重啓後,或者集羣選出候選者時,能夠再次執行這個未完成的任務。 瀏覽器
自動容錯 緩存
SolrCloud對索引分片,並對每一個分片建立多個Replication。每一個Replication均可以對外提供服務。一個Replication掛掉不會影響索引服務。 架構
更強大的是,它還能自動的在其它機器上幫你把失敗機器上的索引Replication重建並投入使用。 負載均衡
近實時搜索
當即推送式的replication(也支持慢推送)。能夠在秒內檢索到新加入索引。
查詢時自動負載均衡
SolrCloud索引的多個Replication能夠分佈在多臺機器上,均衡查詢壓力。若是查詢壓力大,能夠經過擴展機器,增長Replication來減緩。
自動分發的索引和索引分片
發送文檔到任何節點,它都會轉發到正確節點。
事務日誌
事務日誌確保更新無丟失,即便文檔沒有索引到磁盤。
其它值得一提的功能有:
索引存儲在HDFS上
索引的大小一般在G和幾十G,上百G的不多,這樣的功能或許很難實用。可是,若是你有上億數據來建索引的話,也是能夠考慮一下的。我以爲這個功能最大的好處或許就是和下面這個「經過MR批量建立索引」聯合實用。
經過MR批量建立索引
有了這個功能,你還擔憂建立索引慢嗎?
強大的RESTful API
一般你能想到的管理功能,均可以經過此API方式調用。這樣寫一些維護和管理腳本就方便多了。
優秀的管理界面
主要信息一目瞭然;能夠清晰的以圖形化方式看到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個以上的主機。
前提,你須要先安裝好Java,6.0+。 假設咱們有5臺機器要安裝Solr。
安裝外部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
|
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頁面。
索引
1
2
3
|
cd
$
SOLR_HOME
/
node1
/
exampledocs
java
-
Durl
=
http
:
//solr1:8983/solr/collection1/update -jar post.jar ipod_video.xml
|
檢索
你能夠在web界面選定一個Core,而後查詢。solr有查詢語法文檔。
若是要想把數據寫到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是一種數據提交特性,不是馬上,而是要求在必定時間內提交數據