分片管理命令

在 SolrCloud 中,分片是集合的邏輯分割。此分割儲存集合的整個索引的一部分。

您擁有的分片數量有助於決定單個集合總共可以包含多少個文件,並且也會影響搜尋效能。

本節中的所有範例都假設您正在執行「技術產品」Solr 範例

bin/solr start -c -e techproducts

SPLITSHARD:分割分片

  • V1 API

  • V2 API

輸入

https://127.0.0.1:8983/solr/admin/collections?action=SPLITSHARD&collection=techproducts&shard=shard1

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 137
  }
}

輸入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards -H 'Content-Type: application/json' -d '
  {
    "split":{
      "shard":"shard1"
    }
  }
'

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

分割分片會將現有的分片分成兩個部分,並以兩個(新的)分片的形式寫入磁碟。原始分片將繼續包含與原來相同的資料,但它會開始將請求重新路由到新的分片。新的分片將具有與原始分片相同的副本數。分割分片後會自動發出軟提交,以便文件在子分片上可見。在分割操作之後,不需要明確提交(硬提交或軟提交),因為索引會在分割操作期間自動保存到磁碟。

此命令允許無縫分割,且不需要停機。正在分割的分片將繼續接受查詢和索引請求,並且一旦此操作完成,將自動開始將請求路由到新的分片。此命令只能用於使用 numShards 參數建立的 SolrCloud 集合,這表示依賴 Solr 基於雜湊的路由機制的集合。

分割的執行方式是將原始分片的雜湊範圍劃分為兩個相等的分區,並根據新的子範圍分割原始分片中的文件。以下討論的兩個參數 rangessplit.key 可進一步控制分割的發生方式。

新建立的分片將具有與父分片相同的副本數,且副本類型相同。

當使用 splitMethod=rewrite (預設) 時,您必須確保執行父分片領導者的節點有足夠的可用磁碟空間,即大於索引大小的兩倍以上,才能成功分割。

此外,產生的子分片的第一個副本將始終放置在分片領導者節點上。

分片分割可能是一個長時間運行的過程。為了避免逾時,您應該將此作為非同步呼叫執行。

SPLITSHARD 參數

collection

必填

預設值:無

包含要分割之分片的集合名稱。此參數為必填。

shard

選填

預設值:無

要分割的分片名稱。當未指定 split.key 時,此參數為必填。

ranges

選填

預設值:無

以逗號分隔的十六進位雜湊範圍列表,例如 ranges=0-1f4,1f5-3e8,3e9-5dc

此參數可用於將原始分片的雜湊範圍分割為以十六進位指定的任意雜湊範圍間隔。例如,如果原始雜湊範圍為 0-1500,則加入以下參數:ranges=0-1f4,1f5-3e8,3e9-5dc 會將原始分片分割為三個分片,雜湊範圍分別為 0-500501-10001001-1500

split.key

選填

預設值:無

用於分割索引的索引鍵。

此參數可用於使用路由索引鍵分割分片,以便指定路由索引鍵的所有文件最終都落在單個專用子分片中。在這種情況下,不需要提供 shard 參數,因為路由索引鍵足以找出正確的分片。不支援跨越多個分片的路由索引鍵。

例如,假設 split.key=A! 雜湊到範圍 12-15,並屬於範圍為 0-20 的分片「shard1」。按此路由索引鍵分割會產生三個子分片,範圍為 0-1112-1516-20。請注意,具有路由索引鍵雜湊範圍的子分片也可能包含其他雜湊範圍重疊的路由索引鍵文件。

numSubShards

選填

預設值:2

要將父分片分割成的子分片數量。此參數允許的值在 2-8 的範圍內。

只有在未指定 rangessplit.key 時才能使用此參數。

splitMethod

選填

預設值:rewrite

目前支援兩種分片分割方法:* rewrite:在選擇要在每個分割區中保留的文件之後,此方法會從頭開始建立子索引,這是一個耗時的 CPU 和 I/O 密集型過程,但會產生最佳大小的子索引,其中不包含任何不屬於每個分割區的文件資料。* link:使用檔案系統層級的硬連結來建立原始索引檔案的複本,然後僅修改每個分割區中包含已刪除文件列表的檔案。此方法比 rewrite 方法快很多,而且資源消耗較少,但產生的子索引仍然與原始索引一樣大,因為它們仍然包含不屬於分割區的文件資料。這會減慢複製過程,並在副本節點上消耗更多磁碟空間(除非不支援硬連結,否則多個硬連結的複本不會佔用領導者節點上的額外磁碟空間)。

splitFuzz

選填

預設值:0.0

一個浮點數值,必須小於 0.5,允許將子分片範圍按總分片範圍的此百分比進行變化,奇數分片較大,偶數分片較小。

property.name=value

選填

預設值:無

將核心屬性名稱設定為。如需有關支援的屬性和值的詳細資訊,請參閱核心探索章節。

waitForFinalState

選填

預設值:false

