叢集外掛程式

叢集(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 註解中。

  • 實作特定介面的外掛程式,作為內部元件使用。載入時,它們會被自動偵測並註冊到使用此類型外掛程式的子系統。此處的範例包括 ClusterSingletonClusterEventProducerClusterEventListenerPlacementPluginFactory

外掛程式生命週期

當 Solr 的 CoreContainer 在 Solr 節點啟動期間首次建立時,外掛程式實例會被載入並初始化。

然後,在每次組態更新時,每個節點都會收到變更通知,接著會將現有的外掛程式與新的組態進行比較,並根據節點上存在的外掛程式實例,分別建立、移除或取代 (即使用新的組態移除並加入)。

實際上,這表示由這個 API 管理的叢集層級外掛程式可以動態變更和重新設定,而無需重新啟動 Solr 節點,而且這些變更幾乎會同時套用至所有節點。

外掛程式類型

預先定義的外掛程式名稱

具有這些名稱的外掛程式會用於 Solr 的特定部分。它們的名稱是保留的,不能用於其他外掛程式類型

  • .placement-plugin:實作 PlacementPluginFactory 介面的外掛程式。此類型外掛程式會決定叢集中的複本放置策略。

  • .cluster-event-producer:實作 ClusterEventProducer 介面的外掛程式。此類型外掛程式用於產生叢集層級事件。

PlacementPluginFactory 外掛程式

此類型外掛程式支援可配置的集合複本放置策略。

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 GET 並傳回已載入的外掛程式及其組態的清單

curl https://127.0.0.1:8983/api/cluster/plugin

新增外掛程式

此命令使用 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

移除外掛程式

此命令使用 HTTP POST 來刪除現有的外掛程式組態。如果不存在具有此名稱的外掛程式,則會導致錯誤。

與其他命令不同,此處的命令酬載僅包含要移除的外掛程式名稱,作為字串。

curl -X POST -H 'Content-type: application/json' -d '{
    "remove": "my-plugin1"
    }'
  https://127.0.0.1:8983/api/cluster/plugin