Lucene是一個Java語言編寫的利用倒排原理實現的文本檢索類庫;html
Solr是以Lucene爲基礎實現的文本檢索應用服務。Solr部署方式有單機方式、多機Master-Slaver方式、Cloud方式。node
SolrCloud是基於Solr和Zookeeper的分佈式搜索方案。當索引愈來愈大,一個單一的系統沒法知足磁盤需求,查詢速度緩慢,此時就須要分佈式索引。在分佈式索引中,原來的大索引,將會分紅多個小索引,solr能夠將這些小索引返回的結果合併,而後返回給客戶端。linux
SolrCloud有幾個特點功能:apache
集中式的配置信息使用ZK進行集中配置。啓動時能夠指定把Solr的相關配置文件上傳 Zookeeper,多機器共用。這些ZK中的配置不會再拿到本地緩存,Solr直接讀取ZK中的配置信息。配置文件的變更,全部機器均可以感知到。另外,Solr的一些任務也是經過ZK做爲媒介發佈的。目的是爲了容錯。接收到任務,但在執行任務時崩潰的機器,在重啓後,或者集羣選出候選者時,能夠再次執行這個未完成的任務。bootstrap
自動容錯SolrCloud對索引分片,並對每一個分片建立多個Replication。每一個 Replication均可以對外提供服務。一個Replication掛掉不會影響索引服務。更強大的是,它還能自動的在其它機器上幫你把失敗機器上的索引Replication重建並投入使用。segmentfault
近實時搜索當即推送式的replication(也支持慢推送)。能夠在秒內檢索到新加入索引。緩存
查詢時自動負載均衡SolrCloud索引的多個Replication能夠分佈在多臺機器上,均衡查詢壓力。若是查詢壓力大,能夠經過擴展機器,增長Replication來減緩。服務器
自動分發的索引和索引分片發送文檔到任何節點,它都會轉發到正確節點。負載均衡
事務日誌確保更新無丟失,即便文檔沒有索引到磁盤。ssh
其它值得一提的功能有:
索引存儲在HDFS上索引的大小一般在G和幾十G,上百G的不多,這樣的功能或許很難實用。可是,若是你有上億數據來建索引的話,也是能夠考慮一下的。我以爲這個功能最大的好處或許就是和下面這個「經過MR批量建立索引」聯合實用。
經過MR批量建立索引有了這個功能,你還擔憂建立索引慢嗎?
強大的RESTful API一般你能想到的管理功能,均可以經過此API方式調用。這樣寫一些維護和管理腳本就方便多了。
優秀的管理界面主要信息一目瞭然;能夠清晰的以圖形化方式看到SolrCloud的部署分佈;固然還有不可或缺的Debug功能。
Cluster集羣:一組Solr節點,邏輯上做爲一個單元進行管理,整個集羣使用同一套Schema和SolrConfig
Node節點:一個運行Solr的JVM實例
Collection:在SolrCloud集羣中邏輯意義上的完整的索引,經常被劃分爲一個或多個Shard。這些Shard使用相同的config set,若是Shard數超過一個,那麼索引方案就是分佈式索引。
Core:也就是Solr Core,一個Solr中包含一個或者多個SolrCore,每一個Solr Core能夠獨立提供索引和查詢功能,Solr Core額提出是爲了增長管理靈活性和共用資源。
SolrCloud中使用的配置是在Zookeeper中的,而傳統的Solr Core的配置文件是在磁盤上的配置目錄中。
Config Set:Solr Core提供服務必須的一組配置文件,每一個Config Set有一個名字。必須包含solrconfig.xml和schema.xml,初次以外,依據這兩個文件的配置內容,可能還須要包含其餘文件。
Config Set存儲在Zookeeper中,能夠從新上傳或者使用upconfig命令進行更新,能夠用Solr的啓動參數bootstrap_confdir進行初始化或者更新。
Shard分片:Collection的邏輯分片。每一個Shard被分紅一個或者多個replicas,經過選舉肯定那個是Leader。
Replica:Shard的一個拷貝。每一個Replica存在於Solr的一個Core中。
Leader:贏得選舉的Shard replicas,每一個Shard有多個replicas,這幾個Replicas須要選舉肯定一個Leader。選舉能夠發生在任什麼時候間。當進行索引操做時,SolrCloud將索引操做請求傳到此Shard對應的leader,leader再分發它們到所有Shard的replicas。
Apache SolrCloud 參考指南
Apache Solr文檔
Solr 參數配置
Solr控制腳本參考
VMware版本號:12.0.0
CentOS版本:CentOS 7.3.1611
Solr 版本:solr-6.6.0
ZooKeeper版本:ZooKeeper-3.4.9.tar.gz 具體參考《CentOs7.3 搭建 ZooKeeper-3.4.9 Cluster 集羣服務》
JDK環境:jdk-8u144-linux-x64.tar.gz 具體參考《CentOs7.3 安裝 JDK1.8》
關閉防火牆
$ systemctl stop firewalld.service
Solr 6(和SolrJ客戶端庫)的Java支持的最低版本如今是Java 8。
下載最新版本的Solr ,我在北京我就選擇,清華鏡像比較快 , 文件大概140M
清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/6.6.0/
阿里鏡像:https://mirrors.aliyun.com/apache/lucene/solr/6.6.0/
$ cd /opt/ $ wget https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/6.6.0/solr-6.6.0.tgz $ tar -zxf solr-6.6.0.tgz $ cd solr-6.6.0
集羣中的每臺機器都要按照如下說明進行配置啓動
首先到 solr 安裝目錄的 bin 下,編輯 solr.in.sh 文件
搜索 SOLR_HOST
, 取消註釋, 設置成本身的 ip
搜索 SOLR_TIMEZONE
, 取消註釋, 設置成 UTC+8
把node1 的solr.in.sh 修改成一下配置
建議設置Solr服務器的主機名,特別是在以SolrCloud模式運行時,由於它會在使用ZooKeeper註冊時肯定節點的地址 ,不建議用ip
SOLR_HOST="node1" SOLR_TIMEZONE="UTC+8"
1. 把 node1 編輯好的 Solr 文件及配置經過 scp -r
複製到集羣 node2, node3
$ for a in {2..3} ; do scp -r /opt/solr-6.6.0/ node$a:/opt/solr-6.6.0 ; done
2. 而後修改 node2, node3 的上的 solr.in.sh
的SOLR_HOST
爲機器的ip
格式 SOLR_HOST="ip"
$ vi /opt/solr-6.6.0/bin/solr.in.sh
在任意一臺機器,啓動 ZooKeeper 集羣
$ for a in {1..3} ; do ssh node$a "source /etc/profile; /opt/zookeeper-3.4.9/bin/zkServer.sh start" ; done
在任意一臺機器,啓動 SolrCloud 集羣 而且關聯 ZooKeeper 集羣
$ for a in {1..3} ; do ssh node$a "source /etc/profile; /opt/solr-6.6.0/bin/solr start -cloud -z node1:2181,node2:2181,node3:2181 -p 8983 -force" ; done
在任意一臺機器
$ /opt/solr-6.6.0/bin/solr create_collection -c test_collection -shards 2 -replicationFactor 3 -force
-c
指定庫(collection)名稱 -shards
指定分片數量,可簡寫爲 -s ,索引數據會分佈在這些分片上 -replicationFactor
每一個分片的副本數量,每一個碎片由至少1個物理副本組成
響應
Connecting to ZooKeeper at node3:2181 ... INFO - 2017-08-24 11:57:30.581; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at node3:2181 ready Uploading /opt/solr-6.6.0/server/solr/configsets/data_driven_schema_configs/conf for config test_collection to ZooKeeper at node3:2181 Creating new collection 'test_collection' using command: http://192.168.252.121:8983/solr/admin/collections?action=CREATE&name=test_collection&numShards=2&replicationFactor=3&maxShardsPerNode=2&collection.configName=test_collection { "responseHeader":{ "status":0, "QTime":11306}, "success":{ "192.168.252.123:8983_solr":{ "responseHeader":{ "status":0, "QTime":9746}, "core":"test_collection_shard1_replica2"}, "192.168.252.122:8983_solr":{ "responseHeader":{ "status":0, "QTime":9857}, "core":"test_collection_shard1_replica3"}, "192.168.252.121:8983_solr":{ "responseHeader":{ "status":0, "QTime":9899}, "core":"test_collection_shard2_replica1"}}}
SolrCloud狀態 圖表
能夠看到 solr 2個分片,個3個副本
若是您不肯定SolrCloud狀態
$ /opt/solr-6.6.0/bin/solr status
響應
Found 1 Solr nodes: Solr process 2926 running on port 8983 { "solr_home":"/opt/solr-6.6.0/server/solr", "version":"6.6.0 5c7a7b65d2aa7ce5ec96458315c661a18b320241 - ishan - 2017-05-30 07:32:53", "startTime":"2017-08-24T08:32:16.683Z", "uptime":"0 days, 0 hours, 34 minutes, 51 seconds", "memory":"63.8 MB (%13) of 490.7 MB", "cloud":{ "ZooKeeper":"node1:2181,node2:2181,node3:2181", "liveNodes":"3", "collections":"1"}}
/opt/solr-6.6.0/bin/solr create_collection -c www_ymq_io_collection -shards 2 -replicationFactor 3 -force
在任意一臺機器 ,執行命令 ./solr delete -c <collection>
將檢查 /opt/solr-6.6.0/server/solr/test_collection_shard1_replica2
/opt/solr-6.6.0/server/solr/test_collection_shard2_replica2
配置目錄是否被其餘集合使用。若是沒有,那麼該目錄將從SolrCloud 集羣 中刪除
$ /opt/solr-6.6.0/bin/solr delete -c test_collection
Connecting to ZooKeeper at node1:2181,node2:2181,node3:2181 INFO - 2017-08-24 17:56:53.679; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at node1:2181,node2:2181,node3:2181 ready Deleting collection 'test_collection' using command: http://node3:8983/solr/admin/collections?action=DELETE&name=test_collection { "responseHeader":{ "status":0, "QTime":924}, "success":{ "node1:8983_solr":{"responseHeader":{ "status":0, "QTime":69}}, "node3:8983_solr":{"responseHeader":{ "status":0, "QTime":86}}, "node2:8983_solr":{"responseHeader":{ "status":0, "QTime":91}}}}
在任意一臺機器 ,中止 SolrCloud 集羣
在SolrCloud模式下中止Solr,可使用 -all
$ for a in {1..3} ; do ssh node$a "source /etc/profile; /opt/solr-6.6.0/bin/solr stop -all " ; done
或者
$ for a in {1..3} ; do ssh node$a "source /etc/profile; /opt/solr-6.6.0/bin/solr stop -cloud -z node1:2181, -z node2:2181, -z node3:2181 -p 8983 -force" ; done
healthcheck
命收集有關集合中每一個副本的基本信息,例如副本數量,當前運行狀態,是否正常,以及每一個副本運行多長時間,內存 和地址(副本在羣集中的位置)
$ /opt/solr-6.6.0/bin/solr healthcheck -c test_collection -z node1:2181,node2:2181,node3:2181 -p 8983 -force
響應
INFO - 2017-08-24 16:34:26.906; org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider; Cluster at node1:2181,node2:2181,node3:2181 ready { "collection":"test_collection", "status":"healthy", "numDocs":0, "numShards":2, "shards":[ { "shard":"shard1", "status":"healthy", "replicas":[ { "name":"core_node3", "url":"http://node1:8983/solr/test_collection_shard1_replica1/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 2 minutes, 10 seconds", "memory":"58.6 MB (%12) of 490.7 MB", "leader":true}, { "name":"core_node5", "url":"http://node2:8983/solr/test_collection_shard1_replica3/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 58 seconds", "memory":"50.2 MB (%10.2) of 490.7 MB"}, { "name":"core_node6", "url":"http://node3:8983/solr/test_collection_shard1_replica2/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 46 seconds", "memory":"56.3 MB (%11.5) of 490.7 MB"}]}, { "shard":"shard2", "status":"healthy", "replicas":[ { "name":"core_node1", "url":"http://node1:8983/solr/test_collection_shard2_replica1/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 2 minutes, 10 seconds", "memory":"58.6 MB (%12) of 490.7 MB", "leader":true}, { "name":"core_node2", "url":"http://node3:8983/solr/test_collection_shard2_replica2/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 46 seconds", "memory":"58.8 MB (%12) of 490.7 MB"}, { "name":"core_node4", "url":"http://node2:8983/solr/test_collection_shard2_replica3/", "numDocs":0, "status":"active", "uptime":"0 days, 0 hours, 1 minutes, 58 seconds", "memory":"51.9 MB (%10.6) of 490.7 MB"}]}]}
配置文件上傳到ZooKeeper 集羣
可用參數(全部參數都是必需的)
-n <name>
在ZooKeeper中設置的配置名稱,能夠經過管理界面,點擊菜單,Cloud 選中 Tree / configs 下查看,配置列表 -d <configset dir>
配置設置爲上傳的路徑。路徑須要有一個「conf」目錄,依次包含solrconfig.xml等。最好能夠提供絕對路徑 -z <zkHost>
Zookeeper IP 端口,多個zk用"," 分隔
SolrCloud是經過Zookeeper集羣來保證配置文件的變動及時同步到各個節點上,因此,能夠將配置文件上傳到Zookeeper集羣。
$ /opt/solr-6.6.0/bin/solr zk upconfig -z node1:2181,node2:2181,node3:2181 -n mynewconfig -d /opt/solr-6.6.0/server/solr/configsets/basic_configs/
響應
Connecting to ZooKeeper at node1:2181,node2:2181,node3:2181 ... Uploading /opt/solr-6.6.0/server/solr/configsets/basic_configs/conf for config mynewconfig to ZooKeeper at node1:2181,node2:2181,node3:2181
刪除上傳到ZooKeeper 集羣的solr 配置
rm
刪除-r
遞歸刪除
$ /opt/solr-6.6.0/bin/solr zk rm -r /configs/mynewconfig -z node1:2181,node2:2181,node3:2181
響應
Connecting to ZooKeeper at node1:2181,node2:2181,node3:2181 ... Removing Zookeeper node /configs/mynewconfig from ZooKeeper at node1:2181,node2:2181,node3:2181 recurse: true