如果為 true,則只有在所有受影響的副本都變為活動狀態時,請求才會完成。如果為 false,則 API 將傳回單個動作的狀態,這可能在新副本上線並處於活動狀態之前。

timing

選填

預設值:false

如果為 true,則會對每個處理階段進行計時,並且回應中會包含 timing 區段。

async

選填

預設值:無

追蹤此動作的請求 ID,該動作將以非同步方式處理

splitByPrefix

選填

預設值:false

如果為 true,則分割點將透過考量分片中 compositeId 值的分配情況來選取。compositeId 的形式為 <prefix>!<suffix>,其中所有具有相同前綴的文件都共置於雜湊空間中。如果正在分割的分片中有數個前綴,則會選取分割點,以便將前綴分割為盡可能大小相等的分片,而不分割任何前綴。如果分片中只有一個前綴,則前綴的範圍將分割成兩半。

通常會掃描 id 欄位以判斷每個前綴的文件數量。作為最佳化,如果存在名為 id_prefix 的選用欄位,且該欄位已為每個文件建立索引 (包括 !) 的文件前綴,則將使用該欄位來產生計數。

填入 id_prefix 的一種簡單方式是在結構描述中使用 copyField

  <!-- OPTIONAL, for optimization used by splitByPrefix if it exists -->
  <field name="id_prefix" type="composite_id_prefix" indexed="true" stored="false"/>
  <copyField source="id" dest="id_prefix"/>
  <fieldtype name="composite_id_prefix" class="solr.TextField">
    <analyzer>
      <tokenizer class="solr.PatternTokenizerFactory" pattern=".*!" group="0"/>
    </analyzer>
  </fieldtype>

目前實作詳細資訊和限制

  • 前綴大小是使用具有該前綴的文件數量來計算的。

  • 僅支援兩層 compositeId。

  • 分片只能分割為兩個。

SPLITSHARD 回應

輸出將包含請求的狀態和新的分片名稱,這些名稱將使用原始分片作為基礎,並加上底線和數字。例如,「shard1」將變為「shard1_0」和「shard1_1」。如果狀態不是「success」,錯誤訊息將說明請求失敗的原因。

其他設定

分割分片時,會對領導者分片的本機檔案系統執行可用磁碟空間檢查。可以透過 solr.shardSplit.checkDiskSpace.enabled 系統屬性 (即 -Dsolr.shardSplit.checkDiskSpace.enabled=false) 停用此檢查。對於HDFS,預設已停用。

CREATESHARD:建立分片

只能透過此 API 為使用「implicit」路由器的集合 (即,建立集合時,router.name=implicit) 建立分片。可以為現有的「implicit」集合建立具有名稱的新分片。

對於使用「compositeId」路由器 (router.key=compositeId) 建立的集合,請使用 SPLITSHARD。

  • V1 API

  • V2 API

輸入

https://127.0.0.1:8983/solr/admin/collections?action=CREATESHARD&shard=newShardName&collection=techproducts

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 120
  }
}

輸入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards -H 'Content-Type: application/json' -d '
  {
    "shard":"newShardName"
  }
'

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

集合的 replicationFactornrtReplicastlogReplicaspullReplicas 的預設值會用於判斷要為新分片建立的副本數量。您可以透過將對應的參數明確傳遞給請求來自訂此設定。

CREATESHARD 參數

collection

必填

預設值:無

包含要分割的分片的集合名稱。在 v1 請求中以查詢參數提供,在 v2 請求中則以路徑參數提供。

shard

必填

預設值:無

要建立的分片名稱。

createNodeSet

選填

預設值:無

允許定義要將新集合散佈到的節點。如果未提供,CREATESHARD 作業將建立散佈在所有作用中 Solr 節點上的分片副本。

格式是以逗號分隔的節點名稱列表,例如 localhost:8983_solr,localhost:8984_solr,localhost:8985_solr

nrtReplicas

選填

預設值:請參閱說明

應為新分片建立的 nrt 副本數量。如果省略,則使用集合的預設值。

tlogReplicas

選填

預設值:請參閱說明

應為新分片建立的 tlog 副本數量。如果省略,則使用集合的預設值。

pullReplicas

選填

預設值:請參閱說明

應為新分片建立的 pull 副本數量。如果省略,則使用集合的預設值。

property.name=value

選填

預設值:無

將核心屬性名稱設定為。如需有關支援的屬性和值的詳細資訊,請參閱核心探索章節。

waitForFinalState

選填

預設值:false

如果為 true,則只有在所有受影響的副本都變為活動狀態時,請求才會完成。如果為 false,則 API 將傳回單個動作的狀態,這可能在新副本上線並處於活動狀態之前。

async

選填

預設值:無

追蹤此動作的請求 ID,該動作將以非同步方式處理

CREATESHARD 回應

輸出將包含請求的狀態。如果狀態不是「success」,錯誤訊息將說明請求失敗的原因。

DELETESHARD:刪除分片

