天天看點

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

本篇博文講解如何在浏覽器中通過發起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

url

中的引号, 直接在浏覽器的位址欄中發起HTTP請求, 效果更明顯.

直接在浏覽器的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) 如果

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)
           

(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, 測試結果如圖:

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

SPLITSHARD

指令不能用于使用了自定義哈希的叢集, 因為這樣的叢集沒有一個明确的哈希範圍 —— 它隻用于具有plain或compositeid路由的叢集;

② 該指令将指定的shard的切割成 兩個新的具有相同資料的分片, 并根據新分片的路由範圍切割父分片 (被切割的shard) 中的文檔;

③ 新的分片将被命名為

shardx_0

shardx_1

—— 表明是從

shardx

上分裂得到的新Shard;

④ 一旦新分片被成功建立, 它們就會被立即激活, 同時父分片也将被暫停 —— 新的讀寫請求就不會被發送到父分片中了, 而是直接路由到新的切割生成的新分片中;

④ 該特征能夠保證無縫切割和無故障時間: 父分片資料不會被删除, 在切割操作完成之前, 父分片将繼續提供讀寫請求, 直到切割完成.

(3) 使用注意事項:

① 切割分片後, 再使用

DELETESHARD

指令删除被切割的原始Shard, 就能保證資料不備援, 當然也可以通過

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_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  
           

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