叢集外掛程式
叢集(CoreContainer 層級)外掛程式子系統
叢集外掛程式是在 CoreContainer
(節點) 層級定義和實例化的可外掛元件。這些元件通常提供管理層級功能和 API,以便在 Solr 節點層級提供額外功能。
外掛程式設定
如果 solr.cluster.plugin.edit.enabled
屬性設為 true (預設值),則可以使用 /cluster/plugin
API 來維護外掛程式設定。
此 API 端點允許新增、移除和更新外掛程式設定。
每個外掛程式都必須具有唯一的名稱,在其下註冊。嘗試新增具有重複名稱的外掛程式會產生錯誤。某些類型的外掛程式使用預先定義的名稱,它們必須以這些名稱註冊才能正常運作。
在內部,從 Solr 9.0 開始,外掛程式設定維護在 ZooKeeper 中的 /clusterprops.json
檔案的 plugin
項目下。設定是 JSON 對應,其中鍵是唯一的外掛程式名稱,值是序列化的 org.apache.solr.client.solrj.request.beans.PluginMeta
Bean。
支援以下常見的外掛程式屬性
name
-
必要
預設值:無
唯一的外掛程式名稱。某些外掛程式類型需要使用預先定義的名稱之一才能正常運作。依照慣例,此類預先定義的名稱使用前導點字首 (例如,
.placement-plugin
)。 class
-
必要
預設值:無
實作類別。如果該類別是 Solr 的一部分,則可以將其指定為完整類別名稱;也可以使用
<package>:<className>
語法,以引用 Solr 套件內的類別。 version
-
選用
預設值:無
Solr 套件版本。
當類別從套件而非 Solr 本身載入時,此參數是必要的。
path-prefix
-
選用
預設值:
none
要新增至外掛程式中定義的 REST API 端點的路徑字首。
config
-
選用
預設值:
none
其他外掛程式設定參數的 JSON 對應。實作
ConfigurablePlugin
介面的外掛程式將使用從此對應中還原序列化的外掛程式特定設定物件進行初始化。
範例外掛程式設定
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,
"withCollection": {
"A_primary": "A_secondary",
"B_primary": "B_secondary"
}
}
}}'
https://127.0.0.1:8983/api/cluster/plugin
叢集外掛程式的類型
一般而言,從外掛程式載入的類別支援兩種功能類型 (非互斥)
-
請求處理器外掛程式,會公開 REST API 端點 (實作類別會使用
@EndPoint
註解,並且可選擇性地使用@Command
註解)。這些外掛程式的 API 會自動註冊為 REST 端點,路徑定義於@EndPoint
註解中。 -
實作特定介面的外掛程式,作為內部元件使用。載入時,它們會被自動偵測並註冊到使用此類型外掛程式的子系統。此處的範例包括
ClusterSingleton
、ClusterEventProducer
、ClusterEventListener
和PlacementPluginFactory
。
外掛程式類型
預先定義的外掛程式名稱
具有這些名稱的外掛程式會用於 Solr 的特定部分。它們的名稱是保留的,不能用於其他外掛程式類型
-
.placement-plugin
:實作PlacementPluginFactory
介面的外掛程式。此類型外掛程式會決定叢集中的複本放置策略。 -
.cluster-event-producer
:實作ClusterEventProducer
介面的外掛程式。此類型外掛程式用於產生叢集層級事件。
ClusterSingleton 外掛程式
實作 ClusterSingleton
介面的外掛程式會在每個 Solr 節點上實例化。但是,它們在介面中定義的啟動/停止生命週期會受到控制,以便在任何時候叢集中只有一個外掛程式執行個體在執行。
(目前這是透過重新使用 Overseer 領導者選舉來實作,因此所有處於 RUNNING 狀態的 ClusterSingleton
都會在 Overseer 領導者節點上執行)。
任何外掛程式都可以實作這個介面,以向 Solr 指示它需要這種叢集單例行為。
ClusterSingleton
外掛程式也可以透過在 solr.xml 中宣告來設定。
ClusterEventProducer 外掛程式
為了支援產生叢集層級事件,會在每個 Solr 節點上建立 ClusterEventProducer
的實作。這個元件也是一個 ClusterSingleton
,這表示在任何時候叢集中只有一個活動的執行個體。
如果沒有指定外掛程式組態,則會使用預設實作 org.apache.solr.cluster.events.impl.NoOpProducer
,它不會產生任何事件 - 這表示預設情況下會關閉事件產生。在 org.apache.solr.cluster.events.impl.DefaultClusterEventProducer
中也有一個支援節點和集合事件產生的實作。
事件產生器組態可以透過變更預先定義的外掛程式組態來動態變更,例如
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": ".cluster-event-producer",
"class": "org.apache.solr.cluster.events.impl.DefaultClusterEventProducer"
}}'
https://127.0.0.1:8983/api/cluster/plugin
可以透過簡單地移除外掛程式,將其還原為預設的無操作組態
curl -X POST -H 'Content-type: application/json' -d '{
"remove": ".cluster-event-producer"
}'
https://127.0.0.1:8983/api/cluster/plugin
ClusterEventListener 外掛程式
實作 ClusterEventListener
介面的外掛程式會自動註冊到 ClusterEventProducer
的執行個體。
實作會收到 ClusterEventProducer
產生所有事件的通知,並且需要只選取它們感興趣的事件。
org.apache.solr.cluster.events.impl.CollectionsRepairEventListener
一個監聽器的實作,會對 NODE_LOST 事件做出反應,並檢查需要將哪些複本重新新增至其他節點,以保持複寫計數與之前相同。
此實作會等待一段時間 (預設為 30 秒),以確保節點確實已關閉。對於位於關閉時間足夠長的節點上的複本,它會產生適當的 ADDREPLICA 命令,以抵消這些節點上遺失的複本。
範例外掛程式設定
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": "collections-repair-listener",
"class": "org.apache.solr.cluster.events.impl.CollectionsRepairEventListener"
}}'
https://127.0.0.1:8983/api/cluster/plugin
外掛程式管理 API
新增外掛程式
此命令使用 HTTP POST 來新增新的外掛程式組態。如果已存在具有相同名稱的外掛程式,則會導致錯誤。
範例命令,新增包含在 Solr 套件中的外掛程式
curl -X POST -H 'Content-type: application/json' -d '{
"add":{
"name": "my-plugin1",
"class": "my-package:com.example.MyPlugin",
"version": "1.0"
}}'
https://127.0.0.1:8983/api/cluster/plugin
更新外掛程式
此命令使用 HTTP POST 來更新現有的外掛程式組態。如果不存在具有此名稱的外掛程式,則會導致錯誤。
此範例會更新現有的外掛程式,可能會變更其組態參數。會移除舊的外掛程式執行個體,並使用提供的組態建立新的執行個體。
curl -X POST -H 'Content-type: application/json' -d '{
"update":{
"name": "collections-repair-listener",
"class": "org.apache.solr.cluster.events.impl.CollectionsRepairEventListener",
"config":{
"waitForSecond": 30
}}}'
https://127.0.0.1:8983/api/cluster/plugin