刪除分片將卸載該分片的所有副本,將其從集合的 state.json 中移除,並且 (預設) 刪除每個副本的 instanceDir 和 dataDir。它只會移除不活動的分片,或未提供自訂分片範圍的分片。

  • V1 API

  • V2 API

https://127.0.0.1:8983/solr/admin/collections?action=DELETESHARD&shard=shard1&collection=techproducts
curl -X DELETE https://127.0.0.1:8983/api/collections/techproducts/shards/shard1

DELETESHARD 參數

collection

必填

預設值:無

包含要刪除之分片的集合名稱。在 v1 和 v2 請求中分別以查詢參數或路徑參數提供。

shard

必填

預設值:無

要刪除的分片名稱。在 v1 和 v2 請求中分別以查詢參數或路徑參數提供。

deleteInstanceDir

選填

預設值:true

預設情況下,Solr 會刪除每個已刪除副本的整個 instanceDir。將此設定為 false 以防止刪除執行個體目錄。

deleteDataDir

選填

預設值:true

預設情況下,Solr 會刪除每個已刪除副本的 dataDir。將此設定為 false 以防止刪除資料目錄。

deleteIndex

選填

預設值:true

預設情況下,Solr 會刪除每個已刪除副本的索引。將此設定為 false 以防止刪除索引目錄。

followAliases

選填

預設值:false

一個旗標,允許將集合參數視為要解析的實際集合名稱的別名。

async

選填

預設值:無

追蹤此動作的請求 ID,該動作將以非同步方式處理

DELETESHARD 回應

輸出將包含請求的狀態。如果狀態不是「success」,錯誤訊息將說明請求失敗的原因。

FORCELEADER:強制分片領導者

在分片不太可能失去其領導者的情況下,可以呼叫此命令來強制選出新的領導者。

  • V1 API

  • V2 API

輸入

https://127.0.0.1:8983/solr/admin/collections?action=FORCELEADER&collection=techproducts&shard=shard1

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 78
  }
}

輸入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards/shard1/force-leader

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

FORCELEADER 參數

collection

必填

預設值:無

集合的名稱。此參數為必填。

shard

必填

預設值:無

應執行領導者選舉的分片名稱。此參數為必填。

這是一個專家級命令,只有在一般領導者選舉無法運作時才應呼叫。這可能會導致資料遺失,如果新的領導者沒有某些更新 (可能是最近的更新),而舊的領導者在關閉之前已確認這些更新。

INSTALLSHARDDATA:將資料安裝/匯入分片

在正常情況下,資料會透過索引文件新增至 Solr 集合 (以及構成它們的分片)。但是,某些使用案例需要離線建構每個分片的索引。通常這樣做是為了將查詢流量與索引負載隔離,或是因為使用的 ETL 管線特別複雜。INSTALLSHARDDATA API 允許將這些預先建構的索引安裝到集合中的個別分片中。安裝會將索引檔案複製到分片中的所有副本,覆寫該分片擁有的任何先前存在的資料。

若要將資料安裝到分片中,必須先使用 MODIFYCOLLECTION API 將擁有該分片的集合置於「readOnly」模式。一旦進入唯讀模式,就可以依序或平行方式完成分片安裝。可以從 Solr 的可插拔備份儲存庫抽象支援的任何 repositorylocation 匯入資料。

指定的 location 必須包含構成核心 data/index 目錄的所有檔案。使用者有責任確保安裝到分片的索引與託管該分片的集合的結構描述和組態相容。

  • V1 API

  • V2 API

輸入

https://127.0.0.1:8983/solr/admin/collections?action=INSTALLSHARDDATA&collection=techproducts&shard=shard1&repository=localfs&location=/mounts/myNFSDrive/tech/shard1/data/index

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 78
  }
}

輸入

curl -X POST https://127.0.0.1:8983/api/collections/techproducts/shards/shard1/install -H 'Content-Type: application/json' -d '
  {
    "repository": "localfs",
    "location": "/mounts/myNFSDrive/tech/shard1/data/index"
  }
'

輸出

{
  "responseHeader": {
    "status": 0,
    "QTime": 125
  }
}

INSTALLSHARDDATA 參數

collection

必填

預設值:無

集合的名稱。此參數為必填。針對 v1 請求指定為查詢參數,針對 v2 請求指定為路徑區段。

shard

必填

預設值:無

要將資料安裝到的分片名稱。此參數為必填。針對 v1 請求指定為查詢參數,針對 v2 請求指定為路徑區段。

location

必填

預設值:無

指定備份儲存庫中尋找要安裝之索引檔的位置。在 v1 請求中以查詢參數指定,在 v2 請求的請求主體中指定。

儲存庫

選填

預設值:無

要在其中尋找索引檔的備份儲存庫名稱。在 v1 請求中以查詢參數指定,在 v2 請求的請求主體中指定。如果未提供儲存庫參數,則會使用 Solr 的預設備份儲存庫(如果在 solr.xml 中定義)。

async

選填

預設值:無

追蹤此動作的請求 ID,該動作將以非同步方式處理