Data Grid Server ガイド

Red Hat Data Grid 8.1

Data Grid Server のデプロイ、保護、および管理

Red Hat Customer Content Services

概要

Data Grid Server を設定、実行、監視し、リモートクライアントアプリケーションからデータにアクセスします。

Red Hat Data Grid

Data Grid は、高性能の分散型インメモリーデータストアです。

スキーマレスデータ構造
さまざまなオブジェクトをキーと値のペアとして格納する柔軟性があります。
グリッドベースのデータストレージ
クラスター間でデータを分散および複製するように設計されています。
エラスティックスケーリング
サービスを中断することなく、ノードの数を動的に調整して要件を満たします。
データの相互運用性
さまざまなエンドポイントからグリッド内のデータを保存、取得、およびクエリーします。

Data Grid のドキュメント

Data Grid のドキュメントは、Red Hat カスタマーポータルで入手できます。

Data Grid のダウンロード

Red Hat カスタマーポータルで Data Grid Software Downloads にアクセスします。

注記

Data Grid ソフトウェアにアクセスしてダウンロードするには、Red Hat アカウントが必要です。

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

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ を参照してください。

第1章 Getting Started with Data Grid Server

Data Grid Server を素早く設定し、基本情報を確認します。

1.1. Data Grid Server の要件

Data Grid Server には Java 仮想マシンが必要です。サポートされるバージョンの詳細は、Data Grid Supported Configurations を参照してください。

1.2. サーバー分布のダウンロード

Data Grid サーバーディストリビューションは、Java ライブラリー (JAR ファイル)、設定ファイル、および data ディレクトリーのアーカイブです。

手順

  1. Red Hat カスタマーポータルにアクセスします。
  2. ソフトウェアダウンロードセクション から Red Hat Data Grid 8.1 Server をダウンロードします。
  3. 以下のように、サーバーダウンロードアーカイブを引数として、md5sum または sha256sum を実行します。

    $ sha256sum jboss-datagrid-${version}-server.zip
  4. Data Grid Software Details ページで MD5 または SHA-256 チェックサムの値と比較します。

参照資料

  • Data Grid Server README には、サーバーディストリビューションの内容が記載されています。

1.3. Data Grid Server のインストール

ホストシステムに Data Grid Server ディストリビューションをインストールします。

前提条件

Data Grid Server ディストリビューションアーカイブをダウンロードします。

手順

  • 適切なツールを使用して Data Grid Server のアーカイブをホストファイルシステムにデプロイメントします。
$ unzip redhat-datagrid-8.1.1-server.zip

作成されたディレクトリーは $RHDG_HOME です。

1.4. ユーザーの作成と変更

Data Grid Server では、デフォルトのプロパティーレルムに対してユーザーを認証する必要があります。Data Grid Server にアクセスする前に、少なくとも 1 人のユーザーとパスワードを作成して認証情報を追加する必要があります。ユーザーが属するセキュリティー承認グループを追加および変更することもできます。

手順

  1. $RHDG_HOME でターミナルを開きます。
  2. user コマンドを使用して Data Grid ユーザーを作成および変更します。
ヒント

このコマンドの使用方法の詳細は、help user を実行してください。

ユーザーとパスワードの作成

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!"
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!"

グループメンバーシップを持つユーザーの作成

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!" -g supervisor,reader,writer
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!" -g supervisor,reader,writer

1.5. Data Grid Server の起動

ローカルホストで Data Grid Server を実行します。

前提条件

  • 少なくとも 1 人の Data Grid ユーザーを作成している。

手順

  1. $RHDG_HOME でターミナルを開きます。
  2. server スクリプトを使用して Data Grid Server を実行します。

    Linux
    $ bin/server.sh
    Microsoft Windows
    bin\server.bat

以下のメッセージがログに記録される場合は、Data Grid Server は正常に実行されています。

ISPN080004: Protocol SINGLE_PORT listening on 127.0.0.1:11222
ISPN080034: Server '...' listening on http://127.0.0.1:11222
ISPN080001: Data Grid Server <version> started in <mm>ms

検証

  1. 任意のブラウザーで 127.0.0.1:11222/console/ を開きます。
  2. プロンプトで認証情報を入力し、Data Grid Console に進みます。

1.6. クラスタービューの確認

同じネットワーク上の Data Grid ノードは自動的に相互を検出し、クラスターを形成します。

ローカルで実行されている Data Grid Server インスタンスを使用して、デフォルトの TCP スタックで MPING プロトコルを使用してクラスター検出を監視するには、この手順を実行します。カスタムネットワーク要件のクラスタートランスポートを調整する場合は、Data Grid クラスターの設定に関するドキュメントを参照してください。

注記

この手順は、クラスター検出の原則を示すことを目的としており、実稼働環境を対象としていません。コマンドラインでポートオフセットを指定することは、実稼働用のクラスタートランスポートを設定するための信頼できる方法ではありません。

前提条件

Data Grid Server の 1 つのインスタンスを実行している。

手順

  1. $RHDG_HOME でターミナルを開きます。
  2. root ディレクトリーを server2 にコピーします。

    $ cp -r server server2
  3. ポートオフセットと server2 ディレクトリーを指定します。

    $ bin/server.sh -o 100 -s server2

検証

127.0.0.1:11222/console/cluster-membership のコンソールでクラスターのメンバーシップを表示できます。

Data Grid は、ノードがクラスターに参加する際に、以下のメッセージも記録します。

INFO  [org.infinispan.CLUSTER] (jgroups-11,<server_hostname>)
ISPN000094: Received new cluster view for channel cluster:
[<server_hostname>|3] (2) [<server_hostname>, <server2_hostname>]

INFO  [org.infinispan.CLUSTER] (jgroups-11,<server_hostname>)
ISPN100000: Node <server2_hostname> joined the cluster

1.7. Data Grid Server のシャットダウン

個別に実行中のサーバーを停止するか、クラスターを正常に停止します。

