クラスタープラグイン

クラスタ(CoreContainer-レベル)プラグインサブシステム

クラスタプラグインは、CoreContainer(ノード)レベルで定義およびインスタンス化されるプラグ可能なコンポーネントです。これらのコンポーネントは通常、Solrノードレベルで管理レベルの機能と追加の機能用APIを提供します。

プラグイン構成

solr.cluster.plugin.edit.enabledプロパティがtrue(デフォルト)に設定されている場合、プラグイン構成は/cluster/pluginAPIを使用して管理できます。

このAPIエンドポイントは、プラグイン構成の追加、削除、更新を可能にします。

各プラグインには、登録されている一意の名前が必要です。同じ名前のプラグインを追加しようとすると、エラーになります。一部のタイプのプラグインは事前定義された名前を使用しており、適切に機能するためにはこれらの名前で登録する必要があります。

内部的には、Solr 9.0のプラグイン構成はZooKeeperの/clusterprops.jsonファイルにpluginエントリの下にJSONマップとして管理されます。構成はJSONマップであり、キーはプラグインの一意の名前で、値はシリアル化されたorg.apache.solr.client.solrj.request.beans.PluginMetaビーンです。

次の共通のプラグインプロパティがサポートされています

名前

必須

デフォルト:なし

一意のプラグイン名。一部のプラグインタイプでは、適切に機能するために事前定義された名前の1つを使用する必要があります。規約上、このような事前定義された名前は先頭のドットプレフィックス(例:.placement-plugin)を使用します。

クラス

必須

デフォルト:なし

実装クラス。クラスがSolrの一部として利用可能な場合は完全修飾クラス名として指定することも、<package>:<className>構文を使用してSolrパッケージ内のクラスを参照することもできます。

バージョン

任意

デフォルト:なし

Solrパッケージのバージョン。

クラスがSolr自体ではなくパッケージからロードされる場合、このパラメータが必要です。

パスプレフィックス

任意

デフォルト:なし

プラグインで定義されたREST APIエンドポイントに追加されるパスプレフィックス。

構成

任意

デフォルト:なし

追加のプラグイン構成パラメータの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

クラスタプラグインの種類

一般的にプラグインからロードされるクラスは、2 種類の機能をサポートします(互いに排他的ではありません)。

  • REST API エンドポイントを公開するリクエストハンドラプラグイン(実装クラスは @EndPoint およびオプションで @Command アノテーションが付けられます)。これらのプラグインの API は、@EndPoint アノテーションで定義されたパスの下の REST エンドポイントとして自動的に登録されます。

  • 内部コンポーネントとして使用する特定のインターフェイスを実装するプラグインです。ロード後に自動的に検出され、このタイプのプラグインを使用するサブシステムに登録されます。ここでの例には、ClusterSingletonClusterEventProducerClusterEventListenerPlacementPluginFactory があります。

プラグインのライフサイクル

Solr の CoreContainer が Solr ノードの起動時に最初に作成されたときに、プラグインのインスタンスがロードされ、初期化されます。

次に、構成が更新されるたびに、構成の変更が各ノードに通知され、既存のプラグインが新しい構成と比較され、ノードに存在するプラグインインスタンスが削除、追加、または置き換えられます(つまり、新しい構成を使用して削除して追加されます)。

実際には、この API で管理されるクラスターレベルのプラグインは、Solr ノードを再起動せずに動的に変更および再構成でき、また、変更はほとんど同時にすべてのノードに適用されます。

プラグインの種類

定義済みのプラグイン名

これらの名前のプラグインは、Solr の特定の部分で使用されます。これらの名前は予約されており、他のプラグインの種類には使用できません。

  • .placement-plugin: PlacementPluginFactory インターフェイスを実装するプラグイン。このタイプのプラグインは、クラスター内のレプリカ配置戦略を決定します。

  • .cluster-event-producer: ClusterEventProducer インターフェイスを実装するプラグイン。このタイプのプラグインは、クラスターレベルのイベントを生成するために使用されます。

PlacementPluginFactory プラグイン

このタイプのプラグインは、コレクションレプリカの構成可能な配置戦略をサポートします。

ClusterSingleton プラグイン

ClusterSingleton インターフェイスを実装するプラグインは、各 Solr ノードでインスタンス化されます。ただし、インターフェイスで定義されている開始/停止ライフサイクルは、クラスター内に実行中のプラグインインスタンスが常に 1 つだけになるように制御されます。

(現在はオーバーシアリーダーの選出を再利用することで実装されており、RUNNING 状態のすべての ClusterSingleton がオーバーシアリーダーノードで実行されます)。

すべてのプラグインは、Solr にこのクラスターシングルトン動作が必要であることを示すために、このインターフェイスを実装できます。

ClusterSingleton プラグインは、solr.xml で宣言することでも構成できます。

ClusterEventProducer プラグイン

クラスターレベルイベントの生成をサポートするために、ClusterEventProducer の実装が各 Solr ノードで作成されます。このコンポーネントは ClusterSingleton でもあり、つまり、アクティブなインスタンスは 1 つだけクラスターに存在します。

プラグイン構成が指定されていない場合、既定の実装の 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

単にプラグインを削除することで、デフォルトの no-op 構成に回復できます

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