目錄java
簡介... 2apache
配置單機版Solr服務器... 2tomcat
1:下載Solr 2服務器
3:將下載的Solr解壓,並複製其中example\webapps\solr.war包到指定位置... 2app
4:複製example\solr中的solr.xml和zoo.cfg到一個新建文件夾(solrhome)中。... 2負載均衡
5:在tomcat的conf文件夾下新建Catalina\localhost文件夾,並在其中新建solr.xml,內容以下:... 2webapp
7:在單機版Solr服務器中添加connection,... 2
1: 參照Solr單機版的配置,配置多臺Solr服務器... 2
3:在Zookeeper 中上傳Solr的connection配置文件... 6
Solr它是一種開放源碼的、基於 Lucene Java 的搜索服務器,易於加入到 Web 應用程序中。Solr 提供了層面搜索(就是統計)、命中醒目顯示而且支持多種輸出格式(包括XML/XSLT 和JSON等格式)。它易於安裝和配置,並且附帶了一個基於HTTP 的管理界面。可使用 Solr 的表現優異的基本搜索功能,也能夠對它進行擴展從而知足企業的須要。Solr的特性包括:
高級的全文搜索功能 專爲高通量的網絡流量進行的優化 基於開放接口(XML和HTTP)的標準 綜合的HTML管理界面 可伸縮性-可以有效地複製到另一個Solr搜索服務器 使用XML配置達到靈活性和適配性 可擴展的插件體系
http://www.apache.org/dyn/closer.cgi/lucene/solr/
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\\development\\SolrCloud\\data\\solr\\war\\solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="D:\\development\\SolrCloud\\data\\solr\\solrhome" override="false"/>
</Context>
其中docBase指向solr.war文件,Environment/value 配置爲solrhome的路徑。
假設目前存在多臺已經配置好的Solr服務器分別爲
http://127.0.0.1:8080/solr/connection1
http://127.0.0.1:8081/solr/connection1
http://127.0.0.1:8082/solr/connection1
目前須要設置8080爲主機,8081,8082爲從機
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">startup</str>
<str name="replicateAfter">commit</str>
<str name="replicateAfter">optimize</str>
<str name="confFiles">schema.xml</str>
</lst>
</requestHandler>
<updateHandler class="solr.DirectUpdateHandler2">
<autoCommit>
<maxDocs>1</maxDocs>
<maxTime>1000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
</updateHandler>
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://10.28.175.246:8080/solr/waiter</str>
<str name="pollInterval">00:00:20</str>
</lst>
</requestHandler>
上述操做完成後,一個Solr分佈式就完成了,主庫主要負責接收插入的數據,從庫主要負責查詢數據。
從庫會在按期(pollInterval配置)到主庫進行數據查詢,若主庫數據有修改,從庫會自動進行差別同步。
<bean id="concurrentUpdateSolrServer" class="org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer">
<constructor-arg value=" http://127.0.0.1:8080/solr/connection1" />
<constructor-arg value="8" />
<constructor-arg value="8" />
</bean>
<bean id="lbHttpSolrServer" class="org.apache.solr.client.solrj.impl.LBHttpSolrServer" >
<constructor-arg>
<array value-type="java.lang.String">
<value>http://127.0.0.1:8081/solr/connection1</value>
<value>http://127.0.0.1:8082/solr/connection1</value>
</array>
</constructor-arg>
</bean>
本文所講的Solr集羣服務器是基於 Tomcat7 + Zookeeper3.4.6 + Solr4.6
下載地址爲 http://www.apache.org/dyn/closer.cgi/zookeeper/
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\tmp\\zookeeper\\server1\\data
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
在此示例文件中,咱們部署了三分Zookeeper服務器,數據文件分別定位到
D:\\tmp\\zookeeper\\server1
D:\\tmp\\zookeeper\\server2
D:\\tmp\\zookeeper\\server3
其中的server.x中的x爲服務器myid(myid隨後說在哪裏定義),後面的127.0.0.1:2888:3888分別對應與2181
例如,服務器A的clientPort爲2181,則對應的地址爲127.0.0.1:2888:3888
服務器B的clientPort爲2182,則對應的地址應該爲127.0.0.1:2889:3889
服務器配置文件 dataDir clientPort
server_1/conf/zoo.cfg D:\\tmp\\zookeeper\\server1 2181
server_2/conf/zoo.cfg D:\\tmp\\zookeeper\\server2 2182
server_3/conf/zoo.cfg D:\\tmp\\zookeeper\\server3 2183
上述文件中咱們定義了一個 dataDir 地址,此地址是程序存放數據用的地址,在此地址中,咱們定義一個myid文件,用記事本打開,寫入1,則此項目的Myid爲1
分別將三個服務器按照123進行排列寫入myid文件
(鏈接第一臺時有異常信息,不用管,等都鏈接起來就沒有異常了)
按照Solr單機版的部署方式,部署三臺Solr單機版服務器,並去掉其中的全部connection
假設以前部署好的Zookeeper地址爲:
127.0.0.1:2181
127.0.0.1:2182
127.0.0.1:2183
solr服務器 tomcat端口 solrhome
solr1 8081 SolrCloud\data\solrhome1
solr2 8082 SolrCloud\data\solrhome2
solr3 8083 SolrCloud\data\solrhome3
<?xml version="1.0" encoding="UTF-8" ?>
<solr>
<solrcloud>
<str name="host">${host:}</str>
<int name="hostPort">8080</int>
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:15000}</int>
<bool name="genericCoreNodeNames">
${genericCoreNodeNames:true}
</bool>
<str name="zkHost">
127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
</str>
</solrcloud>
<shardHandlerFactory name="shardHandlerFactory"
class="HttpShardHandlerFactory">
<int name="socketTimeout">${socketTimeout:0}</int>
<int name="connTimeout">${connTimeout:0}</int>
</shardHandlerFactory>
</solr>
其中hostPort爲該服務器的tomcat端口
zkHost爲Zookeeper的三個服務器地址用逗號鏈接起來。
依次啓動三個solr服務器,並訪問任意一個solr,出現下圖頁面,即說明配置集羣服務成功。
java -classpath D:\\uploadCloud\\ClientLib\\* org.apache.solr.cloud.ZkCLI -cmd
upconfig -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -confdir
D:\\uploadCloud\\conf -confname myconf
該命令是使用了以前複製的jar包中的ZkCLI程序進行一個指定文件夾的 upconfig 工做
4:執行命令
java -classpath D:\\uploadCloud\\ClientLib\\* org.apache.solr.cloud.ZkCLI -cmd
linkconfig -collection collection -confname myconf -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
該命令是將剛剛上傳的配置文件命名爲一個collection對象
訪問剛剛配置的solr服務器
http://127.0.0.1:8081/solr/admin/collections?action=CREATE&name=collection1&numShards=3&replicationFactor=3&maxShardsPerNode=3
name:collection的名稱
numShards:指定分片數量(slices)
replicationFactor:副本數量
maxShardsPerNode:默認值爲1,注意三個數值:numShards、replicationFactor、liveSolrNode,一個正常的solrCloud集羣不允許同一個liveSolrNode上部署同一個shard的多個replic,所以當maxShardsPerNode=1時,numShards*replicationFactor>liveSolrNode時,報錯。所以正確時因知足如下條件: numShards*replicationFactor<liveSolrNode*maxShardsPerNode
createNodeSet:
collection.configName:指定該collection使用那份config,這份config必須存在於zk中。
集中式的配置信息使用ZK進行集中配置
啓動時能夠指定把Solr的相關配置文件上傳Zookeeper,多機器共用。這些ZK中的配置不會再拿到本地緩存,Solr直接讀取ZK中的配置信息。配置文件的變更,全部機器均可以感知到。另外,Solr的一些任務也是經過ZK做爲媒介發佈的。目的是爲了容錯。接收到任務,但在執行任務時崩潰的機器,在重啓後,或者集羣選出候選者時,能夠再次執行這個未完成的任務。
自動容錯SolrCloud對索引分片,並對每一個分片建立多個Replication
每一個Replication均可以對外提供服務
一個Replication掛掉不會影響索引服務。更強大的是,它還能自動的在其它機器上幫你把失敗機器上的索引Replication重建並投入使用。
近實時搜索
當即推送式的replication(也支持慢推送)。能夠在秒內檢索到新加入索引。
均衡查詢壓力 查詢時自動負載均衡SolrCloud索引的多個Replication能夠分佈在多臺機器上 若是查詢壓力大,能夠經過擴展機器,增長Replication來減緩。
自動分發的索引和索引分片發送文檔到任何節點,它都會轉發到正確節點。
事務日誌事務日誌確保更新無丟失,即便文檔沒有索引到磁盤。
索引存儲在HDFS上索引的大小一般在G和幾十G,上百G的不多,這樣的功能或許很難實用。 可是,若是你有上億數據來建索引的話,也是能夠考慮一下的。 我以爲這個功能最大的好處或許就是和下面這個「經過MR批量建立索引」聯合實用。
經過MR批量建立索引 有了這個功能,你還擔憂建立索引慢嗎?
強大的RESTful API一般你能想到的管理功能,均可以經過此API方式調用。這樣寫一些維護和管理腳本就方便多了。
優秀的管理界面主要信息一目瞭然;能夠清晰的以圖形化方式看到SolrCloud的部署分佈;固然還有不可或缺的Debug功能。