副本放置外掛程式
當您建立新的集合或將副本新增至現有集合時,Solr 需要先判斷將副本放置在哪個節點上,以便根據某些條件以平衡的方式配置叢集資源。
副本放置外掛程式是可配置的元件,可決定這些放置位置。它還可以對集合或副本移除等操作強制執行其他限制 - 例如,如果外掛程式希望某些集合始終位於相同的節點上,或在存在其他某些集合時始終存在。
在較早版本的 Solr 中,此功能是透過每個集合的規則或使用自動調整框架來提供。
外掛程式設定
副本放置外掛程式設定可在 solr.xml
檔案中設定,或使用 /cluster/plugin
API 設定。只要沒有將副本放置外掛程式定義為叢集外掛程式,就會使用在 solr.xml
中設定的任何外掛程式。一次只能有一個叢集範圍的外掛程式設定,並且它使用預先定義的外掛程式名稱:.placement-plugin
。
Solr 發行版本中包含數個放置外掛程式。可以新增其他放置外掛程式 - 它們必須實作 PlacementPluginFactory
介面。如果外掛程式實作 ConfigurablePlugin
介面,則設定項目也可以包含 config
元素。
Solr 包含的放置外掛程式
下列放置外掛程式可在 Solr 9.0 中直接使用。如果沒有在叢集屬性中定義放置外掛程式,Solr 將預設為使用在系統屬性 solr.placementplugin.default
或環境變數 SOLR_PLACEMENTPLUGIN_DEFAULT
中設定的外掛程式。支援的值為 simple
、random
、affinity
和 minimizecores
。如果未設定此類屬性或環境變數,則會使用 SimplePlacementPlugin。
為了使用外掛程式,必須使用 /cluster/plugin
API 新增其設定。例如,為了使用 AffinityPlacementFactory
外掛程式,應執行下列命令
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory",
"config": {
"minimalFreeDiskGB": 20,
"prioritizedFreeDiskGB": 100,
"withCollections": {
"A_primary": "A_secondary",
"B_primary": "B_secondary"
},
"collectionNodeType": {
"collection_A": "searchNode,indexNode",
"collection_B": "analyticsNode"
}
}
}}'
https://127.0.0.1:8983/api/cluster/plugin
同樣地,可以更新或移除設定。
放置外掛程式設定必須使用預先定義的名稱 .placement-plugin 。只能定義一個(或無)放置設定。 |
SimplePlacementFactory
根據預設,Solr 9.0 使用舊版的副本放置方法,即 SimplePlacementFactory
。只要遺失或無效的放置外掛程式設定,就會使用此方法。
簡單放置只是以循環配置的方式將新副本指派給即時節點:首先,它會準備一個已排序的節點清單,其中包含最少數量的現有副本,特別是集合的副本。然後,對於請求中的每個分片,它會依此順序將副本新增至連續的節點,如果副本數大於節點數,則會環繞到第一個節點。
此放置策略不保證在同一個節點上放置的分片副本不超過 1 個。此外,循環配置指派只大致近似於將副本均勻分散在各個節點上。
這是 9.0 之前的預設非自動調整行為,當時稱為 LegacyAssignStrategy。 |
RandomPlacementFactory
此外掛程式會建立隨機放置,同時防止將相同分片的兩個副本放置在同一個節點上。如果節點太少而無法滿足這些限制,則會擲回例外狀況,並拒絕請求。
由於其簡化的演算法,此外掛程式僅應在簡單的部署中使用。
此外掛程式不需要任何設定。
MinimizeCoresPlacementFactory
此插件會建立放置位置,以盡可能減少所有運作節點上每個節點的核心數量,同時避免將同一分片的兩個副本放置在同一個節點上。如果節點數量不足以滿足這些限制,則會拋出例外狀況並拒絕請求。
由於其簡化的演算法,此外掛程式僅應在簡單的部署中使用。
此外掛程式不需要任何設定。
AffinityPlacementFactory
此插件實作了副本放置演算法,大致上複製了此處定義的 Solr 8.x 自動縮放配置。
上述連結配置中的自動縮放規格旨在執行下列操作:
-
盡可能將每個分片的副本平均分散到多個可用區域(由系統屬性指定)、
-
根據副本類型將副本指派給特定類型的節點(另一個系統屬性),以及
-
避免在同一個節點上擁有超過一個分片的副本。
-
僅在滿足上述限制後,才會執行
-
盡可能減少每個節點的核心數量,或
-
盡可能減少磁碟使用量。
-
它也支援其他每個集合的限制
-
withCollection
強制將共置集合的副本放置在相同的節點上,並防止刪除會破壞此限制的集合和副本。 -
withCollectionShards
與上述相同,但也共置分片。例如,shardN 會放置在與參照集合的 shardN 相同的節點上。注意:withCollectionShards
的鍵應與withCollection
的鍵不相交。 -
collectionNodeType
將符合放置條件的節點限制為僅符合一個或多個指定節點類型的節點。
請參閱以下內容以瞭解這些限制的更多詳細資訊。
此插件的整體策略
-
取得叢集中的節點集。如果已定義
withCollection
或withCollectionShards
且適用於目前集合,則會篩選此候選集,以便僅根據此限制保留符合條件的節點。 -
產生的節點集會轉換為三個獨立的節點集(可以重疊),這些節點集接受三種副本類型(NRT、TLOG 和 PULL)中的每一種。
-
對於需要放置副本的每個分片,然後對於要放置的每個副本類型(從 NRT 開始,然後是 TLOG,然後是 PULL)
-
會使用對應於副本類型的候選節點集,並從該集合中移除該分片已具有(任何類型)副本的節點。
-
如果沒有足夠的節點,則會拋出錯誤(這會在處理期間進一步檢查)。
-
收集每個可用區域 (AZ) 上目前類型(已存在)的副本數量。
-
將可用節點集分成多個子集(可能有些是空的),數量與候選節點定義的可用區域數量相同
-
在每個可用區域的節點子集中,依照總核心數增加的順序排序節點。
-
重複執行要放置的副本數量(針對目前分片的目前副本類型)
-
根據先前收集的每個可用區域的副本數量,選擇具有最低副本數量的非空節點集。然後選擇該集合中的第一個節點。這就是放置副本的節點。從給定可用區域的可用節點集中移除節點,並增加放置在該可用區域上的副本數量。
-
-
在此過程中,會追蹤節點上的核心數量,以考量放置決策,以便並非所有分片都決定將其副本放置在相同的節點上(如果這些是負載較低的節點,它們可能會這麼做)。
-
目前,可用區域屬性的名稱和副本類型屬性的名稱是不可設定的,分別設定為 availability_zone 和 replica_type 。 |
組態
此插件支援下列組態參數
minimalFreeDiskGB
-
選用
預設值:
5
GB如果節點的可用磁碟空間嚴格小於此值,則會從指派決策中排除該節點。設定為
0
或更小以停用。 prioritizedFreeDiskGB
-
選用
預設值:
100
GB副本配置會將副本指派給具有至少此 GB 數量的可用磁碟空間的節點,而無論這些節點上的核心數量為何,而不是在有選擇的情況下將副本指派給可用磁碟空間小於此數量的節點(如果沒有選擇,仍然可以將副本指派給可用空間小於此數量的節點)。
withCollection
-
選用
預設值:無
定義其他限制,主要集合 (key) 必須與次要集合 (value) 位於相同的節點上。此插件會假設次要集合副本已就位,並忽略尚未存在次要集合副本的候選節點。
請參閱下方的withCollection 限制章節。
withCollectionShards
-
選用
預設值:無
與
withCollection
相同,但強制執行分片層級限制。例如,主要集合(在鍵中出現)的 shardN 只會放置在次要集合(在值中出現)的 shardN 所在的節點上。當刪除次要集合分片 N 的副本時,也會強制執行相同的限制。如果主要集合的 shardN 共置於特定節點上,則會防止刪除。鍵應與withCollection
不相交。 collectionNodeType
-
選用
預設值:無
此屬性定義額外的限制,集合 (key) 必須僅位於標示有一個或多個相符「節點類型」標籤(map 中的值是以逗號分隔的標籤)的節點上。節點使用
node_type
系統屬性標示,其值是任意以逗號分隔的標籤清單。對應地,插件組態可以指定特定集合必須僅放置在符合此處定義的至少一個(以逗號分隔)標籤的節點上。
withCollection 限制
此插件支援強制執行名為 withCollection
的額外限制,這會導致兩個配對集合的副本放置在相同的節點上。
使用者可以在插件組態的 config/withCollection
元素中定義集合對,該元素是一個 JSON map,其中鍵是主要集合名稱,值是次要集合名稱。目前僅支援 1:1 對應 - 不過,多個主要集合可以使用相同的次要集合,這實際上將其放寬為 N:1 對應。
與先前版本的 Solr 不同,此插件不會自動放置次要集合的副本 - 假設這些副本已就位,且使用者有責任將它們放置在正確的節點上(最有可能只是透過使用此插件先建立次要集合,並使用足夠大的複製因子來確保目標節點集已填入次要副本)。
當處理 withCollection
map 中具有鍵的主要集合的計算放置請求時,會先篩選候選節點集,以消除不包含次要集合副本的節點。請注意,這可能會導致空集和例外狀況 - 在這種情況下,需要先建立足夠數量的次要副本。
如果主要副本所在的節點上仍在使用次要集合(或其副本),則插件會透過拒絕刪除次要集合(或其副本)的操作來保留此共置。這樣做的請求將會因錯誤而被拒絕。若要從這些節點刪除次要集合(或其副本),必須先從共置節點中移除主要集合的副本,或必須變更組態以移除主要集合的共置對應。
組態範例
這是一個使用預設值的簡單組態
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory"
}}'
https://127.0.0.1:8983/api/cluster/plugin
此組態指定了基本參數
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory",
"config": {
"minimalFreeDiskGB": 20,
"prioritizedFreeDiskGB": 100
}
}}'
https://127.0.0.1:8983/api/cluster/plugin
此組態定義集合 A_primary
必須與集合 Common_secondary
共置,而集合 B_primary
也必須與集合 Common_secondary
共置
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory",
"config": {
"withCollection": {
"A_primary": "Common_secondary",
"B_primary": "Common_secondary"
}
}
}}'
https://127.0.0.1:8983/api/cluster/plugin
此組態定義集合 collection_A
必須僅放置在 node_type
系統屬性包含 searchNode
或 indexNode
的節點上(例如,節點可以標示為 -Dnode_type=searchNode,indexNode,uiNode,zkNode
)。同樣地,集合 collection_B
必須僅放置在包含 analyticsNode
標籤的節點上
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".placement-plugin",
"class": "org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory",
"config": {
"collectionNodeType": {
"collection_A": "searchNode,indexNode",
"collection_B": "analyticsNode"
}
}
}}'
https://127.0.0.1:8983/api/cluster/plugin