検索

第1章 Data Grid キャッシュのインデックス作成

download PDF

Data Grid は、キャッシュに値のインデックスを作成して、クエリーパフォーマンスを向上できます。これにより、インデックスのないクエリーよりも高速な結果が得られます。インデックス作成により、クエリーで全文検索機能を使用することもできます。

注記

Data Grid は、Apache Lucene テクノロジーを使用して、キャッシュ内の値にインデックスを付けます。

1.1. キャッシュをインデックス化するための Data Grid の設定

キャッシュ設定でのインデックス作成を有効にし、インデックスの作成時にどのエンティティー Data Grid を含めるかを指定します。

クエリーを使用する場合は、常に Data Grid がキャッシュをインデックス化するように設定してください。インデックス作成により、クエリーのパフォーマンスが大幅に改善されるため、データへの洞察を得ることができます。

手順

  1. キャッシュ設定でのインデックス作成を有効にします。

    <distributed-cache>
      <indexing>
        <!-- Indexing configuration goes here. -->
      </indexing>
    </distributed-cache>
    ヒント

    設定に indexing 要素を追加すると、enabled=true 属性を含めなくてもインデックスを作成できます。

    この要素を追加するリモートキャッシュでは、エンコーディングを ProtoStream として暗黙的に設定します。

  2. indexed-entity 要素でインデックスを作成するエンティティーを指定します。

    <distributed-cache>
      <indexing>
        <indexed-entities>
          <indexed-entity>...</indexed-entity>
        </indexed-entities>
      </indexing>
    </distributed-cache>

Protobuf メッセージ

  • スキーマで宣言されたメッセージを indexed-entity 要素の値として指定します。以下に例を示します。

    <distributed-cache>
      <indexing>
        <indexed-entities>
          <indexed-entity>org.infinispan.sample.Car</indexed-entity>
          <indexed-entity>org.infinispan.sample.Truck</indexed-entity>
        </indexed-entities>
      </indexing>
    </distributed-cache>

    この設定は、book_sample パッケージ名で、スキーマの Book メッセージをインデックス化します。

    package book_sample;
    
    /* @Indexed */
    message Book {
    
        /* @Text(projectable = true) */
        optional string title = 1;
    
        /* @Text(projectable = true) */
        optional string description = 2;
    
        // no native Date type available in Protobuf
        optional int32 publicationYear = 3;
    
        repeated Author authors = 4;
    }
    
    message Author {
        optional string name = 1;
        optional string surname = 2;
    }

Java オブジェクト

  • @Indexed アノテーションを含む各クラスの完全修飾名 (FQN) を指定します。

XML

<distributed-cache>
  <indexing>
    <indexed-entities>
      <indexed-entity>book_sample.Book</indexed-entity>
    </indexed-entities>
  </indexing>
</distributed-cache>

ConfigurationBuilder

import org.infinispan.configuration.cache.*;

ConfigurationBuilder config=new ConfigurationBuilder();
config.indexing().enable().storage(FILESYSTEM).path("/some/folder").addIndexedEntity(Book.class);

1.1.1. インデックス設定

Data Grid 設定は、インデックスの保存および構築方法を制御します。

インデックスストレージ

Data Grid がインデックスを保存する方法を設定できます。

  • ホストファイルシステム上。これはデフォルトであり、再起動間でインデックスを保持します。
  • JVM ヒープメモリー。これはインデックスが再起動後も存続しないことを意味します。
    インデックスは、小さなデータセットの場合にのみ、JVM ヒープメモリーに格納する必要があります。

ファイルシステム

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <!-- Indexing configuration goes here. -->
  </indexing>
</distributed-cache>

JVM ヒープメモリー

<distributed-cache>
  <indexing storage="local-heap">
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>

インデックスパス

ストレージが 'filesystem' の場合、インデックスのファイルシステムパスを指定します。値は相対パスまたは絶対パスになります。相対パスは、設定済みの永続的なグローバルのロケーションを起点に作成されます。または、グローバルの状態が無効の場合は現在の作業ディレクトリーを起点に作成されます。

デフォルトでは、キャッシュ名はインデックスパスの相対パスとして使用されます。

重要

カスタム値を設定するときは、同じインデックス付きエンティティーを使用するキャッシュ間に競合がないことを確認してください。

インデックス起動モード

