Solr 13 - 管理SolrCloud集群 (創建集合、添加副本、切割分片、更新配置)


說明: 本篇所有curl操作是在終端中進行的, 當然可以省去curlurl中的引號, 直接在瀏覽器的地址欄中發起HTTP請求, 效果更明顯.

1 創建Collection、Core

1.1 創建collection

直接在瀏覽器的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自動分配, 不能手動選擇具體的數據存放路徑、實例存放路徑.

1.2 創建core

手動指定實例存放路徑和數據存放路徑:

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.3 創建操作中的參數

(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) 如果maxShardsPerNode * nodeNum < numShards * replicationFactor, CREATE操作將失敗, 報錯信息如下:

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)

2 刪除Collection、Core、Shard

(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, 內容如下:
刪除Shard后core的信息變為已卸載.jpg

3 加載Collection、Core

(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'

4 查看集群狀態

(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的路由、活躍狀態、副本狀態等信息.

5 添加副本(ADDREPLICA)

如果服務器配置優良, 為了提高檢索性能, 我們可以通過為分片添加副本.

如果要在指定的節點中創建副本, 則可以指定節點名稱 —— 可以在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>

6 切割分片(SPLITSHARD)

(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, 測試結果如圖:
SolrCloud切割分片

SPLITSHARD命令不能用於使用了自定義哈希的集群, 因為這樣的集群沒有一個明確的哈希范圍 —— 它只用於具有plain或compositeid路由的集群;
② 該命令將指定的shard的切割成 兩個新的具有相同數據的分片, 並根據新分片的路由范圍切割父分片 (被切割的shard) 中的文檔;
③ 新的分片將被命名為shardx_0shardx_1 —— 表明是從shardx上分裂得到的新Shard;
④ 一旦新分片被成功創建, 它們就會被立即激活, 同時父分片也將被暫停 —— 新的讀寫請求就不會被發送到父分片中了, 而是直接路由到新的切割生成的新分片中;
該特征能夠保證無縫切割和無故障時間: 父分片數據不會被刪除, 在切割操作完成之前, 父分片將繼續提供讀寫請求, 直到切割完成.

(3) 使用注意事項:

① 切割分片后, 再使用DELETESHARD命令刪除被切割的原始Shard, 就能保證數據不冗余, 當然也可以通過UNLOAD命令卸載被切割的Shard;
② 原Shard目錄下的配置文件會變成core.properties.unloaded, 也就是加了個卸載標示; data目錄下保存索引數據的index目錄被刪除 —— 從側面印證了數據完成了切分和遷移;
SolrCloud不支持對索引到其他Shard上的數據的動態遷移, 可以通過切割分片實現SolrCloud的擴容, 這只會對 切割操作之后、路由的哈希范圍仍然屬於原分片的數據 進行擴容.

7 操作集合別名(操作成功, 但未查出區別)

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'

8 更新集群的配置

集群會發生變化的就是collection的配置, 因此當配置文件發生變化后就應該使用命令更新ZooKeeper中的配置信息. 對此, Solr提供了很好的運維工具:

8.1 將配置文件上傳到ZooKeeper中

需要的jar包: $SOLR_HOME/example/lib/ext/* 以及 Solr項目的WEB-INF/lib/*, 這里已經將ext下的jar包拷貝到了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  

8.2 將ZooKeeper中的配置文件與Collection相關聯

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)

感謝閱讀, 如果文章有幫助或啟發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜

本文版權歸博主所有, 歡迎轉載, 但 [必須在文章頁面明顯位置標明原文鏈接], 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM