CentOs7.3 搭建 SolrCloud 叢集服務
CentOs7.3 搭建 SolrCloud 叢集服務
一、概述
Lucene是一個Java語言編寫的利用倒排原理實現的文字檢索類庫
Solr是以Lucene為基礎實現的文字檢索應用服務。Solr部署方式有單機方式、多機Master-Slaver方式、Cloud方式。
SolrCloud是基於Solr和Zookeeper的分散式搜尋方案。當索引越來越大,一個單一的系統無法滿足磁碟需求,查詢速度緩慢,此時就需要分散式索引。在分散式索引中,原來的大索引,將會分成多個小索引,solr可以將這些小索引返回的結果合併,然後返回給客戶端。
二、特色功能
SolrCloud有幾個特色功能:
集中式的配置資訊使用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功能。
三、SolrCloud的基本概念
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。
四、Solr 文件
http://lucene.apache.org/solr/guide/6_6/solrcloud.html
https://cwiki.apache.org/confluence/display/solr/
https://cwiki.apache.org/confluence/display/solr/Format+of+solr.xml
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=50234737
環境
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 叢集服務》
https://segmentfault.com/a/1190000010807875
JDK環境:jdk-8u144-linux-x64.tar.gz 具體參考《CentOs7.3 安裝 JDK1.8》
https://segmentfault.com/a/1190000010716919
注意事項
關閉防火牆
$ systemctl stop firewalld.service
Solr 6(和SolrJ客戶端庫)的Java支援的最低版本現在是Java 8。
Solr 安裝
提取tar檔案
$ 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
叢集配置
1.編輯 solr.in.sh
叢集中的每臺機器都要按照以下說明進行配置啟動
首先到 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"
2.複製 Solr 配置
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
3.啟動 ZooKeeper 叢集
$ for a in {1..3} ; do ssh node$a "source /etc/profile; /opt/zookeeper-3.4.9/bin/zkServer.sh start" ; done
4.啟動 SolrCloud 叢集
在任意一臺機器,啟動 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
5.建立叢集庫
在任意一臺機器
$ /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個副本
6.服務狀態
如果您不確定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
7.刪除叢集庫
在任意一臺機器 ,執行命令 ./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}}}}
8.停止叢集
在任意一臺機器 ,停止 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
9.副本狀態
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"}]}]}
10.ZK管理配置
配置檔案上傳到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
Contact
- 作者:鵬磊
- 出處:http://www.ymq.io/2017/08/23/SolrCloud
- Email:[email protected]
- 版權歸作者所有,轉載請註明出處
- Wechat:關注公眾號,搜雲庫,專注於開發技術的研究與知識分享