Data Grid がキャッシュを開始すると、操作を実行して、インデックスがキャッシュ内のデータと一致していることを確認できます。デフォルトでは、キャッシュの開始時にインデックス作成操作は行われませんが、Data Grid を次のように設定できます。

  • キャッシュの開始時にインデックスをクリアします。

    • Data Grid はクリア (パージ) 操作を同期的に実行します。キャッシュは、パージが完了した場合にのみ使用可能です。
  • 開始時にキャッシュのインデックスを再作成します。

    • Data Grid は、インデックスの操作を非同期的に実行します。キャッシュのサイズによっては、インデックス操作の完了に時間がかかる場合があります。
  • キャッシュを自動的にクリアまたは再インデックス化します。

    • データが揮発性で、インデックスが永続的である場合に、Data Grid は起動時にキャッシュをクリアします。
    • データが永続的で、インデックスが揮発性の場合、Data Grid は起動時にキャッシュを再インデックス化します。

キャッシュの開始時にインデックスをクリアする

<distributed-cache>
  <indexing storage="filesystem" startup-mode="purge">
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>

キャッシュの開始時にインデックスを再構築する

<distributed-cache>
  <indexing storage="local-heap" startup-mode="reindex">
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>

インデックス化モード

indexing-mode は、キャッシュ操作がインデックスに伝播される方法を制御します。

auto
Data Grid は、キャッシュへの変更をインデックスに直ちに適用します。これはデフォルトのモードです。
manual
Data Grid は、再インデックス操作が明示的に呼び出された場合にのみインデックスを更新します。たとえば、インデックスのバッチ更新を実行する場合は、manual モードを設定します。

indexing-modemanual に設定します。

<distributed-cache>
  <indexing indexing-mode="manual">
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>
インデックスリーダー

インデックスリーダーは、クエリーを実行するためにインデックスへのアクセスを提供する内部コンポーネントです。インデックスのコンテンツが変更されると、Data Grid はリーダーを更新し、検索結果が最新の状態になるようにする必要があります。インデックスリーダーの更新間隔を設定できます。デフォルトでは、インデックスが最終更新以降に変更された場合、各クエリーの前に Data Grid はインデックスを読み取ります。

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <!-- Sets an interval of one second for the index reader. -->
    <index-reader refresh-interval="1000"/>
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>
インデックスライター

インデックスライターは、パフォーマンスを改善するために時間の経過とともにマージできる 1 つ以上のセグメント (サブインデックス) で構成されるインデックスを構築する内部コンポーネントです。インデックスリーダーの操作では、すべてのセグメントを考慮する必要があるため、通常、セグメントが少ないということは、クエリー中のオーバーヘッドが少ないことを意味します。

Data Grid は Apache Lucene を内部的に使用し、メモリーとストレージという 2 つの層でエントリーにインデックスを付けます。新規エントリーは、最初にメモリーインデックスに移動してから、フラッシュが実行されると、設定されたインデックスストレージに移動します。定期的なコミット操作は、フラッシュしたデータからセグメントを作成し、すべてのインデックス変更を永続化します。

注記

index-writer 設定は任意です。デフォルトはほとんどの場合に機能するはずであり、カスタム設定はパフォーマンスを調整するためにのみ使用する必要があります。

<distributed-cache>
  <indexing storage="filesystem" path="${java.io.tmpdir}/baseDir">
    <index-writer commit-interval="2000"
                  low-level-trace="false"
                  max-buffered-entries="32"
                  queue-count="1"
                  queue-size="10000"
                  ram-buffer-size="400"
                  thread-pool-size="2">
      <index-merge calibrate-by-deletes="true"
                   factor="3"
                   max-entries="2000"
                   min-size="10"
                   max-size="20"/>
    </index-writer>
    <!-- Additional indexing configuration goes here. -->
  </indexing>
</distributed-cache>
表1.1 インデックスライター設定属性
Attribute説明

commit-interval

メモリーにバッファリングされたインデックスの変更がインデックスストレージにフラッシュされ、コミットが実行される時間 (ミリ秒単位)。操作にはコストがかかるため、小さな値は避けてください。デフォルトは 1000 ミリ秒 (1 秒) です。

max-buffered-entries