手順

  1. Data Grid への CLI 接続を作成します。
  2. 次のいずれかの方法で Data Grid Server をシャットダウンします。

    • shutdown cluster コマンドを使用して、クラスターのすべてのノードを停止します。以下に例を示します。

      [//containers/default]> shutdown cluster

      このコマンドは、クラスターの各ノードの data フォルダーにクラスターの状態を保存します。キャッシュストアを使用する場合、shutdown cluster コマンドはキャッシュのすべてのデータも永続化します。

    • shutdown server コマンドおよびサーバーのホスト名を使用して、個々のサーバーインスタンスを停止します。以下に例を示します。

      [//containers/default]> shutdown server <my_server01>
重要

shutdown server コマンドは、リバランス操作が完了するまで待機しません。これにより、同時に複数のホスト名を指定すると、データが失われる可能性があります。

ヒント

このコマンドの使用方法の詳細については、help shutdown を実行してください。

検証

Data Grid は、サーバーをシャットダウンしたときに以下のメッセージをログに記録します。

ISPN080002: Data Grid Server stopping
ISPN000080: Disconnecting JGroups channel cluster
ISPN000390: Persisted state, version=<$version> timestamp=YYYY-MM-DDTHH:MM:SS
ISPN080003: Data Grid Server stopped

1.7.1. Data Grid クラスターの再起動

シャットダウン後に Data Grid クラスターをオンラインに戻す場合、クラスターが利用できるのを待ってから、ノードの追加または削除、またはクラスター状態の変更を行う必要があります。

shutdown server コマンドでクラスター化ノードをシャットダウンする場合は、各サーバーを逆の順序で再起動する必要があります。
たとえば、server1 をシャットダウンしてから、server2 をシャットダウンする場合は、最初に server2 を起動してから server1 を起動する必要があります。

shutdown cluster コマンドでクラスターをシャットダウンすると、すべてのノードが再度参加した後にのみ、クラスターは完全に機能するようになります。
ノードは任意の順序で再起動できますが、シャットダウン前に参加していたすべてのノードが実行されるまで、クラスターは DEGRADED 状態のままになります。

1.8. Data Grid サーバーファイルシステム

Data Grid Server は、$RHDG_HOME の下のホストファイルシステムの以下のフォルダーを使用します。

├── bin
├── boot
├── docs
├── lib
├── server
└── static
ヒント

$RHDG_HOME ディレクトリーの各フォルダーと、ファイルシステムのカスタマイズに使用できるシステムプロパティーに関する詳細は、Data Grid Server README を参照してください。

1.8.1. サーバー root ディレクトリー

bin および docs フォルダーのリソースの他に、対話する必要がある $RHDG_HOME 下の唯一のフォルダーは、デフォルトで server と名付けられたサーバー root ディレクトリーです。

同じ $RHDG_HOME ディレクトリーまたは別のディレクトリーに複数のノードを作成できますが、各 Data Grid Server インスタンスには、独自のサーバー root ディレクトリーが必要です。たとえば、5 つのノードのクラスターは、ファイルシステム上に以下のサーバー root ディレクトリーを持つことができます。

├── server
├── server1
├── server2
├── server3
└── server4

各サーバーの root ディレクトリーには、以下のフォルダーが含まれている必要があります。

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log

server/conf

Data Grid Server インスタンスの infinispan.xml 設定ファイルを保持します。

Data Grid は、設定を 2 つの層に分割します。

動的
データスケーラビリティーの変更可能なキャッシュ設定を作成します。
Data Grid Server は、実行時に作成したキャッシュを、ノード全体に分散されているクラスター状態とともに永続的に保存します。参加している各ノードは、変更が発生するたびに Data Grid Server がすべてのノード間で同期する完全なクラスター状態を受け取ります。
Static
クラスタートランスポート、セキュリティー、共有データソースなど、基盤となるサーバーのメカニズムに対して infinispan.xml に設定を追加します。

server/data

Data Grid Server がクラスターの状態を維持するために使用する内部ストレージを提供します。

重要

server/data のコンテンツを直接削除または変更しないでください。

サーバーの実行中に caches.xml などのファイルを変更すると、破損が発生する可能性があります。コンテンツを削除すると、誤った状態になる可能性があります。つまり、シャットダウン後にクラスターを再起動できなくなります。

server/lib

カスタムフィルター、カスタムイベントリスナー、JDBC ドライバー、カスタム ServerTask 実装などの拡張 JAR ファイルが含まれます。

server/log

Data Grid Server のログファイルを保持します。

第2章 Data Grid サーバーネットワークの設定

Data Grid サーバーを使用すると、ネットワーク全体でエンドポイントを使用できるようにインターフェイスとポートを設定できます。

デフォルトでは、Data Grid サーバーは単一の TCP/IP ポートへの多重エンドポイントを多重化し、受信クライアント要求のプロトコルを自動的に検出します。

2.1. サーバーインターフェイス

Data Grid サーバーは、異なるストラテジーを使用して IP アドレスにバインドできます。

2.1.1. アドレスストラテジー

単一 public インターフェイスを IPv4 ループバックアドレス (127.0.0.1) にマップする inet-address 戦略を使用します。

<interfaces>
  <interface name="public">
    <inet-address value="${infinispan.bind.address:127.0.0.1}"/>
  </interface>
</interfaces>
ヒント

CLI -b 引数または infinispan.bind.address プロパティーを使用して、コマンドラインから特定のアドレスを選択できます。デフォルトバインドアドレスの変更 を参照してください。

2.1.2. ループバックストラテジー

ループバックアドレスを選択します。

  • IPv4 アドレスブロック 127.0.0.0/8 はループバックアドレス用に予約されています。
  • IPv6 アドレスブロック ::1 はループバックアドレスのみになります。
<interfaces>
    <interface name="public">
        <loopback/>
    </interface>
</interfaces>

2.1.3. 非 Loopback ストラテジー

非ループバックアドレスを選択します。

<interfaces>
    <interface name="public">
        <non-loopback/>
    </interface>
</interfaces>

2.1.4. ネットワークアドレスストラテジー

IP アドレスに基づいてネットワークを選択します。

<interfaces>
    <interface name="public">
        <inet-address value="10.1.2.3"/>
    </interface>
</interfaces>

2.1.5. 任意のアドレスストラテジー

INADDR_ANY ワイルドカードアドレスを選択します。その結果、Data Grid サーバーはすべてのインターフェイスでリッスンします。

<interfaces>
    <interface name="public">
        <any-address/>
    </interface>
</interfaces>

2.1.7. サイトのローカルストラテジー

サイトローカル (プライベート) の IP アドレスを選択します。

  • IPv4 アドレスブロック 10.0.0.0/8172.16.0.0/12、および 192.168.0.0/16 はサイトローカルアドレス指定用に予約されています。
  • IPv6 アドレスブロック fc00::/7 はサイトローカルユニキャストアドレス用に予約されます。
<interfaces>
    <interface name="public">
        <inet-address value="10.1.2.3"/>
    </interface>
</interfaces>

2.1.8. ホストストラテジーの一致

ホスト名を解決し、任意のネットワークインターフェイスに割り当てられている IP アドレスの 1 つを選択します。

Data Grid サーバーは、使用可能なすべてのオペレーティングシステムインターフェイスを列挙して、設定内のホスト名から解決された IP アドレスを見つけます。

<interfaces>
    <interface name="public">
        <match-host value="my_host_name"/>
    </interface>
</interfaces>

2.1.9. マッチインターフェイス戦略

正規表現に一致するネットワークインターフェイスに割り当てられた IP アドレスを選択します。

Data Grid サーバーは、使用可能なすべてのオペレーティングシステムインターフェイスを列挙して、設定内のインターフェイス名を見つけます。

ヒント

柔軟性を高めるために、この戦略では正規表現を使用してください。

<interfaces>
    <interface name="public">
        <match-interface value="eth0"/>
    </interface>
</interfaces>

2.1.10. マッチアドレスストラテジー

inet-address と同様ですが、正規表現を使用して IP アドレスを選択します。

Data Grid サーバーは、使用可能なすべてのオペレーティングシステムインターフェイスを列挙して、設定内の IP アドレスを特定します。

ヒント

柔軟性を高めるために、この戦略では正規表現を使用してください。

<interfaces>
    <interface name="public">
        <match-address value="132\..*"/>
    </interface>
</interfaces>

2.1.11. フォールバックストラテジー

インターフェイス設定には、複数の戦略を含めることができます。Data Grid サーバーは、宣言された順序で各ストラテジーを試みます。

たとえば、次の設定では、Data Grid サーバーは最初にホストの照合を試み、次に IP アドレスを照合し、次に INADDR_ANY ワイルドカードアドレスにフォールバックします。

<interfaces>
    <interface name="public">
        <match-host value="my_host_name"/>
        <match-address value="132\..*"/>
        <any-address/>
    </interface>
</interfaces>

2.1.12. Data Grid Server のデフォルトのバインドアドレスの変更

サーバー -b スイッチまたは infinispan.bind.address システムプロパティーを使用して、別のアドレスにバインドできます。

たとえば、以下のように public インターフェイスを 127.0.0.2 にバインドします。

Linux
$ bin/server.sh -b 127.0.0.2
Windows
bin\server.bat -b 127.0.0.2

2.2. ソケットバインディング

ソケットバインディングは、エンドポイントコネクターをサーバーインターフェイスおよびポートにマッピングします。

デフォルトでは、Data Grid サーバーは以下のソケットバインディングを提供します。

<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
    <socket-binding name="default" port="${infinispan.bind.port:11222}"/>
    <socket-binding name="memcached" port="11221"/>
</socket-bindings>
  • socket-bindings は、デフォルトのインターフェイスとポートオフセットを宣言します。
  • default は、hotrod と rest コネクターをデフォルトのポート 11222 にバインドします。
  • memcached は、memcached コネクターをポート 11221 にバインドします。

    注記

    memcached エンドポイントはデフォルトで無効にされます。

socket-binding 宣言のデフォルトインターフェイスをオーバーライドするには、interface 属性を指定します。

たとえば、"private" という名前の interface 宣言を追加します。

<interfaces>
  ...
  <interface name="private">
    <inet-address value="10.1.2.3"/>
  </interface>
</interfaces>

続いて、以下のように、socket-binding 宣言で interface="private" を指定して、プライベート IP アドレスにバインドすることができます。

<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
  ...
  <socket-binding name="private_binding" interface="private" port="1234"/>
</socket-bindings>

2.2.1. ポートオフセットの指定

同じホストで複数のインスタンスを実行する場合は、Data Grid サーバーでポートオフセットを設定します。デフォルトのポートオフセットは 0 です。

Data Grid CLI または infinispan.socket.binding.port-offset システムプロパティーで -o スイッチを使用して、ポートオフセットを設定します。

たとえば、以下のようにオフセットが 100 のサーバーインスタンスを起動します。デフォルトの設定では、これにより、Data Grid Server がポート 11322 でリッスンします。

Linux
$ bin/server.sh -o 100
Windows
bin\server.bat -o 100

2.3. Data Grid プロトコルの処理

Data Grid サーバーはルーターコネクターを使用して、同じ TCP ポート 11222 で複数のプロトコルを公開します。複数のプロトコルに単一のポートを使用すると、設定と管理が簡素化され、権限のないユーザーの攻撃対象領域が減少するため、セキュリティーが向上します。

Data Grid サーバーは、ポート 11222 を介して HTTP/1.1、HTTP/2、および Hot Rod プロトコル要求を次のように処理します。

HTTP/1.1 アップグレードヘッダー
クライアントリクエストには HTTP/1.1 アップグレード ヘッダーフィールドが含まれ、Data Grid サーバーとの HTTP/1.1 接続を開始できます。次に、クライアントアプリケーションは Upgrade: protocol ヘッダーフィールドを送信できます。protocol は Data Grid サーバーエンドポイントです。
Application-Layer Protocol Negotiation (ALPN)/Transport Layer Security (TLS)
クライアントアプリケーションは、Data Grid サーバーエンドポイントのサーバー名表示 (SNI) マッピングを指定して、安全な方法でプロトコルをネゴシエートします。
Hot Rod の自動検出
シングルポートルーター設定に Hot Rod が含まれている場合、Hot Rod ヘッダーを含むクライアント要求は自動的に Hot Rod エンドポイントにルーティングされます。

2.3.1. ALPN 用クライアントの設定

Data Grid サーバーと TLS ハンドシェイク時に、プロトコルネゴシエーションの ALPN メッセージを提供するようにクライアントを設定します。

前提条件

  • 暗号化で Data Grid サーバーエンドポイントを有効にします。

手順

  1. Data Grid サーバーとの ALPN/TLS エクスチェンジを処理する適切なライブラリーをクライアントアプリケーションに提供します。

    注記

    Data Grid は、Java に Wildfly OpenSSL バインディングを使用します。

  2. トラストストアでクライアントを適宜設定します。

プログラムで

ConfigurationBuilder builder = new ConfigurationBuilder()
      .addServers("127.0.0.1:11222");

builder.security().ssl().enable()
      .trustStoreFileName("truststore.pkcs12")
      .trustStorePassword(DEFAULT_TRUSTSTORE_PASSWORD.toCharArray());

RemoteCacheManager remoteCacheManager = new RemoteCacheManager(builder.build());
RemoteCache<String, String> cache = remoteCacheManager.getCache("default"");

Hot Rod クライアントプロパティー

infinispan.client.hotrod.server_list = 127.0.0.1:11222
infinispan.client.hotrod.use_ssl = true
infinispan.client.hotrod.trust_store_file_name = truststore.pkcs12
infinispan.client.hotrod.trust_store_password = trust_store_password

第3章 Data Grid Server エンドポイントの設定

Data Grid サーバーは、リモートクライアントアプリケーションからのリクエストを処理するリスナーエンドポイントを提供します。

3.1. Data Grid のエンドポイント

Data Grid エンドポイントは、異なるコネクタープロトコルで CacheManager インターフェイスを公開し、データをリモートでアクセスし、Data Grid クラスターを管理および維持するための操作を実行することができます。

異なるソケットバインディングで複数のエンドポイントコネクターを定義できます。

3.1.1. Hot Rod

Hot Rod は、テキストベースのプロトコルと比較して、データへのアクセス時間を短縮し、パフォーマンスを向上するために設計されたバイナリー TCP クライアントサーバープロトコルです。

Data Grid は、Java、C++、C#、Node.js、およびその他のプログラミング言語で Hot Rod クライアントライブラリーを提供します。

トポロジーの状態遷移

Data Grid はトポロジーキャッシュを使用して、クライアントにクラスタービューを提供します。トポロジーキャッシュには、内部 JGroups トランスポートアドレスを公開された Hot Rod エンドポイントにマッピングするエントリーが含まれます。

クライアントが要求を送信すると、Data Grid サーバーは、要求ヘッダーのトポロジー ID をキャッシュからのトポロジー ID と比較します。クライアントに古いトポロジー ID がある場合は、Data Grid サーバーは新しいトポロジービューを送信します。

クラスタートポロジービューを使用すると、Hot Rod クライアントは、ノードがいつ参加および離脱するかを即座に検出できるため、動的な負荷分散とフェイルオーバーが可能になります。

分散キャッシュモードでは、一貫性のあるハッシュアルゴリズムにより、Hot Rod クライアント要求をプライマリー所有者に直接ルーティングすることもできます。

3.1.2. REST

参照資料

Data Grid は、HTTP クライアントがデータにアクセスし、クラスターを監視および保守し、管理操作を実行できるようにする RESTful インターフェイスを公開します。

標準の HTTP ロードバランサーを使用して、クライアントに負荷分散およびフェイルオーバー機能を提供できます。ただし、HTTP ロードバランサーは静的クラスタービューを維持し、クラスタートポロジーの変更が発生したときに手動で更新する必要があります。

3.1.3. プロトコルの比較

表3.1 参照資料

 Hot RodHTTP / REST

トポロジー対応

Y

N

ハッシュ対応

Y

N

暗号化

Y

Y

認証

Y

Y

条件付き操作

Y

Y

バルク操作

Y

N

トランザクション

Y

N

リスナー

Y

N

Query

Y

Y

実行

Y

N

クロスサイトフェイルオーバー

Y

N

3.2. エンドポイントコネクター

ソケットバインディング、認証メカニズム、および暗号化設定を指定するコネクター宣言で、Data Grid サーバーエンドポイントを設定します。

デフォルトのエンドポイントコネクター設定は以下のとおりです。

<endpoints socket-binding="default">
   <hotrod-connector name="hotrod"/>
   <rest-connector name="rest"/>
   <memcached-connector socket-binding="memcached"/>
</endpoints>
  • endpoints には、エンドポイントコネクター宣言が含まれ、デフォルトのソケットバインディング、セキュリティーレルム、クライアントが有効な TLS 証明書を表示する必要があるかどうかなどのエンドポイントのグローバル設定を定義します。
  • <hotrod-connector name="hotrod"/> は、Hot Rod コネクターを宣言します。
  • <rest-connector name="rest"/> は、Hot Rod コネクターを宣言します。
  • <memcached-connector socket-binding="memcached"/> は memcached ソケットバインディングを使用する Memcached コネクターを宣言します。

参照

urn:infinispan:server スキーマは利用可能なすべてのエンドポイント設定を提供します。

3.2.1. Hot Rod コネクター

Hot Rod コネクター宣言は Hot Rod サーバーを有効にします。

<hotrod-connector name="hotrod">
  <topology-state-transfer />
  <authentication>
    ...
  </authentication>
  <encryption>
    ...
  </encryption>
</hotrod-connector>
  • name="hotrod" は、Hot Rod コネクターに論理的に名前を付けます。
  • topology-state-transfer は、Hot Rod クライアントにクラスタートポロジーを提供する状態遷移操作を調整します。
  • authentication は SASL 認証メカニズムを設定します。
  • encryption は、クライアント接続の TLS 設定を設定します。

参照資料

urn:infinispan:server スキーマは、利用可能なすべての Hot Rod コネクター設定を提供します。

3.2.2. REST コネクター

REST コネクター宣言は REST サーバーを有効にします。

<rest-connector name="rest">
  <authentication>
    ...
  </authentication>
  <cors-rules>
    ...
  </cors-rules>
  <encryption>
    ...
  </encryption>
</rest-connector>
  • name="rest" は、REST コネクターに論理的に名前を付けます。
  • authentication は認証メカニズムを設定します。
  • cors-rules は、クロスドメイン要求の CORS (Cross Origin Resource Sharing) ルールを指定します。
  • encryption は、クライアント接続の TLS 設定を設定します。

参照資料

urn:infinispan:server スキーマは、利用可能なすべての REST コネクター設定を提供します。

3.3. Data Grid Server ポートおよびプロトコル

Data Grid Server は、リモートクライアントアクセス用にネットワーク上のエンドポイントを公開します。

ポートプロトコル説明

11222

TCP

Hot Rod および REST エンドポイント

11221

TCP

デフォルトで無効にされる Memcached エンドポイント。

3.3.1. リモート接続用のネットワークファイアウォールの設定

サーバーと外部クライアント間のトラフィックを許可するためにファイアウォールルールを調整します。

手順

Red Hat Enterprise Linux (RHEL) ワークステーションでは、たとえば、以下のように firewalld を使用してポート 11222 へのトラフィックを許可できます。

# firewall-cmd --add-port=11222/tcp --permanent
success
# firewall-cmd --list-ports | grep 11222
11222/tcp

ネットワーク全体に適用されるファイアウォールルールを設定するには、nftables ユーティリティーを使用できます。

第4章 Data Grid Server へのアクセスのセキュリティー保護

認証および暗号化メカニズムを設定して、Data Grid Server へのアクセスをセキュリティー保護し、データを保護します。

4.1. Data Grid サーバーのセキュリティーレルムの定義

セキュリティーレルムは、ID、暗号化、認証、および承認情報を Data Grid サーバーエンドポイントに提供します。

4.1.1. プロパティーレルム

プロパティーレルムはプロパティーファイルを使用して、ユーザーおよびグループを定義します。

users.properties は、ユーザー名をプレーンテキスト形式でパスワードにマッピングします。DIGEST-MD5 SASL メカニズムまたは Digest HTTP メカニズムを使用する場合は、パスワードを事前にダイジェストすることもできます。

myuser=a_password
user2=another_password

groups.properties はユーザーをロールにマッピングします。

myuser=supervisor,reader,writer
user2=supervisor

プロパティーレルム設定

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <properties-realm groups-attribute="Roles"> 1
            <user-properties path="users.properties" 2
                             relative-to="infinispan.server.config.path" 3
                             plain-text="true"/> 4
            <group-properties path="groups.properties" 5
                              relative-to="infinispan.server.config.path"/>
         </properties-realm>
      </security-realm>
   </security-realms>
</security>

1
グループを Data Grid Server の承認用のロールとして定義します。
2
users.properties ファイルを指定します。
3
ファイルが $ISPN_HOME/server/conf ディレクトリーに相対されることを指定します。
4
users.properties のパスワードがプレーンテキスト形式であることを指定します。
5
groups.properties ファイルを指定します。

サポート対象の認証メカニズム

プロパティーレルムは、以下の認証メカニズムをサポートします。

  • SASL: PLAINDIGEST-*、および SCRAM-*
  • HTTP(REST): Basic および Digest

4.1.1.1. ユーザーの作成と変更

Data Grid Server では、デフォルトのプロパティーレルムに対してユーザーを認証する必要があります。Data Grid Server にアクセスする前に、少なくとも 1 人のユーザーとパスワードを作成して認証情報を追加する必要があります。ユーザーが属するセキュリティー承認グループを追加および変更することもできます。

手順

  1. $RHDG_HOME でターミナルを開きます。
  2. user コマンドを使用して Data Grid ユーザーを作成および変更します。
ヒント

このコマンドの使用方法の詳細は、help user を実行してください。

ユーザーとパスワードの作成

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!"
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!"

グループメンバーシップを持つユーザーの作成

  • Linux

    $ bin/cli.sh user create myuser -p "qwer1234!" -g supervisor,reader,writer
  • Microsoft Windows

    $ bin\cli.bat user create myuser -p "qwer1234!" -g supervisor,reader,writer

4.1.2. LDAP レルム

LDAP レルムは、OpenLDAP、Red Hat Directory Server、Apache Directory Server、Microsoft Active Directory などの LDAP サーバーに接続して、ユーザーを認証し、メンバーシップ情報を取得します。

注記

LDAP サーバーは、サーバーのタイプとデプロイメントに応じて、異なるエントリーレイアウトを持つことができます。このため、LDAP レルム設定は複雑です。すべてのポジションの設定の例を提供するために、本書では扱いません。

LDAP レルム設定

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
        <ldap-realm name="ldap" 1
                    url="ldap://my-ldap-server:10389" 2
                    principal="uid=admin,ou=People,dc=infinispan,dc=org" 3
                    credential="strongPassword"
                    connection-timeout="3000" read-timeout="30000" 4
                    connection-pooling="true" referral-mode="ignore"
                    page-size="30"
                    direct-verification="true"> 5
            <identity-mapping rdn-identifier="uid" 6
                              search-dn="ou=People,dc=infinispan,dc=org"> 7
               <attribute-mapping> 8
                  <attribute from="cn"
                             to="Roles"
                             filter="(&amp;(objectClass=groupOfNames)(member={1}))"
                             filter-dn="ou=Roles,dc=infinispan,dc=org"/>
               </attribute-mapping>
            </identity-mapping>
         </ldap-realm>
      </security-realm>
   </security-realms>
</security>

1
LDAP レルムに名前を付けます。
2
LDAP サーバー接続 URL を指定します。
3
LDAP サーバーに接続するためのプリンシパルおよび認証情報を指定します。
重要

LDAP 接続のプリンシパルには、LDAP クエリーを実行し、特定の属性にアクセスするために必要な権限が必要です。

4
必要に応じて、接続タイムアウトなどを指定して LDAP サーバー接続を調整します。
5
ユーザーの認証情報を検証します。Data Grid は設定済みの認証情報を使用して LDAP サーバーへの接続を試みます。または、パスワードを指定する user-password-mapper 要素を使用することもできます。
6
LDAP エントリーをアイデンティティーにマッピングします。rdn-identifier は、指定された識別子 (通常はユーザー名) をもとにユーザーエントリーを検索する LDAP 属性を指定します (例: uid または sAMAccountName 属性)。
7
ユーザーエントリーを含む LDAP サブツリーへの検索を制限する開始コンテキストを定義します。
8
ユーザーがメンバーとなっている全グループを取得します。通常、メンバーシップ情報を保存する方法は 2 つあります。
  • 通常、member 属性にクラス groupOfNames を持つグループエントリーの下。この場合は、前述の設定例にあるように、属性フィルターを使用できます。このフィルターは、提供されたフィルターに一致するエントリーを検索します。フィルターは、ユーザーの DN と等しい member 属性を持つグループを検索します。次に、フィルターは、from で指定されたグループエントリーの CN を抽出し、それをユーザーの Roles に追加します。
  • memberOf 属性のユーザーエントリー。この場合、以下のような属性参照を使用する必要があります。

    <attribute-reference reference="memberOf" from="cn" to="Roles" />

    この参照は、ユーザーエントリーからすべての memberOf 属性を取得し、from で指定された CN を抽出し、それらをユーザーの Roles に追加します。

サポート対象の認証メカニズム

LDAP レルムは、以下の認証メカニズムを直接サポートします。

  • SASL: PLAINDIGEST-*、および SCRAM-*
  • HTTP(REST): Basic および Digest

4.1.2.1. LDAP レルムプリンシパルの書き換え

GSSAPIGS2-KRB5Negotiate などの一部の SASL 認証メカニズムでは、LDAP サーバーの検索に使用する前に クリーンアップ する必要のあるユーザー名を提供します。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <ldap-realm name="ldap"
                     url="ldap://${org.infinispan.test.host.address}:10389"
                     principal="uid=admin,ou=People,dc=infinispan,dc=org"
                     credential="strongPassword">
            <name-rewriter> 1
               <regex-principal-transformer name="domain-remover"
                                            pattern="(.*)@INFINISPAN\.ORG"
                                            replacement="$1"/>
            </name-rewriter>
            <identity-mapping rdn-identifier="uid"
                              search-dn="ou=People,dc=infinispan,dc=org">
               <attribute-mapping>
                  <attribute from="cn" to="Roles"
                             filter="(&amp;(objectClass=groupOfNames)(member={1}))"
                             filter-dn="ou=Roles,dc=infinispan,dc=org" />
               </attribute-mapping>
               <user-password-mapper from="userPassword" />
            </identity-mapping>
         </ldap-realm>
      </security-realm>
   </security-realms>
</security>
1
正規表現を使用してプリンシパルからユーザー名を抽出するリライトを定義します。

4.1.3. トラストストアレルム

トラストストアレルムは、Data Grid サーバーへの接続が許可されるすべてのクライアントのパブリック証明書が含まれるキーストアを使用します。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12" 1
                         relative-to="infinispan.server.config.path" 2
                         keystore-password="secret" 3
                         alias="server"/> 4
            </ssl>
         </server-identities>
         <truststore-realm path="trust.p12" 5
                           relative-to="infinispan.server.config.path"
                           keystore-password="secret"/>
      </security-realm>
   </security-realms>
</security>
1
サーバー証明書が含まれるキーストアを使用して SSL サーバーアイデンティティーを提供します。
2
ファイルが $ISPN_HOME/server/conf ディレクトリーに相対されることを指定します。
3
キーストアパスワードを指定します。
4
キーストアエイリアスを指定します。
5
すべてのクライアントのパブリック証明書が含まれるキーストアを提供します。

サポート対象の認証メカニズム

トラストストアレルムは、クライアント証明書の認証メカニズムと連携します。

  • SASL: EXTERNAL
  • HTTP (REST): CLIENT_CERT

4.1.4. トークンレルム

トークンレルムは外部サービスを使用してトークンを検証し、Red Hat SSO などの RFC-7662 (OAuth2 トークンイントロスペクション) と互換性のあるプロバイダーを必要とします。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <token-realm name="token"
                      auth-server-url="https://oauth-server/auth/"> 1
            <oauth2-introspection
                    introspection-url="https://oauth-server/auth/realms/infinispan/protocol/openid-connect/token/introspect" 2
                    client-id="infinispan-server" 3
                    client-secret="1fdca4ec-c416-47e0-867a-3d471af7050f"/> 4
         </token-realm>
      </security-realm>
   </security-realms>
</security>
1
認証サーバーの URL を指定します。
2
トークンイントロスペクションエンドポイントの URL を指定します。
3
Data Grid サーバーのクライアント識別子に名前を付けます。
4
Data Grid サーバーのクライアントシークレットを指定します。

サポート対象の認証メカニズム

トークンレルムは、以下の認証メカニズムをサポートします。

  • SASL: OAUTHBEARER
  • HTTP (REST): Bearer

4.2. Data Grid サーバーのアイデンティティーの作成

サーバーアイデンティティーはセキュリティーレルムで定義され、Data Grid サーバーがアイデンティティーをクライアントに証明できるようにします。

4.2.1. SSL アイデンティティーの設定

SSL ID は、証明書または証明書のチェーンのいずれかが含まれるキーストアを使用します。

注記

セキュリティーレルムに SSL アイデンティティーが含まれる場合、Data Grid サーバーはこれらのセキュリティーレルムを使用するエンドポイントの暗号化を自動的に有効にします。

手順

  1. Data Grid サーバーのキーストアを作成します。

    重要

    Data Grid サーバーは JKS、JCEKS、PKCS12、BKS、BCFKS、および UBER のキーストア形式をサポートします。

    実稼働環境では、サーバー証明書は Root または Intermediate CA のいずれかの信頼される認証局によって署名される必要があります。

  2. キーストアを $ISPN_HOME/server/conf ディレクトリーに追加します。
  3. server-identities 定義を Data Grid サーバーのセキュリティーレルムに追加します。
  4. パスワードおよびエイリアスとともにキーストアの名前を指定します。

4.2.1.1. SSL Identity 設定

以下の例では、Data Grid サーバーの SSL アイデンティティーを設定します。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities> 1
            <ssl> 2
               <keystore path="server.p12" 3
                         relative-to="infinispan.server.config.path" 4
                         keystore-password="secret" 5
                         alias="server"/> 6
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
1
Data Grid サーバーの ID を定義します。
2
Data Grid サーバーの SSL アイデンティティーを設定します。
3
Data Grid サーバーの SSL 証明書が含まれるキーストアに名前を付けます。
4
キーストアが $ISPN_HOMEserver/conf ディレクトリーに相対されることを指定します。
5
キーストアパスワードを指定します。
6
キーストアエイリアスを指定します。

4.2.1.2. キーストアの自動生成

Data Grid サーバーを設定し、起動時にキーストアを自動的に生成します。

重要

自動生成されたキーストア:

  • 実稼働環境では使用しないでください。
  • 必要に応じて生成されます。たとえば、クライアントから最初の接続を取得する際などに生成されます。
  • Hot Rod クライアントで直接使用可能な証明書が含まれます。

手順

  1. サーバー設定に keystore 要素の generate-self-signed-certificate-host 属性を含めます。
  2. サーバー証明書のホスト名を値として指定します。

生成されたキーストアを持つ SSL サーバーアイデンティティー

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret"
                         alias="server"
                         generate-self-signed-certificate-host="localhost"/> 1
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>

1
localhost を使用してキーストアを生成します。

4.2.1.3. SSL プロトコルおよび暗号スイートの調整

特定のプロトコルと暗号を使用するように、Data Grid サーバーの SSL アイデンティティー経由で SSL エンジンを設定できます。

重要

使用するプロトコル機能に正しい暗号を設定していることを確認する必要があります。たとえば、HTTP/2ALPN です。

手順

  1. engine 要素を Data Grid サーバーの SSL アイデンティティーに追加します。
  2. enabled-protocols および enabled-ciphersuites 属性を使用して SSL エンジンを設定します。

SSL エンジンの設定

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0
          https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities>
            <ssl>
               <keystore path="server.p12"
                         relative-to="infinispan.server.config.path"
                         keystore-password="secret" alias="server"/>
               <engine enabled-protocols="TLSv1.2 TLSv1.1" 1
                       enabled-ciphersuites="SSL_RSA_WITH_AES_128_GCM_SHA256 2
                       SSL_RSA_WITH_AES_128_CBC_SHA256"/>
            </ssl>
         </server-identities>
      </security-realm>
   </security-realms>
</security>

1
TLS v1 プロトコルおよび v2 プロトコルを使用するように SSL エンジンを設定します。
2
指定された暗号スイートを使用するように SSL エンジンを設定します。

4.2.2. Kerberos アイデンティティーの設定

Kerberos アイデンティティーは、Kerberos パスワードから派生するサービスプリンシパル名と暗号化鍵が含まれる キータブ ファイルを使用します。

注記

キータブ ファイルには、ユーザーとサービスのアカウントプリンシパルの両方を含めることができます。ただし、Data Grid サーバーは、サービスアカウントのプリンシパルのみを使用します。その結果、Data Grid サーバーはクライアントに ID を提供でき、これによりクライアントが Kerberos サーバーで認証できるようになります。

ほとんどの場合、Hot Rod および REST コネクターに一意のプリンシパルを作成します。たとえば、INFINISPAN.ORG ドメインに datagrid サーバーがあるとします。この場合、以下のサービスプリンシパルを作成する必要があります。

  • hotrod/datagrid@INFINISPAN.ORG は Hot Rod サービスを特定します。
  • HTTP/datagrid@INFINISPAN.ORG は REST サービスを識別します。

手順

  1. Hot Rod および REST サービスのキータブファイルを作成します。

    Linux
    $ ktutil
    ktutil:  addent -password -p datagrid@INFINISPAN.ORG -k 1 -e aes256-cts
    Password for datagrid@INFINISPAN.ORG: [enter your password]
    ktutil:  wkt http.keytab
    ktutil:  quit
    Microsoft Windows
    $ ktpass -princ HTTP/datagrid@INFINISPAN.ORG -pass * -mapuser INFINISPAN\USER_NAME
    $ ktab -k http.keytab -a HTTP/datagrid@INFINISPAN.ORG
  2. キータブファイルを $ISPN_HOME/server/conf ディレクトリーにコピーします。
  3. server-identities 定義を Data Grid サーバーのセキュリティーレルムに追加します。
  4. Hot Rod および REST コネクターにサービスプリンシパルを提供するキータブファイルの場所を指定します。
  5. Kerberos サービスプリンシパルに名前を付けます。

4.2.2.1. Kerberos ID 設定

以下の例では、Data Grid サーバーの Kerberos ID を設定します。

<security xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
          xmlns="urn:infinispan:server:11.0">
   <security-realms>
      <security-realm name="default">
         <server-identities> 1
            <kerberos keytab-path="hotrod.keytab" 2
                      principal="hotrod/datagrid@INFINISPAN.ORG" 3
                      required="true"/> 4
            <kerberos keytab-path="http.keytab" 5
                      principal="HTTP/localhost@INFINISPAN.ORG" 6
                      required="true"/>
         </server-identities>
      </security-realm>
   </security-realms>
</security>
1
Data Grid サーバーの ID を定義します。
2
Hotgitops コネクターの Kerberos アイデンティティーを提供する keytab ファイルを指定します。
3
Hotgitops コネクターの Kerberos サービスプリンシパルに名前を付けます。
4
Data Grid サーバーの起動時にキータブファイルが存在する必要があることを指定します。
5
REST コネクターの Kerberos アイデンティティーを提供する keytab ファイルを指定します。
6
REST コネクターの Kerberos サービスプリンシパルに名前を付けます。

4.3. エンドポイント認証メカニズムの設定

クライアントで認証するために、SASL または HTTP 認証メカニズムを使用して、Hot Rod および REST コネクターを設定します。

Data Grid サーバーでは、コマンドラインインターフェイス (CLI) とコンソールに加え、Hot Rod および REST エンドポイントにアクセスするために、ユーザー認証が必要です。また、Data Grid サーバーは、定義したセキュリティーレルムに基づいて認証メカニズムを自動的に設定します。

4.3.1. Data Grid Server の認証

Data Grid サーバーは、エンドポイントに割り当てるセキュリティーレルムに基づいて、認証メカニズムを自動的に設定します。

SASL 認証メカニズム

以下の SASL 認証メカニズムは Hot Rod エンドポイントに適用されます。

Security RealmSASL 認証メカニズム

プロパティーレルムと LDAP レルム

SCRAM-*、DIGEST-*、CRAM-MD5

トークンレルム

OAUTHBEARER

トラストレルム

EXTERNAL

Kerberos アイデンティティー

GSSAPI、GS2-KRB5

SSL/TLS アイデンティティー

PLAIN

HTTP 認証メカニズム

以下の HTTP 認証メカニズムは REST エンドポイントに適用されます。

Security RealmHTTP 認証メカニズム

プロパティーレルムと LDAP レルム

DIGEST

トークンレルム

BEARER_TOKEN

トラストレルム

CLIENT_CERT

Kerberos アイデンティティー

SPNEGO

SSL/TLS アイデンティティー

BASIC

デフォルト設定

Data Grid サーバーは、以下のスニペットに示すように $RHDG_HOME/server/ conf/users.properties で定義されたプレーンテキストの認証情報が含まれるプロパティーレルムを使用する default という名前のセキュリティーレルムを提供します。

<security-realm name="default">
  <properties-realm groups-attribute="Roles">
    <user-properties path="users.properties"
                     relative-to="infinispan.server.config.path"
                     plain-text="true"/>
    <group-properties path="groups.properties"
                      relative-to="infinispan.server.config.path" />
  </properties-realm>
</security-realm>

endpoints 設定は、以下のようにデフォルトのセキュリティーレルムを Hot Rod および REST コネクターに割り当てます。

<endpoints socket-binding="default" security-realm="default">
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>

上記の設定により、Data Grid サーバーには、プロパティーレルムがサポートするメカニズムによる認証が必要になります。

4.3.2. Hot Rod 認証の手動設定

Data Grid サーバーがセキュリティーレルムに使用するデフォルトの SASL 認証メカニズムを上書きするように、Hot Rod コネクター認証を明示的に設定します。

手順

  1. Hot Rod コネクター設定に authentication 定義を追加します。
  2. Hot Rod コネクターが認証に使用する Data Grid セキュリティーレルムを指定します。
  3. 使用する Hot Rod エンドポイントの SASL 認証メカニズムを指定します。
  4. 必要に応じて SASL 認証プロパティーを設定します。

4.3.2.1. Hot Rod 認証設定

SCRAM、DIGEST、および PLAIN 認証を使用した Hot Rod コネクター

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0
           https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default"> 1
   <hotrod-connector name="hotrod">
      <authentication>
         <sasl mechanisms="SCRAM-SHA-512 SCRAM-SHA-384 SCRAM-SHA-256 2
                           SCRAM-SHA-1 DIGEST-SHA-512 DIGEST-SHA-384
                           DIGEST-SHA-256 DIGEST-SHA DIGEST-MD5 PLAIN"
               server-name="infinispan" 3
               qop="auth"/> 4
      </authentication>
   </hotrod-connector>
</endpoints>

1
default という名前のセキュリティーレルムに対する認証を有効にします。
2
認証に使用する SASL メカニズムを指定します。
3
Data Grid Server がクライアントに宣言する名前を定義します。サーバー名は、クライアント設定と一致する必要があります。
4
auth QoP を有効にします。

Kerberos 認証を使用した Hot Rod コネクター

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default">
   <hotrod-connector name="hotrod">
      <authentication>
         <sasl mechanisms="GSSAPI GS2-KRB5" 1
               server-name="datagrid" 2
               server-principal="hotrod/datagrid@INFINISPAN.ORG"/> 3
      </authentication>
   </hotrod-connector>
</endpoints>

1
Kerberos 認証に GSSAPI および GS2-KRB5 メカニズムを有効にします。
2
Data Grid サーバー名を定義します。これは Kerberos サービス名と同じです。
3
サーバーの Kerberos アイデンティティーを指定します。

4.3.2.2. Hot Rod エンドポイント認証メカニズム

Data Grid は、Hot Rod コネクターを使用して以下の SASL 認証メカニズムをサポートします。

認証メカニズム説明関連する詳細

PLAIN

プレーンテキスト形式の認証情報を使用します。PLAIN 認証は、暗号化された接続でのみ使用する必要があります。

Basic HTTP メカニズムに似ています。

DIGEST-*

ハッシュアルゴリズムとナンス値を使用します。ホットロッドコネクターは、強度の順に、DIGEST-MD5DIGEST-SHADIGEST-SHA-256DIGEST-SHA-384、および DIGEST-SHA-512 ハッシュアルゴリズムをサポートします。

Digest HTTP メカニズムに似ています。

SCRAM-*

ハッシュアルゴリズムとナンス値に加えてソルト値を使用します。ホットロッドコネクターは、SCRAM-SHASCRAM-SHA-256SCRAM-SHA-384、および SCRAM-SHA-512 ハッシュアルゴリズムを強度順にサポートします。

Digest HTTP メカニズムに似ています。

GSSAPI

Kerberos チケットを使用し、Kerberos ドメインコントローラーが必要です。対応する Kerberos サーバー ID をレルム設定に追加する必要があります。ほとんどの場合、ユーザーメンバーシップ情報を提供するために ldap-realm も指定します。

SPNEGO HTTP メカニズムに似ています。

GS2-KRB5

Kerberos チケットを使用し、Kerberos ドメインコントローラーが必要です。対応する Kerberos サーバー ID をレルム設定に追加する必要があります。ほとんどの場合、ユーザーメンバーシップ情報を提供するために ldap-realm も指定します。

SPNEGO HTTP メカニズムに似ています。

EXTERNAL

クライアント証明書を使用します。

CLIENT_CERTHTTP メカニズムに似ています。

OAUTHBEARER

OAuth トークンを使用し、token-realm 設定が必要です。

BEARER_TOKEN HTTP メカニズムに似ています。

4.3.2.3. SASL Quality of Protection (QoP)

SASL メカニズムが整合性とプライバシー保護設定に対応している場合は、qop 属性を使用して Hot Rod コネクター設定に追加することができます。

QoP 設定説明

auth

認証のみ。

auth-int

整合性保護による認証。

auth-conf

整合性とプライバシー保護による認証。

4.3.2.4. SASL ポリシー

SASL ポリシーを使用すると、Hot Rod コネクターが使用できる認証メカニズムを制御できます。

ポリシー説明デフォルト値

forward-secrecy

セッション間の forward secrecy をサポートする SASL メカニズムのみを使用します。これは、1 つのセッションに分割しても、将来のセッションに分割するための情報が自動的に提供されないことを意味します。

false

pass-credentials

クライアント認証情報が必要な SASL メカニズムのみを使用してください。

false

no-plain-text

単純な受動的攻撃の影響を受けやすい SASL メカニズムは使用しないでください。

false

no-active

アクティブな非辞書攻撃の影響を受けやすい SASL メカニズムは使用しないでください。

false

no-dictionary

受動的な辞書攻撃の影響を受けやすい SASL メカニズムは使用しないでください。

false

no-anonymous

匿名ログインを許可する SASL メカニズムは使用しないでください。

true

ヒント

Data Grid のキャッシュ承認では、ロールおよびパーミッションに基づいてキャッシュへのアクセスを制限します。キャッシュ承認を設定する場合は、<no-anonymous value=false /> を設定して匿名ログインを許可し、アクセスロジックをキャッシュ承認に委任できます。

SASL ポリシー設定の Hot Rod コネクター

<hotrod-connector socket-binding="hotrod" cache-container="default">
   <authentication security-realm="ApplicationRealm">
      <sasl server-name="myhotrodserver"
            mechanisms="PLAIN DIGEST-MD5 GSSAPI EXTERNAL" 1
            qop="auth">
         <policy> 2
            <no-active value="true" />
            <no-anonymous value="true" />
            <no-plain-text value="true" />
         </policy>
      </sasl>
   </authentication>
</hotrod-connector>

1
Hotgitops コネクターの複数の SASL 認証メカニズムを指定します。
2
SASL メカニズムのポリシーを定義します。

前述の設定により、Hot Rod コネクターは GSSAPI メカニズムを使用します。これは、すべてのポリシーに準拠する唯一のメカニズムであるためです。

4.3.3. REST 認証の手動設定

Data Grid サーバーがセキュリティーレルムに使用するデフォルトの HTTP 認証メカニズムを上書きするように、REST コネクター認証を明示的に設定します。

手順

  1. REST コネクター設定に authentication 定義を追加します。
  2. REST コネクターが認証に使用する Data Grid セキュリティーレルムを指定します。
  3. 使用する REST エンドポイントの認証メカニズムを指定します。

4.3.3.1. REST 認証設定

BASIC および DIGEST 認証による REST コネクター

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default"> 1
   <rest-connector name="rest">
      <authentication mechanisms="DIGEST BASIC"/> 2
   </rest-connector>
</endpoints>

1
default という名前のセキュリティーレルムに対する認証を有効にします。
2
認証に使用する SASL メカニズムを指定します。

Kerberos 認証による REST コネクター

<endpoints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd"
           xmlns="urn:infinispan:server:11.0"
           socket-binding="default" security-realm="default">
   <rest-connector name="rest">
      <authentication mechanisms="SPNEGO" 1
                      server-principal="HTTP/localhost@INFINISPAN.ORG"/> 2
   </rest-connector>
</endpoints>

1
Kerberos 認証の SPENGO メカニズムを有効にします。
2
サーバーの Kerberos アイデンティティーを指定します。

4.3.3.2. REST エンドポイント認証メカニズム

Data Grid は、REST コネクターを使用して以下の認証メカニズムをサポートします。

認証メカニズム説明関連する詳細

BASIC

プレーンテキスト形式の認証情報を使用します。暗号化された接続でのみ BASIC 認証を使用する必要があります。

HTTP Basic HTTP 認証方式に対応し、PLAIN SASL メカニズムと同様です。

DIGEST

ハッシュアルゴリズムとナンス値を使用します。REST コネクターは、SHA-512SHA-256、および MD5 ハッシュアルゴリズムをサポートします。

Digest HTTP 認証スキームに対応し、DIGEST-* SASL メカニズムに似ています。

SPNEGO

Kerberos チケットを使用し、Kerberos ドメインコントローラーが必要です。対応する Kerberos サーバー ID をレルム設定に追加する必要があります。ほとんどの場合、ユーザーメンバーシップ情報を提供するために ldap-realm も指定します。

Negotiate HTTP 認証スキームに対応し、GSSAPI および GS2-KRB5SASL メカニズムに類似しています。

BEARER_TOKEN

OAuth トークンを使用し、token-realm 設定が必要です。

Bearer HTTP 認証スキームに対応し、OAUTHBEARERSASL メカニズムに似ています。

CLIENT_CERT

クライアント証明書を使用します。

EXTERNAL SASL メカニズムに似ています。

4.4. Data Grid Server 認証の無効化

ローカル開発環境または分離されたネットワークでは、認証されていないクライアント要求を許可するように Data Grid Server を設定できます。

手順

  1. endpoints 設定から security-realm 属性を削除します。
  2. Hot Rod および REST コネクターに authentication 定義が含まれていないことを確認します。

たとえば、以下の設定では、Data Grid への認証されていないアクセスが許可されます。

<endpoints socket-binding="default">
  <hotrod-connector name="hotrod"/>
  <rest-connector name="rest"/>
</endpoints>

4.5. Data Grid 承認の設定

承認は、Data Grid で操作を実行する権限とデータにアクセスする権限を制限するものです。管理者は、さまざまなパーミッションレベルを持つロールをユーザーに割り当てます。

4.5.1. Data Grid 承認

Data Grid を使用すると、キャッシュマネージャーとキャッシュインスタンスをセキュリティー保護するための承認を設定できます。ユーザーアプリケーションまたはクライアントが、セキュリティー保護されたキャッシュマネージャーおよびキャッシュに対して操作を実行しようとする場合、その操作を実行するための十分なパーミッションを持つロールをアイデンティティーに提供する必要があります。

たとえば、特定のキャッシュインスタンスで承認を設定して、Cache.get() を呼び出すには、読み取り権限を持つロールをアイデンティティーに割り当てる必要があり、Cache.put() を呼び出すには書き込み権限を持つロールが必要になるようにします。

このシナリオでは、reader ロールが割り当てられたユーザーアプリケーションまたはクライアントがエントリーの書き込みを試みると、Data Grid はリクエストを拒否し、セキュリティー例外を出力します。writer ロールのあるユーザーアプリケーションまたはクライアントが書き込みリクエストを送信する場合、Data Grid は承認を検証し、後続の操作のためにトークンを発行します。

アイデンティティーからロールへのマッピング

アイデンティティーは java.security.Principal タイプのセキュリティープリンシパルです。javax.security.auth.Subject クラスで実装されたサブジェクトは、セキュリティープリンシパルのグループを表します。つまり、サブジェクトはユーザーとそれが属するすべてのグループを表します。

Data Grid はロールマッパーを使用して、セキュリティープリンシパルと、1 つ以上のパーミッションを表すロールを対応付けます。

次の図は、セキュリティープリンシパルがどのようにロールにマッピングされるかを示しています。

4.5.1.1. パーミッション

パーミッションは、実行できるアクションを制限することによって、キャッシュマネージャーとキャッシュへのアクセスを制御します。パーミッションは、名前付きキャッシュなどの特定のエンティティーに適用することもできます。

表4.1 キャッシュマネージャーのアクセス許可

パーミッション機能説明

設定

defineConfiguration

新しいキャッシュ設定を定義します。

LISTEN

addListener

キャッシュマネージャーに対してリスナーを登録します。

ライフサイクル

stop

キャッシュマネージャーを停止します。

ALL

-

すべてのキャッシュマネージャーのアクセス許可が含まれます。

表4.2 キャッシュ権限

パーミッション機能説明

READ

get, contains

キャッシュからエントリーを取得します。

WRITE

put, putIfAbsent, replace, remove, evict

キャッシュ内のデータの書き込み、置換、削除、エビクト。

EXEC

distexec, streams

キャッシュに対するコードの実行を許可します。

LISTEN

addListener

キャッシュに対してリスナーを登録します。

BULK_READ

keySet, values, entrySet, query

一括取得操作を実行します。

BULK_WRITE

clear, putAll

一括書き込み操作を実行します。

ライフサイクル

start, stop

キャッシュを開始および停止します。

ADMIN

getVersion, addInterceptor*, removeInterceptor, getInterceptorChain, getEvictionManager, getComponentRegistry, getDistributionManager, getAuthorizationManager, evict, getRpcManager, getCacheConfiguration, getCacheManager, getInvocationContextContainer, setAvailability, getDataContainer, getStats, getXAResource

基盤となるコンポーネントと内部構造へのアクセスを許可します。

ALL

-

すべてのキャッシュパーミッションが含まれます。

ALL_READ

-

READ パーミッションと BULK_READ パーミッションを組み合わせます。

ALL_WRITE

-

WRITE パーミッションと BULK_WRITE パーミッションを組み合わせます。

パーミッションの組み合わせ

使いやすいようにパーミッションを組み合わせることが必要になる場合があります。たとえば、"supervisors" にはストリーム操作の実行を許可し、"standard" ユーザーについては puts と gets しか実行できないように制限するには、次のマッピングを定義できます。

<role name="standard" permission="READ WRITE" />
<role name="supervisors" permission="READ WRITE EXEC BULK"/>

4.5.1.2. ロールマッパー

Data Grid には、サブジェクトのセキュリティープリンシパルを承認ロールにマッピングする PrincipalRoleMapper API が含まれています。デフォルトで使用できるロールマッパーが 2 つあります。

IdentityRoleMapper

ロール名としてプリンシパル名を使用します。

  • Java クラス: org.infinispan.security.mappers.IdentityRoleMapper
  • 宣言型設定: <identity-role-mapper />
CommonNameRoleMapper

プリンシパル名が識別名 (DN) の場合は、共通名 (CN) をロール名として使用します。たとえば 、cn=managers,ou=people,dc=example,dc=com DN は managers ロールにマッピングされます。

  • Java クラス: org.infinispan.security.mappers.CommonRoleMapper
  • 宣言型設定: <common-name-role-mapper />

org.infinispan.security.PrincipalRoleMapper インターフェイスを実装するカスタムロールマッパーを使用することもできます。カスタムロールマッパーを宣言的に設定するには、<custom-role-mapper class="my.custom.RoleMapper"/> を使用します。

4.5.2. 宣言的な承認の設定

infinispan.xml ファイルで承認を設定します。

手順

  1. cache-container でロールマッパーを指定するグローバル承認を設定し、ロールとパーミッションのセットを定義します。
  2. ユーザーロールに基づいてアクセスを制限するようにキャッシュの承認を設定します。

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization> 1
                <identity-role-mapper /> 2
                <role name="admin" permissions="ALL" /> 3
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization/> 4
             </security>
          </local-cache>
       </cache-container>
    </infinispan>
    1
    Cache Manager の Data Grid 承認を有効にします。
    2
    ロールにプリンシパルをマップ PrincipalRoleMapper の実装を指定します。
    3
    ロールとその関連付けられたパーミッションを定義します。
    4
    暗黙的に、グローバル設定からすべてのロールを追加します。

    すべてのロールをキャッシュに適用しない場合は、以下のようにキャッシュに承認されたロールを明示的に定義します。

    <infinispan>
       <cache-container default-cache="secured" name="secured">
          <security>
             <authorization>
                <identity-role-mapper />
                <role name="admin" permissions="ALL" />
                <role name="reader" permissions="READ" />
                <role name="writer" permissions="WRITE" />
                <role name="supervisor" permissions="READ WRITE EXEC"/>
             </authorization>
          </security>
          <local-cache name="secured">
             <security>
                <authorization roles="admin supervisor reader"/> 1
             </security>
          </local-cache>
       </cache-container>
    
    </infinispan>
    1
    キャッシュに承認されたロールを定義します。この例では、writer ロールのみを持つユーザーは "secured" キャッシュには許可されていません。Data Grid は、これらのユーザーからのアクセス要求を拒否します。

第5章 Setting Up Data Grid Clusters

Data Grid には、ノードがクラスターに自動的に参加および離脱できるように、トランスポート層が必要です。また、トランスポート層により、Data Grid ノードはネットワーク上でデータを複製または分散し、リバランスや状態遷移などの操作を実施することができます。

5.1. デフォルトスタックの使用開始

Data Grid は JGroups プロトコルスタックを使用するため、ノードは専用のクラスターチャネルに相互に送信できるようにします。

Data Grid は、UDP プロトコルおよび TCP プロトコルに事前設定された JGroups スタックを提供します。これらのデフォルトスタックは、ネットワーク要件向けに最適化されたカスタムクラスタートランスポート設定を構築する際の開始点として使用することができます。

手順

  1. infinispan-core-11.0.9.Final-redhat-00001.jar ファイル内の default-configs ディレクトリーで、デフォルトの JGroups スタック default-jgroups-*.xml を見つけます。

    jar ファイルは $RHDG_HOME/lib ディレクトリーにあります。

  2. 次のいずれかを行います。

    • infinispan.xml ファイルの stack 属性を使用します。

      <infinispan>
        <cache-container default-cache="replicatedCache">
          <transport cluster="${infinispan.cluster.name}"
                     stack="udp" 1
                     node-name="${infinispan.node.name:}"/>
        </cache-container>
      </infinispan>
      1
      クラスタートランスポートには default-jgroups-udp.xml を使用します。
    • サーバーを起動するときに、cluster-stack 引数を使用します。

      $ bin/server.sh --cluster-stack=udp

Data Grid は、以下のメッセージをログに記録して、使用するスタックを示します。

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack udp

参照資料

5.1.1. デフォルトの JGroups スタック

クラスタートランスポートを設定するデフォルトの JGroups スタックについて説明します。

File nameスタック名説明

default-jgroups-udp.xml

udp

トランスポートに UDP を使用し、検出に UDP マルチキャストを使用します。(100 ノードを超える) 大規模なクラスター、またはレプリケートされたキャッシュまたは無効化モードを使用している場合に適しています。オープンソケットの数を最小限に抑えます。

default-jgroups-tcp.xml

tcp

トランスポートには TCP を使用し、検出には UDP マルチキャストを使用する MPING プロトコルを使用します。TCP はポイントツーポイントプロトコルとして UDP よりも効率的であるため、分散キャッシュを使用している場合にのみ、小規模なクラスター (100 ノード未満) に適しています。

default-jgroups-ec2.xml

ec2

トランスポートに TCP を使用し、検出に S3_PING を使用します。UDP マルチキャストが利用できない Amazon EC2 ノードに適しています。

default-jgroups-kubernetes.xml

kubernetes

トランスポートに TCP を使用し、検出に DNS_PING を使用します。UDP マルチキャストが常に利用できるとは限らない Kubernetes および Red Hat OpenShift ノードに適しています。

default-jgroups-google.xml

google

トランスポートに TCP を使用し、検出に GOOGLE_PING2 を使用します。UDP マルチキャストが利用できない Google Cloud Platform ノードに適しています。

default-jgroups-azure.xml

azure

トランスポートに TCP を使用し、検出に AZURE_PING を使用します。UDP マルチキャストが利用できない Microsoft Azure ノードに適しています。

5.1.2. クラスタートラフィックの TCP および UDP ポート

Data Grid は、クラスタートランスポートメッセージに以下のポートを使用します。

デフォルトのポートプロトコル説明

7800

TCP/UDP

JGroups クラスターバインドポート

46655

UDP

JGroups マルチキャスト

クロスサイトレプリケーション

Data Grid は、JGroups RELAY2 プロトコルに以下のポートを使用します。

7900
OpenShift で実行している Data Grid クラスターの向け。
7800
ノード間のトラフィックに UDP を使用し、クラスター間のトラフィックに TCP を使用する場合。
7801
ノード間のトラフィックに TCP を使用し、クラスター間のトラフィックに TCP を使用する場合。

5.2. JGroups スタックのカスタマイズ

プロパティーを調整してチューニングし、ネットワーク要件に対応するクラスタートランスポート設定を作成します。

Data Grid は、設定を容易にするためにデフォルトの JGroups スタックを拡張する属性を提供します。他のプロパティーを組み合わせてデフォルトスタックからプロパティーの継承、削除、置き換えを行うことができます。

手順

  1. infinispan.xml ファイルに新しい JGroups スタック宣言を作成します。

    <infinispan>
      <jgroups>
        <stack name="my-stack"> 1
        </stack>
      </jgroups>
    </infinispan>
    1
    "my-stack" という名前のカスタム JGroups スタックを作成します。
  2. extends 属性を追加し、プロパティーを継承する JGroups スタックを指定します。

    <infinispan>
      <jgroups>
        <stack name="my-stack" extends="tcp"> 1
        </stack>
      </jgroups>
    </infinispan>
    1
    デフォルトの TCP スタックから継承します。
  3. stack.combine 属性を使用して、継承されたスタックに設定されたプロトコルのプロパティーを変更します。
  4. stack.position 属性を使用して、カスタムスタックの場所を定義します。

    たとえば、以下のようにデフォルトの TCP スタックで Gosssip ルーターと対称暗号化を使用して評価できます。

    <jgroups>
      <stack name="my-stack" extends="tcp">
        <TCPGOSSIP initial_hosts="${jgroups.tunnel.gossip_router_hosts:localhost[12001]}"
                 stack.combine="REPLACE"
                 stack.position="MPING" /> 1
        <FD_SOCK stack.combine="REMOVE"/> 2
        <VERIFY_SUSPECT timeout="2000"/> 3
        <SYM_ENCRYPT sym_algorithm="AES"
                     keystore_name="mykeystore.p12"
                     keystore_type="PKCS12"
                     store_password="changeit"
                     key_password="changeit"
                     alias="myKey"
                     stack.combine="INSERT_AFTER"
                     stack.position="VERIFY_SUSPECT" /> 4
      </stack>
    </jgroups>
    1
    MPING の代わりに TCPGOSSIP プロトコルを検出メカニズムとして使用します。
    2
    FD_SOCK プロトコルをスタックから削除します。
    3
    VERIFY_SUSPECT プロトコルのタイムアウト値を変更します。
    4
    SYM_ENCRYPT プロトコルをスタックの VERIFY_SUSPECT プロトコルの後に追加します。
  5. スタック名を transport 設定の stack 属性の値として指定します。

    <infinispan>
      <jgroups>
        <stack name="my-stack" extends="tcp">
         ...
        </stack>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="my-stack" 1
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
      </jgroups>
    </infinispan>
    1
    クラスタートランスポートに "my-stack" を使用するように Data Grid を設定します。
  6. Data Grid ログをチェックして、スタックを使用していることを確認します。

    [org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack my-stack

参照資料

5.2.1. 継承属性

JGroups スタックを拡張すると、継承属性により、拡張しているスタックでプロトコルやプロパティーを調整できます。

  • stack.position は、変更するプロトコルを指定します。
  • stack.combine は、次の値を使用して JGroups スタックを拡張します。

    説明

    COMBINE

    プロトコルプロパティーをオーバーライドします。

    REPLACE

    プロトコルを置き換えます。

    INSERT_AFTER

    別のプロトコルの後にプロトコルをスタックに追加します。挿入ポイントとして指定するプロトコルには影響しません。

    JGroups スタックのプロトコルは、スタック内の場所を基にして相互に影響します。NAKACK2 がセキュリティーで保護されるように、たとえば、SYM_ENCRYPT プロトコルまたは ASYM_ENCRYPT プロトコル後に NAKACK2 などのプロトコルを置く必要があります。

    REMOVE

    スタックからプロトコルを削除します。

5.3. JGroups システムプロパティーの使用

起動時にシステムプロパティーを Data Grid に渡して、クラスターのトランスポートを調整します。

手順

  • -D<property-name>=<property-value> 引数を使用して JGroups システムプロパティーを必要に応じて設定します。

たとえば、以下のようにカスタムバインドポートと IP アドレスを設定します。

$ bin/server.sh -Djgroups.bind.port=1234 -Djgroups.bind.address=192.0.2.0

5.3.1. JGroups スタックのシステムプロパティー

JGroups クラスタートランスポートスタックを設定するシステムプロパティーを設定します。

システムプロパティー説明Default Value必須/オプション

jgroups.bind.address

クラスタートランスポートのバインドアドレス。

SITE_LOCAL

オプション

jgroups.bind.port

ソケットのバインドポート。

7800

オプション

jgroups.mcast_addr

マルチキャストの IP アドレス (検出およびクラスター間の通信の両方)。IP アドレスは、IP マルチキャストに適した有効なクラス D アドレスである必要があります。

228.6.7.8

オプション

jgroups.mcast_port

マルチキャストソケットのポート。

46655

オプション

jgroups.ip_ttl

IP マルチキャストパケットの Time-to-live (TTL)この値は、パケットが破棄される前にパケットが作成できるネットワークホップの数を定義します。

2

オプション

jgroups.thread_pool.min_threads

スレッドプールの最小スレッド数

0

オプション

jgroups.thread_pool.max_threads

スレッドプールの最大スレッド数

200

オプション

jgroups.join_timeout

結合リクエストが正常に実行されるまで待機する最大時間 (ミリ秒単位)。

2000

オプション

jgroups.thread_dumps_threshold

スレッドダンプがログに記録される前にスレッドプールが満杯である必要がある回数。

10000

オプション

Amazon EC3

以下のシステムプロパティーは default-jgroups-ec2.xml のみに適用されます。

システムプロパティー説明Default Value必須/オプション

jgroups.s3.access_key

S3 バケットの Amazon S3 アクセスキー。

デフォルト値はありません。

オプション

jgroups.s3.secret_access_key

S3 バケットに使用される Amazon S3 シークレットキー。

デフォルト値はありません。

オプション

jgroups.s3.bucket

Amazon S3 バケットの名前。名前は存在し、一意でなければなりません。

デフォルト値はありません。

オプション

Kubernetes

以下のシステムプロパティーは default-jgroups-kubernetes.xml のみに適用されます。

システムプロパティー説明Default Value必須/オプション

jgroups.dns.query

クラスターメンバーを返す DNS レコードを設定します。

デフォルト値はありません。

必須

Google Cloud Platform

以下のシステムプロパティーは default-jgroups-google.xml のみに適用されます。

システムプロパティー説明Default Value必須/オプション

jgroups.google.bucket_name

Google Compute Engine バケットの名前。名前は存在し、一意でなければなりません。

デフォルト値はありません。

必須

5.4. インライン JGroups スタックの使用

完全な JGroups スタックの定義を infinispan.xml ファイルに挿入することができます。

手順

  • カスタム JGroups スタック宣言を infinispan.xml ファイルに埋め込みます。

    <infinispan>
      <jgroups> 1
        <stack name="prod"> 2
          <TCP bind_port="7800" port_range="30" recv_buf_size="20000000" send_buf_size="640000"/>
          <MPING bind_addr="127.0.0.1" break_on_coord_rsp="true"
                 mcast_addr="${jgroups.mping.mcast_addr:228.2.4.6}"
                 mcast_port="${jgroups.mping.mcast_port:43366}"
                 num_discovery_runs="3"
                 ip_ttl="${jgroups.udp.ip_ttl:2}"/>
          <MERGE3 />
          <FD_SOCK />
          <FD_ALL timeout="3000" interval="1000" timeout_check_interval="1000" />
          <VERIFY_SUSPECT timeout="1000" />
          <pbcast.NAKACK2 use_mcast_xmit="false" xmit_interval="100" xmit_table_num_rows="50"
                          xmit_table_msgs_per_row="1024" xmit_table_max_compaction_time="30000" />
          <UNICAST3 xmit_interval="100" xmit_table_num_rows="50" xmit_table_msgs_per_row="1024"
                    xmit_table_max_compaction_time="30000" />
          <pbcast.STABLE stability_delay="200" desired_avg_gossip="2000" max_bytes="1M" />
          <pbcast.GMS print_local_addr="false" join_timeout="${jgroups.join_timeout:2000}" />
          <UFC max_credits="4m" min_threshold="0.40" />
          <MFC max_credits="4m" min_threshold="0.40" />
          <FRAG3 />
        </stack>
      </jgroups>
      <cache-container default-cache="replicatedCache">
        <transport stack="prod" /> 3
        ...
      </cache-container>
    </infinispan>
    1
    1 つ以上の JGroups スタック定義を含みます。
    2
    "prod" という名前のカスタム JGroups スタックを定義します。
    3
    クラスタートランスポートに "prod" を使用するように Data Grid を設定します。

5.5. 外部 JGroups スタックの使用

infinispan.xml ファイルでカスタム JGroups スタックを定義する外部ファイルを参照します。

手順

  1. カスタム JGroups スタックファイルを $RHDG_HOME/server/conf ディレクトリーに追加します。

    または、外部スタックファイルを宣言する際に絶対パスを指定することもできます。

  2. stack-file 要素を使用して、外部スタックファイルを参照します。

    <infinispan>
      <jgroups>
         <stack-file name="prod-tcp" path="prod-jgroups-tcp.xml"/> 1
      </jgroups>
      <cache-container default-cache="replicatedCache">
        <transport stack="prod-tcp" /> 2
        <replicated-cache name="replicatedCache"/>
      </cache-container>
      ...
    </infinispan>
    1
    "prod-jgroups-tcp.xml" 定義を使用する "prod-tcp" という名前のスタックを作成します。
    2
    クラスタートランスポートに "prod-tcp" を使用するように Data Grid を設定します。

5.6. クラスター検出プロトコル

Data Grid は、ノードがネットワーク上でお互いを自動的に見つけてクラスターを形成できるようにするさまざまなプロトコルをサポートしています。

Data Grid が使用できる 2 種類の検出メカニズムがあります。

  • ほとんどのネットワークで機能する汎用検出プロトコルで、外部サービスに依存しません。
  • Data Grid クラスターのトポロジー情報を保存し、取得するために外部サービスに依存する検出プロトコル。
    たとえば、DNS_PING プロトコルは DNS サーバーレコードで検出を実行します。
注記

ホスト型プラットフォームで Data Grid を実行するには、個別のクラウドプロバイダーが課すネットワーク制約に適合する検出メカニズムを使用する必要があります。

参照資料

5.6.1. PING

PING または UDPPING は、UDP プロトコルで動的なマルチキャストを使用する一般的な JGroups 検出メカニズムです。

結合時に、ノードは IP マルチキャストアドレスに PING 要求を送信し、Data Grid クラスターにある他のノードを検出します。各ノードは、コーディネーターノードのアドレスとその独自のアドレスが含まれるパケットで PING リクエストに応答します。C はコーディネーターのアドレスで、A は自分のアドレスです。ノードが PING 要求に応答すると、結合ノードは新しいクラスターのコーディネーターノードになります。

PING 設定の例

<config>
  <PING num_discovery_runs="3"/>
  ...
</config>

参照

5.6.2. TCPPING

TCPPING は、クラスターメンバーの静的アドレスリストを使用する汎用 JGroups 検索メカニズムです。

TCPPING を使用すると、ノードが相互に動的に検出できるようにするのではなく、JGroups スタックの一部として Data Grid クラスター内の各ノードの IP アドレスまたはホスト名を手動で指定します。

TCPPING 設定の例

<config>
  <TCP bind_port="7800" />
  <TCPPING timeout="3000"
           initial_hosts="${jgroups.tcpping.initial_hosts:hostname1[port1],hostname2[port2]}"
          port_range="0" 1
          num_initial_members="3"/>
  ...
</config>

1
信頼性の高い検出のために、Red Hat は port-range=0 を推奨します。

5.6.3. MPING

MPING は IP マルチキャストを使用して Data Grid クラスターの初期メンバーシップを検出します。

MPING を使用して TCPPING 検出を TCP スタックに置き換え、初期ホストの静的リストの代わりに、検出にマルチキャストを使用できます。ただし、UDP スタックで MPING を使用することもできます。

MPING 設定の例

<config>
  <MPING mcast_addr="${jgroups.mcast_addr:228.6.7.8}"
         mcast_port="${jgroups.mcast_port:46655}"
         num_discovery_runs="3"
         ip_ttl="${jgroups.udp.ip_ttl:2}"/>
  ...
</config>

5.6.4. TCPGOSSIP

gossip ルーターは、Data Grid クラスターが他のノードのアドレスを取得できるネットワーク上の集中的な場所を提供します。

以下のように、Gosssip ルーターのアドレス (IP:PORT) を Data Grid ノードに挿入します。

  1. このアドレスをシステムプロパティーとして JVM に渡します (例: -DGossipRouterAddress="10.10.2.4[12001]")。
  2. JGroups 設定ファイルのそのシステムプロパティーを参照します。

Gossip ルーター設定の例

<config>
  <TCP bind_port="7800" />
  <TCPGOSSIP timeout="3000"
             initial_hosts="${GossipRouterAddress}"
             num_initial_members="3" />
  ...
</config>

5.6.5. JDBC_PING

JDBC_PING は共有データベースを使用して Data Grid クラスターに関する情報を保存します。このプロトコルは、JDBC 接続を使用できるすべてのデータベースをサポートします。

ノードは IP アドレスを共有データベースに書き込むため、ノードに結合してネットワーク上の Data Grid クラスターを検索できます。ノードが Data Grid クラスターのままにすると、共有データベースから IP アドレスを削除します。

JDBC_PING 設定の例

<config>
  <JDBC_PING connection_url="jdbc:mysql://localhost:3306/database_name"
             connection_username="user"
             connection_password="password"
             connection_driver="com.mysql.jdbc.Driver"/>
  ...
</config>

重要

適切な JDBC ドライバーをクラスパスに追加して、Data Grid が JDBC_PING を使用できるようにします。

5.6.6. DNS_PING

JGroups DNS_PING は DNS サーバーをクエリーし、OKD や Red Hat OpenShift などの Kubernetes 環境で Data Grid クラスターメンバーを検出します。

DNS_PING 設定の例

<config>
  <dns.DNS_PING dns_query="myservice.myproject.svc.cluster.local" />
  ...
</config>

参照

5.7. クラスタートランスポートの暗号化

ノードが暗号化されたメッセージと通信できるように、クラスタートランスポートを保護します。また、有効なアイデンティティーを持つノードのみが参加できるように、証明書認証を実行するように Data Grid クラスターを設定することもできます。

5.7.1. Data Grid クラスターのセキュリティー

クラスタートラフィックのセキュリティーを保護するには、Data Grid ノードを設定し、シークレットキーで JGroups メッセージペイロードを暗号化します。

Data Grid ノードは、以下のいずれかから秘密鍵を取得できます。

  • コーディネーターノード (非対称暗号化)
  • 共有キーストア (対称暗号化)

コーディネーターノードからの秘密鍵の取得

非対称暗号化は、Data Grid 設定の JGroups スタックに ASYM_ENCRYPT プロトコルを追加して対称暗号化を設定します。これにより、Data Grid クラスターはシークレットキーを生成して配布できます。

重要

非対称暗号化を使用する場合は、ノードが証明書認証を実行し、シークレットキーを安全に交換できるようにキーストアを提供する必要もあります。これにより、中間者 (MitM) 攻撃からクラスターが保護されます。

非対称暗号化は、以下のようにクラスタートラフィックのセキュリティーを保護します。

  1. Data Grid クラスターの最初のノードであるコーディネーターノードは、秘密鍵を生成します。
  2. 参加ノードは、コーディネーターとの証明書認証を実行して、相互に ID を検証します。
  3. 参加ノードは、コーディネーターノードに秘密鍵を要求します。その要求には、参加ノードの公開鍵が含まれています。
  4. コーディネーターノードは、秘密鍵を公開鍵で暗号化し、参加ノードに返します。
  5. 参加ノードは秘密鍵を復号してインストールします。
  6. ノードはクラスターに参加し、秘密鍵でメッセージを暗号化および復号化します。

共有キーストアからの秘密鍵の取得

対称暗号化は、Data Grid 設定の JGroups スタックに SYM_ENCRYPT プロトコルを追加して対称暗号化を設定します。これにより、Data Grid クラスターは、指定したキーストアから秘密鍵を取得できます。

  1. ノードは、起動時に Data Grid クラスパスのキーストアから秘密鍵をインストールします。
  2. ノードはクラスターに参加し、秘密鍵でメッセージを暗号化および復号化します。

非対称暗号化と対称暗号化の比較

証明書認証を持つ ASYM_ENCRYPT は、SYM_ENCRYPT と比較して、暗号化の追加の層を提供します。秘密鍵のコーディネーターノードへのリクエストを暗号化するキーストアを提供します。Data Grid は、そのシークレットキーを自動的に生成し、クラスタートラフィックを処理し、秘密鍵の生成時に指定します。たとえば、ノードが離れる場合に新規のシークレットキーを生成するようにクラスターを設定できます。これにより、ノードが証明書認証を回避して古いキーで参加できなくなります。

一方、SYM_ENCRYPTASYM_ENCRYPT よりも高速です。ノードがクラスターコーディネーターとキーを交換する必要がないためです。SYM_ENCRYPT への潜在的な欠点は、クラスターのメンバーシップの変更時に新規シークレットキーを自動的に生成するための設定がないことです。ユーザーは、ノードがクラスタートラフィックを暗号化するのに使用するシークレットキーを生成して配布する必要があります。

5.7.2. 非対称暗号化を使用したクラスタートランスポートの設定

Data Grid クラスターを設定し、JGroups メッセージを暗号化するシークレットキーを生成して配布します。

手順

  1. Data Grid がノードの ID を検証できるようにする証明書チェーンでキーストアを作成します。
  2. クラスター内の各ノードのクラスパスにキーストアを配置します。

    Data Grid Server の場合は、$RHDG_HOME ディレクトリーにキーストアを配置します。

  3. 以下の例のように、SSL_KEY_EXCHANGE プロトコルおよび ASYM_ENCRYPT プロトコルを Data Grid 設定の JGroups スタックに追加します。

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 1
               <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks" 2
                                 keystore_password="changeit" 3
                                 stack.combine="INSERT_AFTER"
                                 stack.position="VERIFY_SUSPECT"/> 4
               <ASYM_ENCRYPT asym_keylength="2048" 5
                        asym_algorithm="RSA" 6
                        change_key_on_coord_leave = "false" 7
                        change_key_on_leave = "false" 8
                        use_external_key_exchange = "true" 9
                        stack.combine="INSERT_AFTER"
                        stack.position="SSL_KEY_EXCHANGE"/> 10
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 11
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    1
    Data Grid のデフォルト TCP スタックを拡張する "encrypt-tcp" という名前のセキュアな JGroups スタックを作成します。
    2
    ノードが証明書認証を実行するために使用するキーストアに名前を付けます。
    3
    キーストアのパスワードを指定します。
    4
    stack.combine 属性と stack.position 属性を使用して、デフォルトの TCP スタックの VERIFY_SUSPECT プロトコルの後に SSL_KEY_EXCHANGE を挿入します。
    5
    コーディネーターノードが生成する秘密鍵の長さを指定します。デフォルト値は 2048 です。
    6
    コーディネーターノードが秘密鍵の生成に使用する暗号化エンジンを指定します。デフォルト値は RSA です。
    7
    コーディネーターノードが変更されたときに新しい秘密鍵を生成して配布するように Data Grid を設定します。
    8
    ノードが離脱するときに新しい秘密鍵を生成して配布するように Data Grid を設定します。
    9
    証明書認証に SSL_KEY_EXCHANGE プロトコルを使用するように Data Grid ノードを設定します。
    10
    stack.combine 属性と stack.position 属性を使用して、デフォルトの TCP スタックの SSL_KEY_EXCHANGE プロトコルの後に ASYM_ENCRYPT を挿入します。
    11
    セキュアな JGroups スタックを使用するように Data Grid クラスターを設定します。

検証

Data Grid クラスターを起動した際、以下のログメッセージは、クラスターがセキュアな JGroups スタックを使用していることを示しています。

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>

Data Grid ノードは ASYM_ENCRYPT を使用している場合のみクラスターに参加でき、コーディネーターノードからシークレットキーを取得できます。それ以外の場合は、次のメッセージが Data Grid ログに書き込まれます。

[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it

参照資料

この手順の ASYM_ENCRYPT の設定例は、一般的に使用されるパラメーターを示しています。利用可能なパラメーターの完全なセットについては、JGroups のドキュメントを参照してください。

5.7.3. 対称暗号化を使用したクラスタートランスポートの設定

指定したキーストアからの秘密鍵を使用して JGroups メッセージを暗号化するように Data Grid クラスターを設定します。

手順

  1. シークレットキーが含まれるキーストアを作成します。
  2. クラスター内の各ノードのクラスパスにキーストアを配置します。

    Data Grid Server の場合は、$RHDG_HOME ディレクトリーにキーストアを配置します。

  3. 次の例のように、Data Grid 設定の JGroups スタックに SYM_ENCRYPT プロトコルを追加します。

    <infinispan>
        <jgroups>
             <stack name="encrypt-tcp" extends="tcp"> 1
               <SYM_ENCRYPT keystore_name="myKeystore.p12" 2
                            keystore_type="PKCS12" 3
                            store_password="changeit" 4
                            key_password="changeit" 5
                            alias="myKey" 6
                            stack.combine="INSERT_AFTER"
                            stack.position="VERIFY_SUSPECT"/> 7
             </stack>
        </jgroups>
        <cache-container name="default" statistics="true">
          <transport cluster="${infinispan.cluster.name}"
                     stack="encrypt-tcp" 8
                     node-name="${infinispan.node.name:}"/>
       </cache-container>
    </infinispan>
    1
    Data Grid のデフォルト TCP スタックを拡張する "encrypt-tcp" という名前のセキュアな JGroups スタックを作成します。
    2
    ノードが秘密鍵を取得するキーストアに名前を付けます。
    3
    キーストアのタイプを指定します。JGroups はデフォルトで JCEKS を使用します。
    4
    キーストアのパスワードを指定します。
    5
    秘密鍵のパスワードを指定します。
    6
    秘密鍵のエイリアスを指定します。
    7
    stack.combine 属性と stack.position 属性を使用して、デフォルトの TCP スタックの VERIFY_SUSPECT プロトコルの後に SYM_ENCRYPT を挿入します。
    8
    セキュアな JGroups スタックを使用するように Data Grid クラスターを設定します。

検証

Data Grid クラスターを起動した際、以下のログメッセージは、クラスターがセキュアな JGroups スタックを使用していることを示しています。

[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>

Data Grid ノードは、SYM_ENCRYPT を使用し、共有キーストアからシークレットキーを取得できる場合に限りクラスターに参加できます。それ以外の場合は、次のメッセージが Data Grid ログに書き込まれます。

[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it

参照資料

この手順の SYM_ENCRYPT の設定例は、一般的に使用されるパラメーターを示しています。利用可能なパラメーターの完全なセットについては、JGroups のドキュメントを参照してください。

第6章 Data Grid キャッシュのリモート作成

データを格納することができるように、Data Grid Server にキャッシュを追加します。

6.1. Data Grid Server でのキャッシュ設定

キャッシュは、Data Grid Server のデータコンテナーを設定します。

実行時にキャッシュを作成するには、コンソール、コマンドラインインターフェイス (CLI)、Hot Rod エンドポイント、または REST エンドポイントを介して org.infinispan テンプレートまたはデータグリッド設定に基づく定義を追加します。

重要

ランタイム時にキャッシュを作成する場合、Data Grid Server はクラスター全体でキャッシュ定義を複製します。

infinispan.xml で直接宣言した設定は、Data Grid クラスター全体で自動的に同期されません。この場合、Ansible や Chef などの設定管理ツールを使用して、設定がクラスター内のすべてのノードに伝播されるようにします。

6.2. デフォルトの Cache Manager

Data Grid Server は、デフォルトの Cache Manager 設定を提供します。Data Grid Server の起動時に、Cache Manager がインスタンス化されるため、実行時にキャッシュをリモートで作成できます。

デフォルトの Cache Manager

<cache-container name="default" 1
                 statistics="true"> 2
  <transport cluster="${infinispan.cluster.name:cluster}" 3
             stack="${infinispan.cluster.stack:tcp}" 4
             node-name="${infinispan.node.name:}"/> 5
</cache-container>

1
default という名前の Cache Manager を作成します。
2
metrics エンドポイントを介して Cache M anager の統計情報をエクスポートします。
3
Data Grid サーバーが自動的に相互のクラスターを検出し、フォームクラスターを検出できるようにする JGroups クラスタートランスポートを追加します。
4
クラスタートラフィックにデフォルトの TCP スタックを使用します。
5
ノードの個別の名前は、クラスター全体で一意である必要があります。デフォルトでは、統一されたホスト名を使用します。

Cache Manager の検証

Data Grid Server を起動し、ユーザーの認証情報を追加したら、以下のようにコマンドラインインターフェイス (CLI) または REST エンドポイントを使用して、デフォルトの Cache Manager にアクセスできます。

  • CLI: デフォルトのコンテナーで describe コマンドを使用します。

    [//containers/default]> describe
  • REST: 任意のブラウザーで <server_hostname>:11222/rest/v2/cache-managers/default/ に移動します。

6.3. Data Grid コンソールを使用したキャッシュの作成

Data Grid コンソールを介して、テンプレートまたは設定ファイルからキャッシュを動的に追加します。

前提条件

ユーザーを作成し、少なくとも 1 つの Data Grid サーバーインスタンスを開始している。

手順

  1. 任意のブラウザーで <server_hostname>:11222/console/ に移動します。
  2. コンソールにログインします。
  3. Data Container ビューを開きます。
  4. Create Cache を選択し、テンプレートから、または XML もしくは JSON 形式の Data Grid 設定でキャッシュを追加します。
  5. Data Container ビューに戻り、Data Grid キャッシュを確認します。

6.4. Data Grid コマンドラインインターフェイス (CLI) を使用したキャッシュの作成

Data Grid CLI を使用して、テンプレートから、または XML もしくは JSON 形式の設定ファイルでキャッシュを追加します。

前提条件

ユーザーを作成し、少なくとも 1 つの Data Grid サーバーインスタンスを開始している。

手順

  1. Data Grid への CLI 接続を作成します。
  2. create cache コマンドを使用して、キャッシュ定義を追加します。

    • --file オプションを使用して、XML または JSON ファイルからキャッシュ定義を追加します。

      [//containers/default]> create cache --file=configuration.xml mycache
    • --template オプションを使用して、テンプレートからキャッシュ定義を追加します。

      [//containers/default]> create cache --template=org.infinispan.DIST_SYNC mycache
      ヒント

      --template= 引数の後に Tab キーを押して、利用可能なキャッシュテンプレートをリスト表示します。

  3. ls コマンドを使用して、キャッシュが存在することを確認します。

    [//containers/default]> ls caches
    mycache
  4. describe コマンドを使用して、キャッシュ設定を取得します。

    [//containers/default]> describe caches/mycache

6.5. Hot Rod クライアントを使用したキャッシュの作成

RemoteCacheManager API を使用して、プログラムにより Data Grid Server 上にキャッシュを作成します。

注記

次の手順は、Hot Rod Java クライアントを使用した、プログラムによるキャッシュの作成を示しています。ただし、Hot Rod クライアントは、JavaScript や C++ などのさまざまな言語で利用できます。

前提条件

  • ユーザーを作成し、少なくとも 1 つの Data Grid サーバーインスタンスを開始している。
  • Hot Rod Java クライアントを入手している。

手順

  1. ConfigurationBuilder クラスを使用してクライアントを設定します。

    import org.infinispan.client.hotrod.RemoteCacheManager;
    import org.infinispan.client.hotrod.DefaultTemplate;
    import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
    import org.infinispan.commons.configuration.XMLStringConfiguration;
    ...
    
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.addServer()
             .host("127.0.0.1")
             .port(11222)
           .security().authentication()
              .enable()
              .username("username")
              .password("password")
              .realm("default")
              .saslMechanism("DIGEST-MD5");
    
    manager = new RemoteCacheManager(builder.build());
  2. XMLStringConfiguration クラスを使用して、XML 形式でキャッシュ定義を追加します。
  3. getOrCreateCache() メソッドを呼び出して、キャッシュがすでに存在する場合は追加し、存在しない場合は作成します。

    private void createCacheWithXMLConfiguration() {
        String cacheName = "CacheWithXMLConfiguration";
        String xml = String.format("<infinispan>" +
                                      "<cache-container>" +
                                      "<distributed-cache name=\"%s\" mode=\"SYNC\"
                                      statistics=\"true\">" +
                                        "<locking isolation=\"READ_COMMITTED\"/>" +
                                        "<transaction mode=\"NON_XA\"/>" +
                                        "<expiration lifespan=\"60000\" interval=\"20000\"/>" +
                                      "</distributed-cache>" +
                                      "</cache-container>" +
                                    "</infinispan>"
                                    , cacheName);
        manager.administration().getOrCreateCache(cacheName, new XMLStringConfiguration(xml));
        System.out.println("Cache created or already exists.");
    }
  4. 次の例のように、createCache() 呼び出しにより org.infinispan テンプレートを使用してキャッシュを作成します。

    private void createCacheWithTemplate() {
        manager.administration().createCache("myCache", "org.infinispan.DIST_SYNC");
        System.out.println("Cache created.");
    }

次のステップ

実際に動作するコード例をいくつか試すことで、Hot Rod Java クライアントを使用してリモートキャッシュを作成する方法を確認できます。Data Grid Tutorials を参照してください。

6.6. HTTP クライアントを使用した Data Grid キャッシュの作成

適切な HTTP クライアントを使用し、REST エンドポイントを介してキャッシュ定義を Data Grid サーバーに追加します。

前提条件

ユーザーを作成し、少なくとも 1 つの Data Grid サーバーインスタンスを開始している。

手順

  • /rest/v2/caches/$cacheName への POST 要求でキャッシュを作成します。

XML または JSON 設定をリクエストのペイロードに含めることにより、それを使用します。

POST /rest/v2/caches/mycache

?template= パラメーターを使用して、org.infinispan テンプレートからキャッシュを作成します。

POST /rest/v2/caches/mycache?template=org.infinispan.DIST_SYNC

6.7. Data Grid の設定

XML および JSON 形式の Data Grid 設定について説明します。

6.7.1. XML の設定

XML 形式の Data Grid 設定はスキーマに準拠し、以下を含める必要があります。

  • <infinispan> ルート要素。
  • <cache-container> 定義。

XML 設定のサンプル

<infinispan>
    <cache-container>
        <distributed-cache name="myCache" mode="SYNC">
          <encoding media-type="application/x-protostream"/>
          <memory max-count="1000000" when-full="REMOVE"/>
        </distributed-cache>
    </cache-container>
</infinispan>

6.7.2. JSON 設定

JSON 形式の Data Grid 設定:

  • キャッシュ定義のみが必要です。
  • XML 設定の構造に従う必要があります。

    • XML 要素は JSON オブジェクトになります。
    • XML 属性は JSON フィールドになります。

JSON 設定の例

{
  "distributed-cache": {
    "name": "myCache",
    "mode": "SYNC",
    "encoding": {
      "media-type": "application/x-protostream"
      },
    "memory": {
      "max-count": 1000000,
      "when-full": "REMOVE"
    }
  }
}

第7章 Data Grid Server データソースの設定

管理データソースを作成して、データベース接続用の接続プールおよびパフォーマンスを最適化します。

データベースコネクションプロパティーを JDBC キャッシュストア設定の一部として指定できます。ただし、これはキャッシュ定義ごとに行う必要がありますが、この場合、設定が複製され、複数の個別の接続プールが作成されてリソースが無駄に消費されます。

共有の管理されたデータソースを使用することで、接続設定とプーリングを一元化して、より効率的に使用することができます。

7.1. JDBC キャッシュストアのデータソース設定

データソースの Data Grid サーバー設定は、2 つのセクションで設定されます。

  • データベースへの接続方法を定義する connection factory
  • 接続をプールして再利用する方法を定義する connection pool
<data-sources>
   <data-source name="ds" jndi-name="jdbc/datasource" statistics="true"> 1
      <connection-factory driver="org.database.Driver" 2
                          username="db_user" 3
                          password="secret" 4
                          url="jdbc:db://database-host:10000/dbname" 5
                          new-connection-sql="SELECT 1" 6
                          transaction-isolation="READ_COMMITTED"> 7
         <connection-property name="name">value</connection-property> 8
      </connection-factory>
      <connection-pool
         initial-size="1" 9
         max-size="10" 10
         min-size="3" 11
         background-validation="1000" 12
         idle-removal="1" 13
         blocking-timeout="1000" 14
         leak-detection="10000"/> 15
   </data-source>
</data-sources>
1
データソース名、JNDI 名、統計収集を有効にするかどうかを定義します。
2
接続を作成する JDBC ドライバーを指定します。ドライバー JAR を server/lib ディレクトリーに配置します。
3
接続のユーザー名を指定します。
4
対応する接続のパスワードを指定します。
5
使用中のドライバーに固有の JDBC URL を指定します。
6
新しい接続を検証するクエリーを追加します。
7
接続のトランザクション分離レベルを NONEREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE のいずれかに設定します。
8
オプションの JDBC ドライバー固有の接続プロパティーを設定します。
9
プールが最初に含む接続の数を定義します。
10
プールの最大接続数を設定します。
11
プールが含む必要のある接続の最小数を設定します。
12
バックグラウンド検証の実行間隔をミリ秒単位で指定します。
13
接続が削除されることなくアイドル状態を維持できる時間を分単位で指定します。
14
接続待機中にブロックする時間をミリ秒単位で指定します。この時間経過後に例外が発生します。
15
リーク警告を発することなく接続を保持できる時間をミリ秒単位で指定します。

7.2. JDBC キャッシュストアでのデータソースの使用

キャッシュ定義ごとに個別の接続プロパティーを指定する代わりに、JDBC キャッシュストア設定で共有の管理データソースを使用します。

前提条件

Data Grid サーバー設定に JDBC キャッシュストアの管理データソースを作成します。

手順

  • 以下の例のように、キャッシュ設定の JDBC キャッシュストア設定でデータソースの JNDI 名を参照します。
<distributed-cache-configuration name="persistent-cache" xmlns:jdbc="urn:infinispan:config:store:jdbc:11.0">
    <persistence>
        <jdbc:string-keyed-jdbc-store>
            <jdbc:data-source jndi-url="jdbc/postgres"/> 1
            <jdbc:string-keyed-table drop-on-exit="true"
                          create-on-start="true"
                          prefix="TBL">
                <jdbc:id-column name="ID" type="VARCHAR(255)"/>
                <jdbc:data-column name="DATA" type="BYTEA"/>
                <jdbc:timestamp-column name="TS" type="BIGINT"/>
                <jdbc:segment-column name="S" type="INT"/>
            </jdbc:string-keyed-table>
        </jdbc:string-keyed-jdbc-store>
    </persistence>
</distributed-cache-configuration>
1
Data Grid サーバー設定でデータソース接続に指定した JNDI 名を指定します。

第8章 サーバー側のタスクをリモートで実行

Data Grid コマンドラインインターフェイス、REST API、または Hot Rod クライアントから呼び出すことができる Data Grid サーバーにタスクを定義して追加します。

カスタム Java クラスとしてタスクを実装するか、JavaScript などの言語でスクリプトを定義することができます。

8.1. サーバータスクの作成

カスタムタスクの実装を作成し、それらを Data Grid サーバーに追加します。

8.1.1. サーバータスク

Data Grid サーバータスクは、org.infinispan.tasks.ServerTask インターフェイスを拡張するクラスであり、一般的に以下のメソッド呼び出しが含まれます。

setTaskContext()
タスクパラメーター、タスクが実行されるキャッシュ参照などを含む実行コンテキスト情報へのアクセスを許可します。ほとんどの場合、実装はこの情報をローカルに保存し、タスクが実際に実行したときに使用します。
getName()
タスクの一意の名前を返します。クライアントはこれらの名前でタスクを呼び出します。
getExecutionMode()

タスクの実行モードを返します。

  • TaskExecutionMode.ONE_NODE は、要求を処理するノードのみがスクリプトを実行します。ただし、スクリプトはクラスター化された操作を引き続き呼び出すことができます。
  • TaskExecutionMode.ALL_NODES Data Grid は、クラスター化されたエグゼキューターを使用してノード間でスクリプトを実行します。たとえば、ストリーム処理はすべてのノードに分散されるため、ストリーム処理を呼び出したサーバータスクを 1 つのノードで実行する必要があります。
call()
結果を計算します。このメソッドは java.util.concurrent.Callable インターフェイス内で定義され、サーバータスクにより呼び出されます。
重要

サーバータスクの実装は、サービスローダーパターンの要件に準拠する必要があります。たとえば、実装にはゼロ引数のコンストラクターが必要です。

以下の HelloTask クラス実装は、1 つのパラメーターを持つタスクの例を提供します。

package example;

import org.infinispan.tasks.ServerTask;
import org.infinispan.tasks.TaskContext;

public class HelloTask implements ServerTask<String> {

   private TaskContext ctx;

   @Override
   public void setTaskContext(TaskContext ctx) {
      this.ctx = ctx;
   }

   @Override
   public String call() throws Exception {
      String name = (String) ctx.getParameters().get().get("name");
      return "Hello " + name;
   }

   @Override
   public String getName() {
      return "hello-task";
   }

}

8.1.2. サーバータスクの Data Grid サーバーへのデプロイメント

カスタムサーバーのタスククラスを Data Grid サーバーに追加します。

前提条件

実行中の Data Grid サーバーを停止します。Data Grid は、カスタムクラスのランタイムデプロイメントをサポートしません。

手順

  1. JAR ファイルでサーバータスクの実装をパッケージ化します。
  2. 以下のように、サーバーのタスクの完全修飾名が含まれる META-INF/services/org.infinispan.tasks.ServerTask ファイルを追加します。

    example.HelloTask
  3. JAR ファイルを Data Grid サーバーの $RHDG_HOME/server/lib ディレクトリーにコピーします。
  4. クラスを Data Grid 設定のデシリアライズホワイトリストに追加します。または、システムプロパティーを使用してホワイトリストを設定します。

8.2. サーバースクリプトの作成

カスタムスクリプトを作成して、Data Grid サーバーに追加します。

8.2.1. サーバースクリプト

Data Grid サーバーのスクリプトは javax.script API をベースとしており、JVM ベースの ScriptEngine 実装と互換性があります。

Hello World スクリプトの例

以下は、1 つの Data Grid サーバーで実行され、1 つのパラメーターを持ち、JavaScript を使用する簡単な例です。

// mode=local,language=javascript,parameters=[greetee]
"Hello " + greetee

上記のスクリプトを実行するときに、greetee パラメーターの値を渡すと、Data Grid は "Hello ${value}" を返します。

8.2.1.1. スクリプトメタデータ

メタデータは、スクリプトの実行中に Data Grid サーバーが使用するスクリプトに関する追加の情報を提供します。

スクリプトメタデータは、スクリプトの最初の行でコメントを追加する property=value ペアです。以下に例を示します。

// name=test, language=javascript
// mode=local, parameters=[a,b,c]
  • スクリプト言語 (//, ;;, #) に一致するコメントスタイルを使用してください。
  • コンマで区切られた property=value ペア
  • 値は一重引用符 (') または二重引用符 (") で区切ります。

表8.1 メタデータプロパティー

プロパティー説明

モード

実行モードを定義し、次の値を持ちます。

local は、リクエストを処理するノードのみがスクリプトを実行します。ただし、スクリプトはクラスター化された操作を引き続き呼び出すことができます。

distributed Data Grid は、クラスター化されたエグゼキューターを使用してノード間でスクリプトを実行します。

言語

スクリプトを実行する ScriptEngine を指定します。

extension

ScriptEngine を設定する代替方法としてファイル名の拡張子を指定します。

role

ユーザーがスクリプトを実行する必要があるロールを指定します。

parameters

このスクリプトの有効なパラメーター名の配列を指定します。このリストに含まれていないパラメーターを指定する呼び出しによって例外が生じます。

datatype

オプションで、データおよびパラメーターおよび戻り値を保存する MediaType(MIME タイプ) を設定します。このプロパティーは、特定のデータフォーマットのみをサポートするリモートクライアントに便利です。

現在、データに String UTF-8 形式を使用するように、text/plain; charset=utf-8 のみを設定できます。

8.2.1.2. スクリプトバインディング

Data Grid は、内部オブジェクトをスクリプト実行のバインディングとして公開します。

バインディング説明

cache

スクリプトが実行されるキャッシュを指定します。

marshaller

データをキャッシュにシリアル化するために使用するマーシャラーを指定します。

cacheManager

キャッシュの cacheManager を指定します。

scriptingManager

スクリプトを実行するスクリプトマネージャーのインスタンスを指定します。このバインディングを使用して、スクリプトから他のスクリプトを実行することができます。

8.2.1.3. スクリプトパラメーター

Data Grid を使用すると、スクリプトを実行するためのバインディングとして名前付きパラメーターを渡すことができます。

パラメーターは name,value のペアで、name は文字列、value はマーシャラーが解釈できる任意の値になります。

以下のスクリプトの例では、multiplicandmultiplier の 2 つのパラメーターがあります。このスクリプトは multiplicand の値を取り、その値を multiplier の値で乗算します。

// mode=local,language=javascript
multiplicand * multiplier

上記のスクリプトを実行すると、Data Grid は式の評価の結果で応答します。

8.2.2. Data Grid Server へのスクリプトの追加

コマンドラインインターフェイスを使用して、Data Grid サーバーにスクリプトを追加します。

前提条件

Data Grid Server は、___script_cache キャッシュにスクリプトを保存します。キャッシュ承認を有効にする場合、ユーザーは ___script_cache にアクセスするために ___script_manager ロールを持っている必要があります。

手順

  1. 必要に応じてスクリプトを定義します。

    たとえば、単一の Data Grid サーバーで実行し、2 つのパラメーターを持ち、JavaScript を使用して指定の値を掛ける multiplication.js という名前のファイルを作成します。

    // mode=local,language=javascript
    multiplicand * multiplier
  2. Data Grid への CLI 接続を作成します。
  3. 以下の例のように、task コマンドを使用してスクリプトをアップロードします。

    [//containers/default]> task upload --file=multiplication.js multiplication
  4. スクリプトが利用可能であることを確認します。

    [//containers/default]> ls tasks
    multiplication

8.2.3. プログラムでのスクリプトの作成

以下の例のように、Hot Rod RemoteCache インターフェイスを使用してスクリプトを追加します。

RemoteCache<String, String> scriptCache = cacheManager.getCache("___script_cache");
scriptCache.put("multiplication.js",
  "// mode=local,language=javascript\n" +
  "multiplicand * multiplier\n");

8.3. サーバー側のタスクとスクリプトの実行

Data Grid サーバーで、タスクとカスタムスクリプトを実行します。

8.3.1. タスクおよびスクリプトの実行

コマンドラインインターフェイスを使用して、Data Grid クラスターでタスクおよびスクリプトを実行します。

手順

  1. Data Grid への CLI 接続を作成します。
  2. 以下の例のように、task コマンドを使用して、タスクおよびスクリプトを実行します。

    • multipler.js という名前のスクリプトを実行して、2 つのパラメーターを指定します。

      [//containers/default]> task exec multipler.js -Pmultiplicand=10 -Pmultiplier=20
      200.0
    • @@cache@names という名前のタスクを実行して、利用可能なすべてのキャッシュのリストを取得します。

      //containers/default]> task exec @@cache@names
      ["___protobuf_metadata","mycache","___script_cache"]

8.3.2. プログラムでのスクリプトの実行

以下の例のように、execute() を呼び出して、Hot Rod RemoteCache インターフェイスを使用してスクリプトを実行します。

RemoteCache<String, Integer> cache = cacheManager.getCache();
// Create parameters for script execution.
Map<String, Object> params = new HashMap<>();
params.put("multiplicand", 10);
params.put("multiplier", 20);
// Run the script with the parameters.
Object result = cache.execute("multiplication.js", params);

8.3.3. プログラムでのタスクの実行

以下の例のように、execute() を呼び出して、Hot Rod RemoteCache インターフェイスを使用してタスクを実行します。

// Add configuration for a locally running server.
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServer().host("127.0.0.1").port(11222);

// Connect to the server.
RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build());

// Retrieve the remote cache.
RemoteCache<String, String> cache = cacheManager.getCache();

// Create task parameters.
Map<String, String> parameters = new HashMap<>();
parameters.put("name", "developer");

// Run the server task.
String greet = cache.execute("hello-task", parameters);
System.out.println(greet);

第9章 Data Grid サーバーの監視

9.1. Working with Data Grid Server Logs

Data Grid は Apache Log4j 2 を使用して、トラブルシューティング目的および根本原因分析のための環境およびレコードキャッシュ操作の詳細を取得する設定可能なロギングメカニズムを提供します。

9.1.1. Data Grid のログファイル

Data Grid は、ログメッセージを
$RHDG_HOME/${infinispan.server.root}/log ディレクトリーに書き込みます。

server.log
サーバーの起動に関連する起動ログなど、人間が判読できる形式のメッセージ。
Data Grid は、サーバーの起動時にデフォルトでこのファイルを作成します。
server.log.json
Data Grid ログを解析および分析できる JSON 形式のメッセージ。
JSON-FILE アペンダーを有効にすると、Data Grid はこのファイルを作成します。

9.1.2. データグリッドログプロパティーの設定

Log4j2 の マニュアル で説明されている log4j2.xml を使用して Data Grid ログを設定します。

手順

  1. 任意のテキストエディターで $RHDG_HOME/${infinispan.server.root}/conf/log4j2.xml を開きます。
  2. 必要に応じてロギング設定を変更します。
  3. log4j2.xml を保存し、閉じます。

9.1.2.1. ログレベル

ログレベルは、メッセージの性質と重大度を示します。

ログレベル説明

TRACE

粒度の細かいデバッグメッセージ。アプリケーションを介して個々のリクエストのフローをキャプチャーします。

DEBUG

個々のリクエストと関連性のない、一般的なデバッグのメッセージ。

INFO

ライフサイクルイベントを含む、アプリケーションの全体的な進捗状況に関するメッセージ。

WARN

エラーやパフォーマンスの低下につながる可能性のあるイベント。

ERROR

操作またはアクティビティーの正常な実行を妨げる可能性がありますが、アプリケーションの実行は妨げないエラー状態。

FATAL

重大なサービス障害やアプリケーションのシャットダウンを引き起こす可能性のあるイベント。

上記の個々のメッセージのレベルに加えて、この設定では、ALL (すべてのメッセージを含む) と OFF (すべてのメッセージを除外) のさらに 2 つの値を可能にします。

9.1.2.2. Data Grid ログカテゴリー

Data Grid は、機能領域ごとにログを整理する INFOWARNERRORFATAL のレベルのメッセージのカテゴリーを提供します。

org.infinispan.CLUSTER
状態遷移操作、イベントのリバランス、パーティション設定などが含まれる Data Grid クラスタリング固有のメッセージ。
org.infinispan.CONFIG
Data Grid 設定固有のメッセージ
org.infinispan.CONTAINER
有効期限とエビクション操作、キャッシュリスナーの通知、トランザクションなどを含むデータコンテナーに固有のメッセージ。
org.infinispan.PERSISTENCE
キャッシュローダーとストアに固有のメッセージ。
org.infinispan.SECURITY
Data Grid のセキュリティーに固有のメッセージ。
org.infinispan.SERVER
Data Grid Server に固有のメッセージ。
org.infinispan.XSITE
クロスサイトレプリケーション操作に固有のメッセージ。

9.1.2.3. ログアペンダー

ログアペンダーは、Data Grid によるログメッセージの記録方法を定義します。

CONSOLE
ログメッセージをホストの標準出力 (stdout) または標準エラー (stderr) ストリームに書き込みます。
デフォルトで org.apache.logging.log4j.core.appender.ConsoleAppender クラスを使用します。
FILE
ファイルにログメッセージを書き込みます。
デフォルトで org.apache.logging.log4j.core.appender.RollingFileAppender クラスを使用します。
JSON-FILE
ログメッセージを JSON 形式でファイルに書き込みます。
デフォルトで org.apache.logging.log4j.core.appender.RollingFileAppender クラスを使用します。

9.1.2.4. ログパターン

CONSOLE および FILE アペンダーは、PatternLayout を使用して、pattern に従ってログメッセージをフォーマットします。

以下は、FILE アペンダーのデフォルトのパターンになります。
%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p (%t) [%c{1}] %m%throwable%n

  • %d{yyyy-MM-dd HH:mm:ss,SSS} は現在の日時を追加します。
  • %-5p は、ログレベルを右揃えで指定します。
  • %t は、現在のスレッドの名前を追加します。
  • %c{1} はロギングカテゴリーの短縮名を追加します。
  • %m はログメッセージを追加します。
  • %throwable は例外スタックトレースを追加します。
  • %n は改行を追加します。

パターンについては、 PatternLayout ドキュメント で詳細に説明されています。

9.1.2.5. JSON ログハンドラーの有効化および設定

Data Grid は、JSON 形式でメッセージを書き込む JSON ログハンドラーを提供します。

前提条件

Data Grid が実行されていないことを確認します。ログハンドラーは動的に有効にすることはできません。

手順

  1. 任意のテキストエディターで $RHDG_HOME/${infinispan.server.root}/conf/log4j2.xml を開きます。
  2. JSON-FILE アペンダーのコメントを解除して、FILE アペンダーをコメントアウトします。

          <!--<AppenderRef ref="FILE"/>-->
          <AppenderRef ref="JSON-FILE"/>
  3. オプションで、JSON アペンダーレイアウト を設定します。
  4. logging.properties を保存して閉じます。

Data Grid を起動すると、各ログメッセージが JSON マップとして
$RHDG_HOME/${infinispan.server.root}/log/server.log.json ファイルに書き込まれます。

9.1.3. アクセスログ

hotgitops および REST エンドポイントは、以下のカテゴリーですべての受信クライアント要求をログエントリーとして記録できます。

  • Hotgitops エンドポイントの org.infinispan.HOTROD_ACCESS_LOG ロギングカテゴリー。
  • REST エンドポイントの org.infinispan.REST_ACCESS_LOG ロギングカテゴリー。

9.1.3.1. アクセスログの有効化

Hot Rod および REST エンドポイントのアクセスログはデフォルトで無効になっています。いずれかのログカテゴリーを有効にするには、次の例のように、Data Grid ログ設定でレベルを TRACE に設定します。

<Logger name="org.infinispan.HOTROD_ACCESS_LOG" additivity="false" level="TRACE">
   <AppenderRef ref="HR-ACCESS-FILE"/>
</Logger>

9.1.3.2. アクセスログのプロパティー

アクセスログのデフォルト形式は以下のとおりです。

%X{address} %X{user} [%d{dd/MMM/yyyy:HH:mm:ss Z}] &quot;%X{method} %m
%X{protocol}&quot; %X{status} %X{requestSize} %X{responseSize} %X{duration}%n

前述のフォーマットは、以下のようなログエントリーを作成します。

127.0.0.1 - [DD/MM/YYYY:HH:MM:SS +0000] "PUT /rest/v2/caches/default/key HTTP/1.1" 404 5 77 10

ロギングプロパティーは %X{name} 表記を使用し、アクセスログの形式を変更可能にします。以下は、デフォルトのロギングプロパティーです。

プロパティー説明

address

X-Forwarded-For ヘッダーまたはクライアント IP アドレスのいずれか。

user

認証を使用する場合のプリンシパル名。

メソッド

使用されるメソッド。PUTGET など。

protocol

使用されるプロトコルHTTP/1.1HTTP/2HOTROD/2.9 など。

status

REST エンドポイントの HTTP ステータスコード。OK または Hot Rod エンドポイントの例外。

requestSize

リクエストのサイズ (バイト単位)。

responseSize

応答のサイズ (バイト単位)。

duration

サーバーによる要求の処理にかかった時間 (ミリ秒数)。

ヒント

h: で始まるヘッダー名を使用して、リクエストに含まれるヘッダーをログに記録します (例: %X{h:User-Agent})。

9.2. 統計、メトリック、および JMX の設定

DataGrid が MicroProfileMetrics エンドポイントまたは Data Grid を介してエクスポートする統計を有効にします。JMX MBean を登録することで、管理操作を実施することもできます。

9.2.1. Data Grid 統計の有効化

Data Grid を使用すると、キャッシュマネージャーとキャッシュの統計を有効にすることができます。ただし、キャッシュマネージャーの統計を有効にしても、キャッシュマネージャーが制御するキャッシュの統計は有効になりません。キャッシュの統計を明示的に有効にする必要があります。

注記

Data Grid サーバーは、デフォルトでキャッシュマネージャーの統計を有効にします。

手順

  • 統計を宣言的またはプログラムで有効にします。

宣言的に

<cache-container statistics="true"> 1
  <local-cache name="mycache" statistics="true"/> 2
</cache-container>

1
キャッシュマネージャーの統計を有効にします。
2
名前付きキャッシュの統計を有効にします。

プログラムで

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .cacheContainer().statistics(true) 1
  .build();

 ...

Configuration config = new ConfigurationBuilder()
  .statistics().enable() 2
  .build();

1
キャッシュマネージャーの統計を有効にします。
2
名前付きキャッシュの統計を有効にします。

9.2.2. Data Grid メトリックの有効化

Data Grid を設定して、ゲージとヒストグラムをエクスポートします。

手順

  • メトリックを宣言的またはプログラム的に設定する。

宣言的に

<cache-container statistics="true"> 1
  <metrics gauges="true" histograms="true" /> 2
</cache-container>

1
キャッシュマネージャーの統計を計算し、収集します。
2
収集した統計をゲージおよびヒストグラムメトリックとしてエクスポートします。

プログラムで

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .statistics().enable() 1
  .metrics().gauges(true).histograms(true) 2
  .build();

1
キャッシュマネージャーの統計を計算し、収集します。
2
収集した統計をゲージおよびヒストグラムメトリックとしてエクスポートします。

9.2.3. Data Grid メトリックの収集

Prometheus などのモニタリングツールを使用して、Data Grid メトリクスを収集します。

前提条件

  • 統計を有効にします。統計を有効にしないと、Data Grid はメトリックに 0-1 の値を指定します。
  • 必要に応じて、ヒストグラムを有効にします。デフォルトでは、Data Grid はゲージを生成しますが、ヒストグラムは生成しません。

手順

  • Prometheus (OpenMetrics) 形式でメトリックを取得します。

    $ curl -v http://localhost:11222/metrics
  • MicroProfile JSON 形式でメトリックを取得します。

    $ curl --header "Accept: application/json" http://localhost:11222/metrics

次のステップ

Data Grid メトリクスを収集するようにモニタリングアプリケーションを設定します。たとえば、以下を prometheus.yml に追加します。

static_configs:
    - targets: ['localhost:11222']

参照資料

9.2.4. JMX MBean を登録するための Data Grid の設定

Data Grid は、統計の収集と管理操作の実行に使用できる JMX MBean を登録できます。ただし、JMX とは別に統計を有効にする必要があります。そうしなければ、Data Grid はすべての統計属性に 0 の値を提供します。

手順

  • JMX を宣言的またはプログラム的に有効にします。

宣言的に

<cache-container>
  <jmx enabled="true" /> 1
</cache-container>

1
Data Grid JMX MBean を登録します。

プログラムで

GlobalConfiguration globalConfig = new GlobalConfigurationBuilder()
  .jmx().enable() 1
  .build();

1
Data Grid JMX MBean を登録します。

9.2.4.1. Data Grid MBean

Data Grid は、管理可能なリソースを表す JMX MBean を公開します。

org.infinispan:type=Cache
キャッシュインスタンスに使用できる属性および操作。
org.infinispan:type=CacheManager
Data Grid キャッシュやクラスターのヘルス統計など、Cache Manager で使用できる属性および操作。

使用できる JMX MBean の詳細なリストおよび説明、ならびに使用可能な操作および属性については、Data Grid JMX Components のドキュメントを参照してください。

9.3. サーバーの正常性統計の取得

以下の方法で Data Grid クラスターの正常性を監視します。

  • embeddedCacheManager.getHealth() メソッド呼び出しでプログラマティックに監視
  • JMX MBean
  • Data Grid REST Server

9.3.1. JMX 経由での Health API へのアクセス

JMX 経由で Data Grid クラスターの正常性統計を取得します。

手順

  1. JConsole などの JMX 対応ツールを使用して Data Grid Server に接続し、以下のオブジェクトに移動します。

    org.infinispan:type=CacheManager,name="default",component=CacheContainerHealth
  2. 利用可能な MBean を選択し、クラスターの正常性の統計を取得します。

9.3.2. REST 経由での Health API へのアクセス

REST API 経由で Data Grid クラスターの正常性を取得します。

手順

  • GET 要求を呼び出して、クラスターの正常性を取得します。

    GET /rest/v2/cache-managers/{cacheManagerName}/health

Data Grid は、以下のような JSON ドキュメントで応答します。

{
    "cluster_health":{
        "cluster_name":"ISPN",
        "health_status":"HEALTHY",
        "number_of_nodes":2,
        "node_names":[
            "NodeA-36229",
            "NodeB-28703"
        ]
    },
    "cache_health":[
        {
            "status":"HEALTHY",
            "cache_name":"___protobuf_metadata"
        },
        {
            "status":"HEALTHY",
            "cache_name":"cache2"
        },
        {
            "status":"HEALTHY",
            "cache_name":"mycache"
        },
        {
            "status":"HEALTHY",
            "cache_name":"cache1"
        }
    ]

}
ヒント

以下のように Cache Manager のステータスを取得します。

GET /rest/v2/cache-managers/{cacheManagerName}/health/status

参照資料

詳細は、REST v2 (version 2) API ドキュメントを参照してください。

第10章 Data Grid サーバーのローリングアップグレードの実行

Data Grid クラスターのローリングアップグレードを実行して、ダウンタイムやデータの損失なしにバージョン間で変更します。ローリングアップグレードは、Hot Rod 経由で Data Grid サーバーおよびデータの両方をターゲットバージョンに移行します。

10.1. ターゲットクラスターの設定

ターゲット Data Grid バージョンを実行し、リモートキャッシュストアを使用してソースクラスターからデータを読み込むクラスターを作成します。

前提条件

  • ターゲットアップグレードバージョンとともに Data Grid クラスターをインストールします。
重要

ターゲットクラスターのネットワークプロパティーはソースクラスターのネットワークプロパティーが重複していないことを確認します。JGroups トランスポート設定でターゲットおよびソースクラスターの一意の名前を指定する必要があります。環境に応じて、異なるネットワークインターフェイスを使用し、ターゲットクラスターとソースクラスターを分離するためにポートオフセットを指定することもできます。

手順

  1. ソースクラスターから移行する各キャッシュについて、ターゲットクラスターに aRemoteCacheStore を追加します。

    リモートキャッシュストアは Hot Rod プロトコルを使用して、リモート Data Grid クラスターからデータを取得します。リモートキャッシュストアをターゲットクラスターに追加する場合は、ソースクラスターからデータをレイジーに読み込み、クライアント要求を処理します。

  2. すべての要求の処理を開始するために、クライアントをターゲットクラスターに切り替えます。

    1. クライアント設定をターゲットクラスターの場所で更新します。
    2. クライアントを再起動します。

10.1.1. ローリングアップグレードのリモートキャッシュストア

以下のようにローリングアップグレードを実行するには、特定のリモートキャッシュストア設定を使用する必要があります。

<persistence passivation="false"> 1
   <remote-store xmlns="urn:infinispan:config:store:remote:11.0"
                 cache="myDistCache" 2
                 protocol-version="2.5" 3
                 hotrod-wrapping="true" 4
                 raw-values="true" 5
                 segmented="false"> 6
      <remote-server host="127.0.0.1" port="11222"/> 7
   </remote-store>
</persistence>
1
パッシベーションを無効にします。ローリングアップグレードのリモートキャッシュストアは、パッシベーションを無効にする必要があります。
2
ソースクラスター内のキャッシュの名前と一致します。ターゲットクラスターは、リモートキャッシュストアを使用してこのキャッシュからデータを読み込みます。
3
ソースクラスターの Hot Rod プロトコルバージョンと一致します。2.5 は最小バージョンであり、アップグレードパスに適しています。別の Hot Rod でバージョンを設定する必要はありません。
4
エントリーが Hot Rod プロトコルに適した形式でラップされるようにします。
5
データを raw 形式でリモートキャッシュストアに保存します。これにより、クライアントはリモートキャッシュストアから直接データを使用できるようになります。
6
リモートキャッシュストアのセグメンテーションを無効にします。リモートキャッシュストアのセグメンテーションを有効にする必要があるのは、ターゲットクラスターのセグメント数がソースクラスターのキャッシュのセグメント数と一致する場合のみです。
7
ソースクラスターの場所を参照します。

10.2. ターゲットクラスターへのデータの同期

ターゲットクラスターがリモートキャッシュストアを使用してクライアント要求を実行し、オンデマンドでデータを読み込む場合は、ソースクラスターからターゲットクラスターにデータを同期できます。

この操作はソースクラスターからデータを読み取り、ターゲットクラスターに書き込みます。データは、ターゲットクラスターのすべてのノードに並行して移行され、各ノードはデータのサブセットを受け取ります。Data Grid 設定で、各キャッシュの同期を実行する必要があります。

手順

  1. ターゲットクラスターに移行する Data Grid 設定の各キャッシュの同期操作を開始します。

    Data Grid REST API を使用し、?action=sync- data パラメーターで POST 要求を呼び出します。たとえば、myCache という名前のキャッシュ内のデータをソースクラスターからターゲットクラスターに同期するには、以下を実行します。

    POST /v2/caches/myCache?action=sync-data

    操作が完了すると、Data Grid はターゲットクラスターにコピーされたエントリーの合計数で応答します。

    または、RollingUpgradeManager MBean で synchronizeData(migratorName=hotrod) を呼び出すことで JMX を使用できます。

  2. ターゲットクラスター内の各ノードをソースクラスターから切断します。

    たとえば、ソースクラスターから myCache キャッシュを切断するには、以下の POST 要求を呼び出します。

    POST /v2/caches/myCache?action=disconnect-source

    JMX を使用するには、RollingUpgradeManager MBean で disconnectSource(migratorName=hotrod) を呼び出します。

次のステップ

ソースクラスターからすべてのデータを同期すると、ローリングアップグレードプロセスが完了します。ソースクラスターの使用を停止できるようになりました。

第11章 Data Grid Server のトラブルシューティング

Data Grid サーバーのデプロイメントに関する診断情報を収集し、トラブルシューティングの手順を実行して問題を解決します。

11.1. Data Grid Server の診断レポートの取得

Data Grid サーバーは、Data Grid サーバーとホストの両方に関する診断情報が含まれる集計レポートを tar.gz アーカイブで提供します。レポートは、設定ファイルやログファイルに加えて、CPU、メモリー、オープンファイル、ネットワークソケットとルーティング、スレッドに関する詳細を提供します。

手順

  1. Data Grid への CLI 接続を作成します。
  2. server report コマンドを使用して tar.gz アーカイブをダウンロードします。

    [//containers/default]> server report
    Downloaded report 'infinispan-<hostname>-<timestamp>-report.tar.gz'
  3. tar.gz ファイルをファイルシステムの適切な場所に移動します。
  4. 任意のアーカイブツールで tar.gz ファイルをデプロイメントします。

11.2. ランタイム時の Data Grid Server のロギング設定の変更

ランタイム時に Data Grid サーバーのロギング設定を変更し、ロギングを一時的に調整して問題のトラブルシューティングを行い、根本原因分析を実行します。

CLI を使用したロギング設定の変更は、ランタイム時のみの操作であるため、変更は以下のようになります。

  • log4j2.xml ファイルに保存されません。サーバーノードまたはクラスター全体を再起動すると、ログ設定が log4j2.xml ファイルのデフォルトのプロパティーにリセットされます。
  • CLI の呼び出し時に、クラスター内のノードにのみ適用されます。ログ設定を変更した後にクラスターに参加するノードは、デフォルトのプロパティーを使用します。

手順

  1. Data Grid への CLI 接続を作成します。
  2. ロギング を使用して、必要な調整を行います。

    • サーバーで定義されているすべてのアペンダーをリスト表示します。
[//containers/default]> logging list-appenders

上記のコマンドは以下を返します。

{
  "STDOUT" : {
    "name" : "STDOUT"
  },
  "JSON-FILE" : {
    "name" : "JSON-FILE"
  },
  "HR-ACCESS-FILE" : {
    "name" : "HR-ACCESS-FILE"
  },
  "FILE" : {
    "name" : "FILE"
  },
  "REST-ACCESS-FILE" : {
    "name" : "REST-ACCESS-FILE"
  }
}
  • サーバーで定義されているすべてのロガー設定をリスト表示します。
[//containers/default]> logging list-loggers

上記のコマンドは以下を返します。

[ {
  "name" : "",
  "level" : "INFO",
  "appenders" : [ "STDOUT", "FILE" ]
}, {
  "name" : "org.infinispan.HOTROD_ACCESS_LOG",
  "level" : "INFO",
  "appenders" : [ "HR-ACCESS-FILE" ]
}, {
  "name" : "com.arjuna",
  "level" : "WARN",
  "appenders" : [ ]
}, {
  "name" : "org.infinispan.REST_ACCESS_LOG",
  "level" : "INFO",
  "appenders" : [ "REST-ACCESS-FILE" ]
} ]
  • set サブコマンドを使用して、ロガー設定を追加および変更します。

たとえば、以下のコマンドは、org.infinispan パッケージのロギングレベルを DEBUG に設定します。

[//containers/default]> logging set --level=DEBUG org.infinispan
  • remove サブコマンドを使用して、既存のロガー設定を削除します。

たとえば、以下のコマンドは org.infinispan ロガー設定を削除します。これは、代わりに root 設定が使用されることを意味します。

[//containers/default]> logging remove org.infinispan

11.3. リソースの統計

stats コマンドを使用して、Data Grid サーバー内の一部のリソースについて、サーバーが収集した統計を検査できます。

統計を収集するリソース (コンテナー、キャッシュ) のコンテキストから、またはそのようなリソースへのパスを使用して、stats コマンドを使用します。

[//containers/default]> stats
{
  "statistics_enabled" : true,
  "number_of_entries" : 0,
  "hit_ratio" : 0.0,
  "read_write_ratio" : 0.0,
  "time_since_start" : 0,
  "time_since_reset" : 49,
  "current_number_of_entries" : 0,
  "current_number_of_entries_in_memory" : 0,
  "total_number_of_entries" : 0,
  "off_heap_memory_used" : 0,
  "data_memory_used" : 0,
  "stores" : 0,
  "retrievals" : 0,
  "hits" : 0,
  "misses" : 0,
  "remove_hits" : 0,
  "remove_misses" : 0,
  "evictions" : 0,
  "average_read_time" : 0,
  "average_read_time_nanos" : 0,
  "average_write_time" : 0,
  "average_write_time_nanos" : 0,
  "average_remove_time" : 0,
  "average_remove_time_nanos" : 0,
  "required_minimum_number_of_nodes" : -1
}
[//containers/default]> stats /containers/default/caches/mycache
{
  "time_since_start" : -1,
  "time_since_reset" : -1,
  "current_number_of_entries" : -1,
  "current_number_of_entries_in_memory" : -1,
  "total_number_of_entries" : -1,
  "off_heap_memory_used" : -1,
  "data_memory_used" : -1,
  "stores" : -1,
  "retrievals" : -1,
  "hits" : -1,
  "misses" : -1,
  "remove_hits" : -1,
  "remove_misses" : -1,
  "evictions" : -1,
  "average_read_time" : -1,
  "average_read_time_nanos" : -1,
  "average_write_time" : -1,
  "average_write_time_nanos" : -1,
  "average_remove_time" : -1,
  "average_remove_time_nanos" : -1,
  "required_minimum_number_of_nodes" : -1
}

第12章 参照

12.1. Data Grid Server 8.1.1 Readme

以下は Data Grid Server 11.0.9.Final-redhat-00001 ディストリビューションに関する情報です。

12.1.1. 要件

Data Grid Server には、JDK 11 以降が必要です。

12.1.2. サーバーの起動

server スクリプトを使用して Data Grid Server インスタンスを実行します。

Unix / Linux

$RHDG_HOME/bin/server.sh

Windows

$RHDG_HOME\bin\server.bat

ヒント

コマンド引数を表示するには --help または -h オプションを追加します。

12.1.3. サーバーの停止

CLI で shutdown コマンドを使用して、正常なシャットダウンを実行します。

または、ターミナルから Ctrl-C を入力してサーバープロセスを中断するか、TERM シグナルを介してこれを強制終了します。

12.1.4. 設定

サーバー設定によって、以下のサーバー固有の要素で Data Grid 設定が拡張されます。

cache-container
キャッシュライフサイクルを管理するためのキャッシュコンテナーを定義します。
endpoints
クライアントプロトコルのエンドポイントコネクターを有効化および設定します。
security
エンドポイントセキュリティーレルムを設定します。
socket-bindings
エンドポイントコネクターをインターフェイスおよびポートにマッピングします。

デフォルトの設定ファイルは $RHDG_HOME/server/conf/infinispan.xml です。

クラスタリング機能なしでサーバーを起動する以下の例のように、-c 引数を指定してさまざまな設定ファイルを使用します。

Unix / Linux

$RHDG_HOME/bin/server.sh -c infinispan-local.xml

Windows

$RHDG_HOME\bin\server.bat -c infinispan-local.xml

12.1.5. バインドアドレス

Data Grid Server は、デフォルトでネットワーク上のループバック IP アドレス localhost にバインドします。

すべてのネットワークインターフェイスにバインドする以下の例のように、-b 引数を使用して別の IP アドレスを設定します。

Unix / Linux

$RHDG_HOME/bin/server.sh -b 0.0.0.0

Windows

$RHDG_HOME\bin\server.bat -b 0.0.0.0

12.1.6. バインドポート

Data Grid Server は、デフォルトでポート 11222 をリッスンします。

-p 引数を使用して別のポートを設定します。

Unix / Linux

$RHDG_HOME/bin/server.sh -p 30000

Windows

$RHDG_HOME\bin\server.bat -p 30000

12.1.7. クラスタリングアドレス

Data Grid Server 設定では、クラスタートランスポートが定義されているため、同じネットワーク上の複数のインスタンスが相互に検出し、自動的にクラスターを形成します。

-k 引数を使用して、クラスタートラフィックの IP アドレスを変更します。

Unix / Linux

$RHDG_HOME/bin/server.sh -k 192.168.1.100

Windows

$RHDG_HOME\bin\server.bat -k 192.168.1.100

12.1.8. クラスタースタック

JGroups スタックは、クラスタートランスポートのプロトコルを設定します。Data Grid Server は、デフォルトで tcp スタックを使用します。

クラスタートランスポートに UDP を使用する以下の例のように、-j 引数を指定して代替クラスタースタックを使用します。

Unix / Linux

$RHDG_HOME/bin/server.sh -j udp

Windows

$RHDG_HOME\bin\server.bat -j udp

12.1.9. 認証

Data Grid Server には認証が必要です。

以下のように、CLI を使用してユーザー名およびパスワードを作成します。

Unix / Linux

$RHDG_HOME/bin/cli.sh user create username -p "qwer1234!"

Windows

$RHDG_HOME\bin\cli.bat user create username -p "qwer1234!"

12.1.10. サーバーのホームディレクトリー

Data Grid Server は infinispan.server.home.path を使用して、ホストファイルシステム上のサーバーディストリビューションのコンテンツを見つけます。

$RHDG_HOME と呼ばれるサーバーのホームディレクトリーには、以下のフォルダーが含まれます。

├── bin
├── boot
├── docs
├── lib
├── server
└── static
フォルダー説明

/bin

サーバーおよび CLI を起動するスクリプトが含まれています。

/boot

サーバーを起動するための JAR ファイルが含まれます。

/docs

設定例、スキーマ、コンポーネントライセンス、およびその他のリソースを提供します。

/lib

サーバーが内部で要求する JAR ファイルが含まれます。
カスタム JAR ファイルはこのフォルダーに配置しないでください。

/server

Data Grid Server インスタンスの root フォルダーを提供します。

/static

Data Grid コンソールの静的リソースが含まれています。

12.1.11. サーバー root ディレクトリー

Data Grid Server は infinispan.server.root.path を使用して、Data Grid Server インスタンスの設定ファイルおよびデータを見つけます。

同じディレクトリーまたは別のディレクトリーに複数のサーバー root フォルダーを作成してから、以下の例に示すように -s または --server-root 引数を使用して場所を指定できます。

Unix / Linux

$RHDG_HOME/bin/server.sh -s server2

Windows

$RHDG_HOME\bin\server.bat -s server2

各サーバー roor ディレクトリーには、以下のフォルダーが含まれます。

├── server
│   ├── conf
│   ├── data
│   ├── lib
│   └── log
フォルダー説明システムプロパティーの上書き

/server/conf

サーバー設定ファイルが含まれています。

infinispan.server.config.path

/server/data

コンテナー名別に整理されたデータファイルが含まれます。

infinispan.server.data.path

/server/lib

サーバー拡張ファイルが含まれます。
このディレクトリーは再帰的にスキャンされ、クラスパスとして使用されます。

infinispan.server.lib.path
複数のパスを以下の区切り文字で区切ります:
: (Unix / Linux)
; (Windows)

/server/log

サーバーのログファイルが含まれます。

infinispan.server.log.path

12.1.12. ロギング

server/conf フォルダーの log4j2.xml ファイルを使用して、Data Grid Server のロギングを設定します。

以下のように --logging-config=<path_to_logfile> 引数を使用してカスタムパスを使用します。

Unix / Linux

$RHDG_HOME/bin/server.sh --logging-config=/path/to/log4j2.xml

ヒント

カスタムパスを確実に有効にするには、~ ショートカットを使用しないでください。

Windows

$RHDG_HOME\bin\server.bat --logging-config=path\to\log4j2.xml

法律上の通知

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.