第26章 Lucene Directory としての Red Hat JBoss Data Grid

26.1. Lucene Directory としての Red Hat JBoss Data Grid

Red Hat JBoss Data Grid は、リレーショナルデータベースの Hibernate Search クエリー用の共有インメモリーインデックス (Infinispan Directory) として使用することができます。デフォルトでは、Hibernate Search はローカルファイルシステムを使用して Lucene インデックスを保存しますが、JBoss Data Grid をストレージとして使用するよう設定すると、複数のサーバーノード全体でリアルタイムのレプリケーションを実現できます。

Infinispan Directory では、インデックスはメモリーに保存され、複数のノード全体で共有されます。Infinispan Diretory は、参加するすべてのノードに分散される 1 つのディレクトリーとして動作します。1 つのノードでインデックスが更新されると、すべてのノードのインデックスが更新されます。クラスター全体でノードの更新が行われた直後にインデックスを検索できます。デフォルトの Hibernate Search 設定は、すべてのノードでインデックスを定義するデータをレプリケートします。

大型のインデックスのデータ分散を有効にするとメモリーの消費を少なくすることができますが、ローカルでのクエリー操作の効率が悪くなります。また、インデックス化されたデータを各ノードに設定された CacheStore にオフロードしたり、各ノードが共有する単一の集中型 CacheStore を設定したりすることもできます。

注記

レプリケーションの代わりに分散を有効にするとメモリーを節約できる可能性がありますが、クエリーの速度は遅くなります。CacheStore を有効にすると、さらにメモリーを節約できる可能性がありますが、パッシベーションの使用時にパフォーマンスが低下します。

26.2. 設定

ディレクトリープロバイダーは、インデックスごとに指定して有効にします。default インデックスが指定されると、指定がある場合を除き、すべてのインデックスがディレクトリープロバイダーを使用します。

hibernate.search.[default|<indexname>].directory_provider = infinispan

上記は、クラスターがレプリケートされたインデックスを提供しますが、デフォルト設定はインデックスの永続化を永久にする方法を有効にしません。このような機能を有効にするには、Infinispan 設定ファイルを提供します。

Hibernate Search では、CacheManager が Infinispan を使用する必要があります。JNDI 経由で既存の CacheManager を検索および再使用でき、新しい CacheManager を開始または管理できます。既存の CacheManager を検索するとき、登録された Infinispan サブシステムから提供されます。たとえば、JBoss EAP 経由で登録された場合、JBoss EAP の Infinispan サブシステムが CacheManager を提供します。

注記

JNDI を使用して CacheManager を登録する場合、Red Hat JBoss Data Grid の設定ファイルのみを使用して登録する必要があります。

JNDI 経由で既存の CacheManager を使用する (任意のパラメーター):

hibernate.search.infinispan.cachemanager_jndiname = [jndiname]

設定ファイルから新規の CacheManager を開始する (任意のパラメーター):

hibernate.search.infinispan.configuration_resourcename = [infinispan configuration filename]

両方のパラメーターが定義されると、JNDI が優先されます。どちらも定義されないと、Hibernate Search は永続キャッシュストアにインデックスを格納しないデフォルトの Infinispan 設定を使用します。

26.3. Red Hat JBoss Data Grid モジュール

Hibernate Search の Red Hat JBoss Data Grid ディレクトリープロバイダーは、JBoss EAP の JBoss Data Grid ライブラリーモジュールの一部として配布されます。Red Hat カスタマーポータル からファイルをダウンロードします。

目的の JBoss Enterprise Application Platform フォルダーの modules/ ディレクトリーにアーカイブを展開します。

以下のエントリーをプロジェクトアーカイブの MANIFEST.MF ファイルに追加します。

Dependencies: org.hibernate.search.orm services

詳細は、Red Hat JBoss EAP 開発ガイドMaven を使用した MANIFEST.MF エントリーの生成 を参照してください。

26.4. レプリケートされたインデックスの Lucene ディレクトリー設定

標準の JPA を使用する場合、以下のプロパティーを Hibernate 設定および永続ユニット設定ファイルで定義します。たとえば、デフォルトのストレージインデックスをすべて変更する場合は、以下のプロパティーを設定できます。

hibernate.search.default.directory_provider=infinispan

これを一意なインデックスで実行することもできます。以下の例では、ticketsactors がインデックス名になります。

hibernate.search.tickets.directory_provider=infinispan
hibernate.search.actors.directory_provider=filesystem

Lucene の DirectoryProvider は以下のオプションを使用してキャッシュ名を設定します。

  • locking_cachename - Lucene のロックが保存されるキャッシュの名前。 デフォルトは LuceneIndexesLocking です。
  • data_cachename - 最大のデータチャンクや最大のオブジェクトを含む Lucene のデータが保存されるキャッシュの名前。デフォルトは LuceneIndexesData です。
  • metadata_cachename - Lucene のメタデータが保存されるキャッシュの名前。デフォルトは LuceneIndexesMetadata です。

ロッキングキャッシュの名前を CustomLockingCache に変更するには、以下を使用します。

hibernate.search.default.directory_provider.locking_cachname="CustomLockingCache"

また、インデックスの大型のファイルは設定可能な小型のチャンクに分割されます。通常、インデックスの chunk_size をネットワークが効率的に処理できる最大値に設定することが推奨されます。

Hibernate Search には、レプリケートされたキャッシュを使用してインデックスを処理するデフォルト値がすでに含まれています。

複数のノードが同時にインデックスに書き込みを行う場合は、JMS バックエンドを設定することが重要です。設定の詳細は、Hibernate Search のドキュメントを参照してください。

重要

分散モードを設定する必要がある設定では、LuceneIndexesMetadataLuceneIndexesLocking キャッシュがすべての場合で常にレプリケーションモードを使用する必要があります。

26.5. JMS マスターおよびスレーブのバックエンド設定

Infinispan ディレクトリーを使用する場合、JMS マスター/スレーブバックエンドの使用が推奨されます。Infinispan では、すべてのノードが同じインデックスを共有します。また、異なるノード上で IndexWriter がアクティブであるため、同じインデックスでロックを取得します。そのため、インデックスへ直接更新を送信する代わりに、JMS へ送信し、1 つのノードが他のノードの代わりにすべての変更を適用するようにします。

警告

JMS ベースのバックエンドを有効にしないと、複数のノードがインデックスへの書き込みを試行するときにタイムアウト例外が発生する原因となります。

JMS スレーブを設定するには、バックエンドのみを置き換え、ディレクトリープロバイダーを Infinispan に設定します。同じディレクトリープロバイダーをマスターで設定すると接続され、ノード全体でコピージョブを設定する必要はありません。

マスターおよびスレーブの設定例は、 Red Hat JBoss EAP 開発ガイドバックエンドセットアップおよび操作を参照してください。