本篇博文講解如何在浏覽器中通過發起HTTP請求的方式, 使用 SolrCloud 的RESTful API對Collection、Core等進行增删改查操作, 并介紹了為某個分片添加副本(ADDREPLICA)、切割分片(SPLITSHARD)、操作 Solr叢集的别名、更新叢集配置資訊等内容.
目錄
- 1 建立Collection、Core
- 1.1 建立collection
- 1.2 建立core
- 1.3 建立操作中的參數
- 2 删除Collection、Core、Shard
- 3 加載Collection、Core
- 4 檢視叢集狀态
- 5 添加副本(ADDREPLICA)
- 6 切割分片(SPLITSHARD)
- 7 操作集合别名(操作成功, 但未查出差別)
- 8 更新叢集的配置
- 8.1 将配置檔案上傳到ZooKeeper中
- 8.2 将ZooKeeper中的配置檔案與Collection相關聯
- 參考資料
- 版權聲明
說明: 本篇所有操作是在終端中進行的, 當然可以省去
curl
和
curl
中的引号, 直接在浏覽器的位址欄中發起HTTP請求, 效果更明顯.
url
直接在浏覽器的URL位址欄進行操作, 指令如下:
http://localhost:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=3&replicationFactor=4
或者: 直接在終端的指令行中操作(注意curl之後的内容需要加單引号或雙引号):
curl 'http://localhost:8080/solr/admin/collections?action=CREATE&name=mycollection&numShards=3&replicationFactor=4'
上述方式建立的Collection中, Shard和Replica由Solr自動配置設定, 不能手動選擇具體的資料存放路徑、執行個體存放路徑.
手動指定執行個體存放路徑和資料存放路徑:
curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=my_collection-shard1-replica1&instanceDir=/usr/solr/my_collection-shard1-replica1&dataDir=/data_solr/my_collection-shard1-replica1&collection=my_collection&shard=shard1'
curl 'http://localhost:8080/solr/admin/cores?action=CREATE&name=my_collection-shard1-replica2&instanceDir=/usr/solr/my_collection-shard1-replica2&dataDir=/data_solr/my_collection-shard1-replica2&collection=my_collection&shard=shard1'
這樣可以建立出一個collection, 并自己指定該collection的shard和replica的所有配置項.
(1) action: 要操作動作的名稱;
(2) name: 要建立的集合名稱;
(3) numShards: 集合分片的個數;
(4) replicationFactor(副本因子): 每個分片配備的副本數, 包括Leader和Replica;
(5) collection.configName: 建立新集合時所使用的配置檔案的名稱, 如果不指定, 就會預設使用name作為配置檔案的名稱.
(6) createNodeSet: 如果不提供該參數, 建立操作會将Replica分布到所有活躍的Solr節點上. 這個參數用于建立分片和副本的節點集合, 格式為:
createNodeSet=node1:8081_solr,node2:8082_solr,node3:8083_solr
(7) maxShardsPerNode: 指定每個Node可以建立的Shard數, 預設為1.
a) 建立操作将生成
numShards * replicationFactor
個副本, 并盡可能均勻地分布在所有活躍的Node上;
b) 為了保證高可用, 同一個Solr節點上不能存在同一Shard的多個副本;
c) 如果
, CREATE操作将失敗, 報錯資訊如下:
maxShardsPerNode * nodeNum < numShards * replicationFactor
org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Cannot create collection mycollection. Value of maxShardsPerNode is 3, and the number of live nodes is 3. This allows a maximum of 9 to be created. Value of numShards is 3 and value of replicationFactor is 4. This requires 12 shards to be created (higher than the allowed number)
(1) 删除collection:
collections的API不支援UNLOAD操作;
删除操作将直接删除指定的collection, 包括其目錄檔案.
curl 'http://localhost:8080/solr/admin/collections?action=DELETE&name=collection1&indent=true'
name: 将被删除的集合的名稱;
indent=true: 格式化(有縮進)顯示響應結果.
(2) 解除安裝core:
cores的API不支援DELETE操作;
解除安裝操作将解除安裝指定的collection_shard_replica, 并不會删除目錄檔案.
curl 'http://localhost:8080/solr/admin/cores?action=UNLOAD&core=collection1_shard1_replica2&deleteIndex=true&indent=true'
(3) 删除shard:
這個操作一般配合切分分片(SPLITSHARD)來使用: 切分分片後, 删除被切分的分片.
curl 'http://localhost:8080/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=collection1'
删除操作并不會删除對應Shard的目錄檔案, 但是會删除其存放index檔案的目錄, 并将記錄core資訊的檔案标記為已解除安裝:, 内容如下:
core.properties.unloaded
![]()
Solr 13 - 管理SolrCloud叢集 (建立集合、添加副本、切割分片、更新配置)
(1) 重新加載collection:
collections的API不支援LOAD操作;
被解除安裝了的core并不會被RELOAD進來.
curl 'http://localhost:8080/solr/admin/collections?action=RELOAD&name=collection1&indent=true'
name: 将被重新加載的集合的名稱.
(2) 加載core:
cores的API不支援RELOAD操作;
可以LOAD某一個collection, 但被解除安裝了的core不能被LOAD進來;
可以LOAD某一個指定的core, 但被解除安裝了的core也不能被LOAD進來.
curl 'http://localhost:8080/solr/admin/cores?action=LOAD&core=collection1_shard1_replica2&indent=true'
(1) 檢視叢集的Cloud data:
此操作亦可通過浏覽器的URL檢視, 格式化響應結果, 更加清晰:
curl 'http://localhost:8080/solr/zookeeper?wt=json&detail=true&path=/clusterstate.json'
(2) 檢視叢集中的所有core:
curl 'http://localhost:8080/solr/admin/collections?action=LIST'
(3) 檢視叢集的健康狀況:
curl 'http://localhost:8080/solr/admin/collections?action=CLUSTERSTATUS'
可以檢視到Shard的路由、活躍狀态、副本狀态等資訊.
如果伺服器配置優良, 為了提高檢索性能, 我們可以通過為分片添加副本.
如果要在指定的節點中建立副本, 則可以指定節點名稱 —— 可以在
http://localhost:8080/solr/#/~cloud?view=tree
中的
live_nodes
下檢視活躍的節點, 一般格式都是:
/live_nodes
172.16.10.11:8080_solr
172.16.10.12:8080_solr
172.16.10.13:8080_solr
(1) 使用方式:
http://localhost:8080/solr/admin/collections?action=ADDREPLICA&collection=collection1&shard=shard1&node=nodeName
①
collection
: 集合的名稱;
shard: 要添加副本的分片, 如果不指定, 就要指定_route_參數 —— 如果無法确定分片名, 就可以傳遞該_route_值, 系統會識别這個_route_所屬的分片, 然後完成相關操作;
②
node
: 應該建立副本的節點的名稱, 必須活躍, 必須是活躍節點, 可不指定, Solr會自動進行負載均衡;
③
instanceDir
: 将被建立的核心的instanceDir, 可不指定;
④
dataDir
: 應在其中建立核心的目錄, 可不指定;
⑤
: 要建立的副本的類型, 有以下幾種: (可不指定)
type
nrt: NRT類型維護事務日志并在本地更新其索引, 這是預設的, 也是最常用的;
tlog: TLOG類型維護事務日志, 但隻通過複制更新其索引;
pull: PULL類型不維護事務日志, 隻通過複制更新其索引. 這種類型沒有資格成為Leader.
(2) 使用示例:
http://localhost:8080/solr/admin/collections?action=ADDREPLICA&collection=test&shard=shard1&node=172.16.10.11:8080_solr
操作成功後的響應資訊為:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1496</int>
</lst>
<lst name="success">
<lst>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1407</int>
</lst>
<!-- 添加成功後的副本名稱 -->
<str name="core">test_shard1_replica2</str>
</lst>
</lst>
</response>
(1) 切割示例:
curl 'http://localhost:8080/solr/admin/collections?action=SPLITSHARD&collection=mycollection&shard=shard2&indent=true'
collection: 集合的名稱;
shard: 将被切割的分片ID, 必須存在, 且目前Collection的shard個數必須大于1個(已驗證).
(2) 該特性釋出于Solr4.3, 測試結果如圖:
SPLITSHARD
指令不能用于使用了自定義哈希的叢集, 因為這樣的叢集沒有一個明确的哈希範圍 —— 它隻用于具有plain或compositeid路由的叢集;
② 該指令将指定的shard的切割成 兩個新的具有相同資料的分片, 并根據新分片的路由範圍切割父分片 (被切割的shard) 中的文檔;
③ 新的分片将被命名為
shardx_0
—— 表明是從
shardx_1
shardx
上分裂得到的新Shard;
④ 一旦新分片被成功建立, 它們就會被立即激活, 同時父分片也将被暫停 —— 新的讀寫請求就不會被發送到父分片中了, 而是直接路由到新的切割生成的新分片中;
④ 該特征能夠保證無縫切割和無故障時間: 父分片資料不會被删除, 在切割操作完成之前, 父分片将繼續提供讀寫請求, 直到切割完成.
(3) 使用注意事項:
① 切割分片後, 再使用指令删除被切割的原始Shard, 就能保證資料不備援, 當然也可以通過
DELETESHARD
UNLOAD
指令解除安裝被切割的Shard;
② 原Shard目錄下的配置檔案會變成
, 也就是加了個解除安裝标示;
core.properties.unloaded
目錄下儲存索引資料的
data
index
目錄被删除 —— 從側面印證了資料完成了切分和遷移;
③ SolrCloud不支援對索引到其他Shard上的資料的動态遷移, 可以通過切割分片實作SolrCloud的擴容, 這隻會對 切割操作之後、路由的哈希範圍仍然屬于原分片的資料 進行擴容.
Solr允許使用者建立獨立的指向一個或多個真實集合的虛拟集合, 可以在運作時修改别名.
(1) 建立或修改别名:
curl 'http://localhost:8080/solr/admin/collections?action=CREATEALIAS&name=alias&collections=collection1&indent=true'
用來修改的别名應該隻映射一個獨立的集合, 讀取的别名能映射一個或多個集合.
(2) 移除存在的别名:
curl 'http://localhost:8080/solr/admin/collections?action=DELETEALIAS&name=alias&indent=true'
叢集會發生變化的就是collection的配置, 是以當配置檔案發生變化後就應該使用指令更新ZooKeeper中的配置資訊. 對此, Solr提供了很好的運維工具:
需要的jar包:以及 Solr項目的
$SOLR_HOME/example/lib/ext/*
, 這裡已經将ext下的jar包拷貝到了
WEB-INF/lib/*
目錄下, 便捷很多.
WEB-INF/lib
cd /data/solr-cloud/tomcat/display/solr/WEB-INF/lib
下述一長串是一條指令, 為了便于檢視, 使用了反斜杠(\)來斷句, 如果使用中出現問題, 可将反斜杠(\)删除, 并删除所有的換行, 然後回車執行.
# 注意本地路徑, 以及../classes/log4j.properties檔案的路徑 java -classpath .:* \ -Dlog4j.configuration=file:../classes/log4j.properties \ org.apache.solr.cloud.ZkCLI -cmd upconfig \ -zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181 \ -confdir /data/solr-cloud/tomcat/solrhome/collection1/conf \ -confname myconf2
建議: 将配置檔案單獨存放, 比如: 我這裡将整個
example/solr/collection1/conf
存放至
/data/solr-cloud/tomcat
下, 之後執行配置檔案的更新:
java -classpath .:* \
-Dlog4j.configuration=file:../classes/log4j.properties \
org.apache.solr.cloud.ZkCLI -cmd upconfig \
-zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181 \
-confdir /data/solr-cloud/tomcat/conf \
-confname myconf
cd /data/solr-cloud/tomcat/display/solr/WEB-INF/lib
java -classpath .:* \
-Dlog4j.configuration=file:../classes/log4j.properties \
org.apache.solr.cloud.ZkCLI -cmd linkconfig \
-collection mycollection -confname myconf \
-zkhost 10.0.20.50:2181,10.0.20.51:2181,10.0.20.52:2181
注意: 配置檔案若被删除, 将會導緻ZooKeeper中的配置檔案被同步删除, 進而在建立collection時将出現問題.
可關閉Tomcat服務與ZooKeeper服務, 删除ZooKeeper目錄下的配置檔案的版本資訊, 然後再次啟動ZooKeeper更新配置檔案, 最後啟動Tomcat服務繼續測試.
Solr光放文檔 - SPLITSHARD: Split a Shard
solr安裝-tomcat+solrCloud建構穩健solr叢集
作者: 馬瘦風(https://healchow.com)
出處: 部落格園 馬瘦風的部落格(https://www.cnblogs.com/shoufeng)
感謝閱讀, 如果文章有幫助或啟發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜
本文版權歸部落客所有, 歡迎轉載, 但 [必須在文章頁面明顯位置标明原文連結], 否則部落客保留追究相關人員法律責任的權利.