レプリカ配置プラグイン

新しいコレクションを作成する場合、または既存のコレクションにレプリカを追加する場合、Solrは最初にクラスタリソースがバランスの取れた方法で(特定の基準に従って)割り当てられるように、レプリカを配置するノードを決定する必要があります。

レプリカ配置プラグインは、これらの配置を決定する設定可能なコンポーネントです。 また、コレクションやレプリカの削除などの操作に追加の制約を適用することもできます。たとえば、プラグインが一部のコレクションを常に同じノードに配置したり、他のコレクションが存在する場合に常に存在させたりする場合などです。

以前のバージョンのSolrでは、この機能はコレクションごとのルール、または自動スケーリングフレームワークを使用して提供されていました。

プラグイン設定

レプリカ配置プラグインの設定は、solr.xmlファイル、または/cluster/plugin APIを使用して設定されます。 solr.xmlで設定されたプラグインは、レプリカ配置プラグインがクラスタプラグインとして定義されていない限り使用されます。 クラスタ全体で一度に定義できるプラグイン設定は1つだけで、定義済みのプラグイン名`を使用します。.placement-plugin`。

Solrディストリビューションには、いくつかの配置プラグインが含まれています。 追加の配置プラグインを追加できます。これらは`を実装する必要があります。PlacementPluginFactory`インターフェース。 プラグインが`を実装している場合、設定エントリには`config`要素が含まれる場合があります。ConfigurablePlugin`インターフェース。

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`。 定義できる配置設定は1つだけ(またはなし)です。

SimplePlacementFactory

デフォルトでは、Solr 9.0はレプリカ配置にレガシーメソッドである`を使用します。SimplePlacementFactory`。 このメソッドは、配置プラグインの設定がないか無効な場合に常に使用されます。

単純な配置では、新しいレプリカをラウンドロビン方式でライブノードに割り当てます。最初に、既存のレプリカ、特にコレクションの数が最も少ないノードのソート済みリストを準備します。 次に、リクエスト内の各シャードについて、この順序で連続するノードにレプリカを追加し、レプリカの数がノードの数よりも大きい場合は最初のノードにラップアラウンドします。

この配置戦略は、1つのシャードのレプリカが同じノードに2つ以上配置されないことを保証するものではありません。また、ラウンドロビン割り当ては、ノード全体へのレプリカの均等な分散をおおよそ実現するだけです。

これは、9.0より前のデフォルトの自動スケーリングなしの動作で、当時はLegacyAssignStrategyと呼ばれていました。

RandomPlacementFactory

このプラグインは、同じシャードの2つのレプリカが同じノードに配置されないようにしながら、ランダムな配置を作成します。 これらの制約を満たすのに十分なノードがない場合、例外がスローされ、リクエストは拒否されます。

その単純なアルゴリズムのため、このプラグインは単純なデプロイメントでのみ使用してください。

このプラグインは設定を必要としません。

MinimizeCoresPlacementFactory

このプラグインは、同じシャードの2つのレプリカを同じノードに配置しないようにしながら、すべてのアクティブなノード全体でノードあたりのコア数を最小限に抑える配置を作成します。 これらの制約を満たすのに十分なノードがない場合、例外がスローされ、リクエストは拒否されます。

その単純なアルゴリズムのため、このプラグインは単純なデプロイメントでのみ使用してください。

このプラグインは設定を必要としません。

AffinityPlacementFactory

このプラグインは、こちらで定義されているSolr 8.xの自動スケーリング設定をおおよそ複製するレプリカ配置アルゴリズムを実装します。

上記の設定でリンクされている自動スケーリング仕様は、以下のことを目的としています

  • 複数の可用性ゾーン(システムプロパティで指定)に、シャードごとのレプリカを可能な限り均等に分散する、

  • レプリカタイプに基づいて、特定の種類のノード(別のシステムプロパティ)にレプリカを割り当てる、そして

  • 同じノードにシャードごとに複数のレプリカが存在することを避ける。

  • 上記の制約が満たされた後でのみ

    • ノードあたりのコア数を最小限に抑える、または

    • ディスク使用量を最小限に抑える。

また、コレクションごとの追加の制約もサポートしています

  • withCollection は、コロケートされたコレクションのレプリカを同じノードに配置することを強制し、この制約に違反するコレクションとレプリカの削除を防止します。

  • withCollectionShards は上記と同じですが、シャードもコロケートします。 つまり、shardNは、参照されたコレクションのshardNが配置されているのと同じノードに配置されます。 注:withCollectionShards のキーは、withCollection のキーと重複してはなりません。

  • collectionNodeType は、配置の対象となるノードを、指定されたノードタイプの1つ以上に一致するものに制限します。

これらの制約の詳細については、以下を参照してください。

このプラグインの全体的な戦略

  • クラスタ内のノードのセットが取得されます。 withCollection または withCollectionShards が定義されており、現在のコレクションに適用可能な場合、この候補セットは、この制約に従って対象となるノードのみが残るようにフィルタリングされます。

  • 結果のノードセットは、3つのレプリカタイプ(NRT、TLOG、およびPULL)のそれぞれを受け入れる、3つの独立した(重複する可能性のある)ノードセットに変換されます。

  • レプリカの配置が必要な各シャードについて、そして配置する各レプリカタイプについて(NRT、次にTLOG、次にPULLの順に)

    • レプリカタイプに対応する候補ノードのセットが使用され、そのセットから、そのシャードのレプリカ(任意のタイプ)がすでに存在するノードが削除されます。

    • ノードが足りない場合は、エラーがスローされます(これは処理中にさらにチェックされます)。

    • 各可用性ゾーン(AZ)にある現在のタイプの(すでに存在する)レプリカの数が収集されます。

    • 使用可能なノードのセットを、候補ノードに定義されているAZの数と同じ数のサブセット(一部は空の可能性があります)に分割します

    • 各AZノードのサブセットで、コアの総数が増加する順にノードをソートします。

    • 配置するレプリカの数(現在のシャードの現在のレプリカタイプ)を反復処理します

      • 以前に収集されたAZごとのレプリカの数に基づいて、レプリカの数が最も少ない空でないノードセットを選択します。次に、そのセットの最初のノードを選択します。それがレプリカが配置されるノードです。指定されたAZの使用可能なノードのセットからノードを削除し、そのAZに配置されたレプリカの数を増やします。

    • このプロセス中に、ノードのコア数が全般的に追跡され、配置の決定が考慮されるため、すべてのシャードが同じノードにレプリカを配置することを決定するわけではありません(ただし、これらが負荷の少ないノードである場合は、そうなる可能性があります)。

現時点では、可用性ゾーンプロパティの名前とレプリカタイププロパティの名前は設定できず、それぞれavailability_zonereplica_typeに設定されています。

設定

このプラグインは、以下の設定パラメータをサポートしています

minimalFreeDiskGB

オプション

デフォルト:5 ギガバイト

ノードの空きディスク容量がこの値よりも厳密に少ない場合、そのノードは割り当ての決定から除外されます。 無効にするには、0 以下に設定します。

prioritizedFreeDiskGB

オプション

デフォルト:100 ギガバイト

レプリカ割り当ては、これらのノードのコア数に関係なく、少なくともこのギガバイト数の空きディスク容量を持つノードにレプリカを割り当てます。オプションであれば、この空きディスク容量よりも少ないノードにレプリカを割り当てることはありません(オプションでない場合は、この空き容量よりも少ないノードにレプリカを割り当てることができます)。

withCollection

オプション

デフォルト:なし

プライマリコレクション(キー)がセカンダリコレクション(値)と同じノードに配置されなければならないという追加の制約を定義します。 プラグインは、セカンダリコレクションのレプリカがすでに配置されていると想定し、まだ存在しない候補ノードは無視します。

以下のwithCollection 制約セクションを参照してください。

withCollectionShards

オプション

デフォルト:なし

withCollection と同じですが、シャードレベルの制約を強制します。 たとえば、プライマリコレクションのshardN(キーに存在する)は、セカンダリコレクションのshardN(値として存在する)が存在するノードにのみ配置されます。 セカンダリコレクションshardNのレプリカが削除されると、削除時に同じ制約が適用されます。 プライマリコレクションのshardNが特定のノードにコロケートされている場合、削除を منعします。 キーはwithCollectionと重複してはなりません。

collectionNodeType

オプション

デフォルト:なし

このプロパティは、コレクション(キー)が、一致する「ノードタイプ」ラベルの1つ以上でラベル付けされたノード(マップ内の値はカンマ区切りのラベル)にのみ配置されなければならないという追加の制約を定義します。 ノードは、node_type システムプロパティを使用してラベル付けされ、値は任意のカンマ区切りのラベルリストです。 これに対応して、プラグイン設定では、特定のコレクションが、ここで定義されている(カンマ区切りの)ラベルの少なくとも1つに一致するノードにのみ配置されるように指定できます。

withCollection 制約

このプラグインは、withCollection という名前の追加の制約を強制することをサポートしており、これにより、2つのペアになったコレクションのレプリカが同じノードに配置されます。

ユーザーは、プラグイン設定の config/withCollection 要素でコレクションペアを定義できます。これは、キーがプライマリコレクション名、値がセカンダリコレクション名であるJSONマップです。 現在、1:1マッピングのみがサポートされています。ただし、複数のプライマリコレクションが同じセカンダリコレクションを使用する場合があり、事実上、これをN:1マッピングに緩和します。

以前のバージョンのSolrとは異なり、このプラグインはセカンダリコレクションのレプリカを自動的に配置*しません*。これらのレプリカはすでに配置されていると想定されており、適切なノードにすでに配置するのはユーザーの責任です(ほとんどの場合、単にこのプラグインを使用して最初にセカンダリコレクションを作成し、ターゲットノードセットにセカンダリレプリカが確実に設定されるように、十分なレプリケーション係数を指定します)。

withCollection マップにキーを持つプライマリコレクションの配置を計算するリクエストが処理されると、候補ノードのセットは最初にフィルタリングされ、セカンダリコレクションのレプリカを含まないノードが除外されます。 これにより、セットが空になり、例外が発生する可能性があることに注意してください。この場合、最初に十分な数のセカンダリレプリカを作成する必要があります。

プラグインは、プライマリレプリカが配置されているノードでまだ使用されている場合、セカンダリコレクション(またはそのレプリカ)の削除操作を拒否することにより、このコロケーションを保持します。そのようなリクエストはエラーで拒否されます。 これらのノードからセカンダリコレクション(またはそのレプリカ)を削除するには、最初にプライマリコレクションのレプリカをコロケートされたノードから削除するか、設定を変更してプライマリコレクションのコロケーションマッピングを削除する必要があります。

設定例

これは、デフォルト値を使用する単純な設定です

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