インデックスストレージにフラッシュされる前に、インメモリーにバッファリングできるエントリーの最大数。値が大きくなると、インデックスが高速になりますが、より多くのメモリーが使用されます。ram-buffer-size 属性と組み合わせて使用すると、フラッシュは、最初に発生するイベントに対して発生します。

ram-buffer-size

追加されたエントリーと削除をインデックスストレージにフラッシュする前にバッファリングするために使用できるメモリーの最大量。値が大きくなると、インデックスが高速になりますが、より多くのメモリーが使用されます。インデックス作成のパフォーマンスを向上させるには、max-buffered-entries の代わりに、この属性を設定する必要があります。max-buffered-entries 属性と組み合わせて使用すると、最初に発生したイベントに対してフラッシュが発生します。

thread-pool-size

この設定は Infinispan 15.0 以降では無視されます。インデックス化エンジンは、Infinispan スレッドプールを使用するようになりました。

queue-count

デフォルトは 4 です。それぞれのインデックス化されたタイプに使用する内部キューの数。各キューは、インデックスに適用される変更のバッチを保持し、キューは並行して処理されます。キューの数を増やすと、インデックスのスループットが増えますが、ボトルネックが CPU である場合に限ります。

queue-size

デフォルトは 4000 です。各キューが保持できる要素の最大数。queue-size の値を増やすと、インデックス操作中に使用されるメモリー量が増えます。設定値が小さすぎると、インデックス操作要求がブロックされないため、CacheBackpressureFullException または RejectedExecutionExceptionOperationSubmitter が発生する可能性があります。この場合、問題を解決するには、queue-size を増やすか、queue-count を 1 に設定します。

low-level-trace

インデックス化操作の低レベルのトレース情報を有効にします。この属性を有効にすると、パフォーマンスが大幅に低下します。この低レベルのトレースは、トラブルシューティングの最後のリソースとしてのみ使用する必要があります。

Data Grid がインデックスセグメントをマージする方法を設定するには、index-merge サブ要素を使用します。

表1.2 インデックスのマージ設定属性
Attribute説明

max-entries

インデックスセグメントがマージする前に持つことができるエントリーの最大数。この数を超えるエントリーを持つセグメントはマージされません。値を小さくすると、頻繁に変更されるインデックスでのパフォーマンスが向上します。値を大きくすると、インデックスが頻繁に変更されない場合に検索パフォーマンスが向上します。

factor

一度にマージされるセグメントの数。値が小さいほど、マージが頻繁に発生し、より多くのリソースが使用されますが、セグメントの総数は平均して少なくなり、検索パフォーマンスが向上します。より大きな値 (10 より大きい値) は、大量の書き込みシナリオに最適です。

min-size

バックグラウンドマージのセグメントの最小ターゲットサイズ (MB 単位)。このサイズよりも小さなセグメントは積極的にマージされます。値が大きすぎると、頻度は低くなりますが、マージ操作のコストが高くなる可能性があります。

max-size

バックグラウンドマージのセグメントの最大サイズ (MB 単位)。このサイズよりも大きなセグメントは、バックグラウンドでマージされることはありません。これを低い値に設定すると、メモリー要件が軽減され、最適な検索速度を犠牲にして、一部のマージ操作が回避されます。インデックスを強制的にマージする場合、この属性は無視され、代わりに max-forced-size が適用されます。

max-forced-size

強制マージのセグメントの最大サイズ (MB 単位) で、max-size 属性をオーバーライドします。これを max-size 以下の同じ値に設定します。ただし、値を低く設定しすぎると、ドキュメントが削除されるため、検索パフォーマンスが低下します。

calibrate-by-deletes

セグメントのエントリーをカウントする際に、インデックスで削除されたエントリーの数が考慮されるかどうか。false を設定すると、max-entries によってマージが頻繁に発生しますが、削除されたドキュメントが多いセグメントをより積極的にマージして、クエリーのパフォーマンスを向上させます。

インデックスシャーディング

大量のデータがある場合は、Data Grid を設定して、インデックスデータをシャードと呼ばれる複数のインデックスに分割できます。シャード間でのデータ分散を有効にすると、パフォーマンスが向上します。デフォルトでは、シャーディングは無効になっています。

インデックスの数を設定するには、shards 属性を使用します。シャードの数は 1 より大きくなければなりません。

<distributed-cache>
  <indexing>
    <index-sharding shards="6" />
  </indexing>
</distributed-cache>
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.