24.2. JGroups を用いたクラスター通信

24.2.1. JGroups

JGroups は信頼できるメッセージングのためのツールキットで、お互いにメッセージを送信するノードを持つクラスターを作成するために使用できます。

jgroups サブシステムは JBoss EAP で高可用性サービスのグループ通信サポートを提供します。これにより、名前付きのチャネルおよびプロトコルスタックを設定でき、チャネルのランタイム統計を表示することもできます。jgroups サブシステムは高可用性の機能を提供する設定を使用する場合に使用できます (管理対象ドメインでは hafull-ha プロファイル、スタンドアロンサーバーは standalone-ha.xmlstandalone-full-ha.xml 設定ファイルなど)。

JBoss EAP には 2 つの JGroups スタックが事前に設定されています。

udp
クラスターのノードは UDP (User Datagram Protocol) マルチキャストを使用してお互いに通信します。これはデフォルトのスタックです。
tcp
クラスターのノードは TCP (Transmission Control Protocol) を使用してお互いに通信します。
注記

TCP はエラーのチェック、パケットの順番、および輻輳制御を処理するため、TCP のオーバーヘッドは UDP よりも大きく、速度も遅くなると考えられます。JGroups は UDP のこれらの機能を処理しますが、TCP はこれらの機能を独自で処理します。信頼できないネットワークや輻輳度の高いネットワークで JGroups を使用する場合やマルチキャストが使用できない場合は、TCP を選択するとよいでしょう。

事前設定されたスタックを使用できますが、システムの要件に合うように独自に定義をすることもできます。使用できるプロトコルとそれらの属性については、以下の項を参照してください。

24.2.2. デフォルトの JGroups チャネルが TCP を使用するよう設定

デフォルトでは、クラスターノードは ee JGroups チャネルに設定された udp プロトコルスタックを使用して通信します。

<channels default="ee">
  <channel name="ee" stack="udp"/>
</channels>
<stacks>
  <stack name="udp">
    <transport type="UDP" socket-binding="jgroups-udp"/>
    <protocol type="PING"/>
    ...
  </stack>
  <stack name="tcp">
    <transport type="TCP" socket-binding="jgroups-tcp"/>
    <protocol type="MPING" socket-binding="jgroups-mping"/>
    ...
  </stack>
</stacks>

マルチキャストを使用した TCP の設定

一部のネットワークでは TCP のみを使用できます。以下の管理 CLI コマンドを使用して、ee チャネルが事前設定された tcp スタックを使用するようにします。

/subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcp)

このデフォルトの tcp スタックは、IP マルチキャストを使用して初期クラスターメンバーシップを検出する MPING プロトコルを使用します。

マルチキャストを使用しない TCP の設定

マルチキャストが好ましくない場合、またはセキュリティーポリシーで許可されていない場合は、TCP を使用するようにデフォルトのプロトコルスタックを変更できます。マルチキャストなしで TCP ベースのクラスターリングを設定するには、以下の手順を実行します。

  1. 以下のコマンドを実行して、ee チャネルが JGroups サブシステムで事前設定された tcp スタックを使用するように切り替えます。

    <channel name="ee" stack="tcp" cluster="ejb"/>
  2. クラスターノードの名前を設定します。

    • スタンドアロン設定モードでは、次のいずれかの手順を実行します。

      • 以下のコマンドを実行します。

        <server xmlns="urn:jboss:domain:8.0" name="node_1">
      • インスタンスの起動時にシステムプロパティー jboss.node.name に一意の名前を指定します。
    • ドメインモードでは、クラスターサーバーはサーバーのタグの host-*.xml ファイルに一覧表示されます。デフォルト設定では、以下のサーバー名を指定します。このサーバー名は、必要に応じて編集できます。

      <servers>
          <server name="server-one" group="main-server-group"/>
          <server name="server-two" group="other-server-group">
              <socket-bindings port-offset="150"/>
          </server>
      </servers>
  3. 他のクラスターメンバーを検出するには、以下のいずれかのプロトコルを選択します。

    • TCPGOSSIP: このプロトコルは、外部のゴシップルーターサービスを使用してクラスターのメンバーを検出します。これには、追加のプロセスの設定および管理が必要ですが、個々の EAP インスタンスが相互のクラスターメンバーを一覧表示しないようにすることができます。このプロトコルは、クラスターメンバーが頻繁に変更される場合に役立ちます。詳細は TCPPING を参照してください。
    • TCPPING: このプロトコルは静的クラスターメンバーシップリストを定義し、各ノードが潜在的なクラスターメンバーの一覧を表示する必要があります。このプロトコルは、クラスターメンバーアドレスが認識されており、頻繁に変更されない場合に推奨されます。詳細は、TCPGOSSIP を参照してください。

24.2.3. TCPPING の設定

この手順は TCPPING プロトコルを使用する新しい JGroups スタックを作成し、静的クラスターメンバーシップのリストを定義します。ベーススクリプトは、tcpping スタックを作成し、この新しいスタックを使用するようデフォルトの ee チャネルを設定します。このスクリプトの管理 CLI コマンドは環境に合わせてカスタマイズする必要があり、バッチで処理されます。

  1. 以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。

    # Define the socket bindings
    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=jgroups-host-a:add(host=HOST_A,port=7600)
    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=jgroups-host-b:add(host=HOST_B,port=7600)
    batch
    # Add the tcpping stack
    /subsystem=jgroups/stack=tcpping:add
    /subsystem=jgroups/stack=tcpping/transport=TCP:add(socket-binding=jgroups-tcp)
    /subsystem=jgroups/stack=tcpping/protocol=TCPPING:add(socket-bindings=[jgroups-host-a,jgroups-host-b])
    /subsystem=jgroups/stack=tcpping/protocol=MERGE3:add
    /subsystem=jgroups/stack=tcpping/protocol=FD_SOCK:add
    /subsystem=jgroups/stack=tcpping/protocol=FD_ALL:add
    /subsystem=jgroups/stack=tcpping/protocol=VERIFY_SUSPECT:add
    /subsystem=jgroups/stack=tcpping/protocol=pbcast.NAKACK2:add
    /subsystem=jgroups/stack=tcpping/protocol=UNICAST3:add
    /subsystem=jgroups/stack=tcpping/protocol=pbcast.STABLE:add
    /subsystem=jgroups/stack=tcpping/protocol=pbcast.GMS:add
    /subsystem=jgroups/stack=tcpping/protocol=MFC:add
    /subsystem=jgroups/stack=tcpping/protocol=FRAG2:add
    # Set tcpping as the stack for the ee channel
    /subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcpping)
    run-batch
    reload

    定義されたプロトコルの順番が重要になることに注意してください。また、add-index の値を add コマンドに渡すと、特定のインデックスでプロトコルを挿入できます。インデックスはゼロベースであるため、以下の管理 CLI コマンドは UNICAST3 プロトコルを 7 つ目のプロトコルとして追加します。

    /subsystem=jgroups/stack=tcpping/protocol=UNICAST3:add(add-index=6)
  2. 環境に合わせてスクリプトを変更します。

    • 管理対象ドメインで実行している場合は、/subsystem=jgroups コマンドの前に /profile=PROFILE_NAME を追加し、更新するプロファイルを指定する必要があります。
    • 以下のプロパティーを環境に合わせて調整します。

      • socket-bindings: ウェルノウンとして見なされ、最初のメンバーシップの検索に利用できるホストとポートの組み合わせのコンマ区切りリスト。ソケットバインディングの定義に関する詳細は、ソケットバインディングの設定 を参照してください
      • initial_hosts: ウェルノウンとして見なされ、最初のメンバーシップの検索に使用できる HOST[PORT] という構文を使用したホストとポートの組み合わせのコンマ区切りリスト (例: host1[1000],host2[2000])。
      • port_range: このプロパティーは、 initial_hosts ポート範囲を指定した値の分拡張するために使用されます。たとえば、initial_hostshost1[1000],host2[2000] に設定し、port_range1 に設定した場合 initial_hosts 設定は host1[1000],host1[1001],host2[2000],host2[2001] に拡張されます。このプロパティーは initial_hosts プロパティーと併用した場合のみ有効です。
  3. スクリプトファイルを管理 CLI に渡してスクリプトを実行します。

    $ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME

TCPPING スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。

24.2.3.1. スタンドアロンモードでの TCPPING の設定

この手順では、スタンドアロンモードでクラスター化されたアプリケーションの TCP スタックおよびノードを設定するのに役立ちます。

手順

  1. JGroups サブシステムで、デフォルトのスタックを udp から tcp に変更します。

    <channel name="ee" stack="tcp" cluster="ejb"/>
  2. デフォルトの MPING プロトコルの代わりに TCPPING プロトコルを使用するように TCP スタックを設定します。以下のコードでは、initial_hosts プロパティーはクラスター内の全ノードのリストに相関し、7600 は設定および環境に応じて異なるデフォルトの jgroups-tcp ポートを示します。

    <stack name="tcp">
      <transport type="TCP" socket-binding="jgroups-tcp"/>
      <protocol type="TCPPING">
        <property name="initial_hosts">192.168.1.5[7600],192.168.1.9[7600]</property>
        <property name="port_range">0</property>
      </protocol>
      <protocol type="MERGE3"/>
      <protocol type="FD_SOCK" socket-binding="jgroups-tcp-fd"/>
      <protocol type="FD_ALL"/>
      <protocol type="VERIFY_SUSPECT"/>
      <protocol type="pbcast.NAKACK2"/>
      <protocol type="UNICAST3"/>
      <protocol type="pbcast.STABLE"/>
      <protocol type="pbcast.GMS"/>
      <protocol type="MFC"/>
      <protocol type="FRAG3"/>
    </stack>
    注記

    initial_hosts に設定されたポート番号 7600 は、jgroups-tcp ソケットバインディング定義で定義されたポート番号と同じでなければなりません。ソケットバインディングに port-offset 機能を使用する場合は、initial_hosts のオフセットの後に同じ値を指定する必要があります。

  3. JGroups コンポーネントによって使用されるプライベートインターフェイスの IP アドレスを設定します。IP アドレスは、 initial_hosts で指定されている IP アドレスのいずれかに関連付ける必要があります。

    <interface name="private">
      <inet-address value="${jboss.bind.address.private:192.168.1.5}"/>
    </interface>
  4. クラスター内の他のノードを設定するには、上記の手順を繰り返します。ノードが設定されたら、各ノードを起動して、クラスター化されたアプリケーションをデプロイします。

検証

  • ログを確認して、ノードが稼働しているかどうかを確認できます。

    INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2]
    INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]

24.2.3.2. ドメインモードでの TCPPING の設定

この手順では、ドメインモードでクラスター化されたアプリケーションの TCP スタックおよびノードを設定するのに役立ちます。

手順

  1. 複数のクラスターに同じプロファイルを使用する場合は、システムプロパティーの値を initial_hosts に設定します。

    <protocol type="TCPPING">
      <property name="initial_hosts">${jboss.cluster.tcp.initial_hosts}</property>
    
    Set the system property at the `server-group` level:
    <server-groups>
      <server-group name="a-server-group" profile="ha">
      <socket-binding-group ref="ha-sockets"/>
      <system-properties>
        <property name="jboss.cluster.tcp.initial_hosts" value="192.168.1.5[7600],192.168.1.9[7600]" />
      </system-properties>
  2. ホストコントローラーの XML 設定内でプライベートインターフェイスの IP アドレスを設定します。プライベートインターフェイスの IP アドレスは、 initial_hosts で指定されている IP アドレスのいずれかに関連付ける必要があります。

    <interfaces>
        ....
      <interface name="private">
        <inet-address value="${jboss.bind.address.private:192.168.1.5}"/>
      </interface>
    </interfaces>

検証

  • ログを確認して、ノードが稼働しているかどうかを確認できます。

    INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel server: [node_1|1] (2) [node_1, node_2]
    INFO  [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (thread-2,ee,node_1) ISPN000094: Received new cluster view for channel web: [node_1|1] (2) [node_1, node_2]

24.2.4. TCPGOSSIP の設定

この手順は、TCPGOSSIP プロトコルを使用する新しい JGroups スタックを作成し、外部ゴシップルーターを使用してクラスターのメンバーを検索します。ベーススクリプトは、tcpgossip スタックを作成し、この新しいスタックを使用するようデフォルトの ee チャネルを設定します。このスクリプトの管理 CLI コマンドは環境に合わせてカスタマイズする必要があり、バッチで処理されます。

  1. 以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。

    # Define the socket bindings
    /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=jgroups-host-a:add(host=HOST_A,port=13001)
    batch
    # Add the tcpgossip stack
    /subsystem=jgroups/stack=tcpgossip:add
    /subsystem=jgroups/stack=tcpgossip/transport=TCP:add(socket-binding=jgroups-tcp)
    /subsystem=jgroups/stack=tcpgossip/protocol=TCPGOSSIP:add(socket-bindings=[jgroups-host-a])
    /subsystem=jgroups/stack=tcpgossip/protocol=MERGE3:add
    /subsystem=jgroups/stack=tcpgossip/protocol=FD_SOCK:add
    /subsystem=jgroups/stack=tcpgossip/protocol=FD_ALL:add
    /subsystem=jgroups/stack=tcpgossip/protocol=VERIFY_SUSPECT:add
    /subsystem=jgroups/stack=tcpgossip/protocol=pbcast.NAKACK2:add
    /subsystem=jgroups/stack=tcpgossip/protocol=UNICAST3:add
    /subsystem=jgroups/stack=tcpgossip/protocol=pbcast.STABLE:add
    /subsystem=jgroups/stack=tcpgossip/protocol=pbcast.GMS:add
    /subsystem=jgroups/stack=tcpgossip/protocol=MFC:add
    /subsystem=jgroups/stack=tcpgossip/protocol=FRAG2:add
    # Set tcpgossip as the stack for the ee channel
    /subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcpgossip)
    run-batch
    reload

    定義されたプロトコルの順番が重要になることに注意してください。また、add-index の値を add コマンドに渡すと、特定のインデックスでプロトコルを挿入できます。インデックスはゼロベースであるため、以下の管理 CLI コマンドは UNICAST3 プロトコルを 7 つ目のプロトコルとして追加します。

    /subsystem=jgroups/stack=tcpgossip/protocol=UNICAST3:add(add-index=6)
  2. 環境に合わせてスクリプトを変更します。

    • 管理対象ドメインで実行している場合は、/subsystem=jgroups コマンドの前に /profile=PROFILE_NAME を追加し、更新するプロファイルを指定する必要があります。
    • 以下のプロパティーを環境に合わせて調整します。

      • socket-bindings: ウェルノウンとして見なされ、最初のメンバーシップの検索に利用できるホストとポートの組み合わせのコンマ区切りリスト。ソケットバインディングの定義に関する詳細は、ソケットバインディングの設定 を参照してください
      • initial_hosts: ウェルノウンとして見なされ、最初のメンバーシップの検索に使用できる HOST[PORT] という構文を使用したホストとポートの組み合わせのコンマ区切りリスト (例: host1[1000],host2[2000])。
      • port_range: このプロパティーは、 initial_hosts ポート範囲を指定した値の分拡張するために使用されます。たとえば、initial_hostshost1[1000],host2[2000] に設定し、port_range1 に設定した場合 initial_hosts 設定は host1[1000],host1[1001],host2[2000],host2[2001] に拡張されます。このプロパティーは initial_hosts プロパティーと併用した場合のみ有効です。
      • reconnect_interval: 接続が切断されたスタブがゴシップルーターへの再接続を試みる間隔 (ミリ秒単位)。
      • sock_conn_timeout: ソケット作成の最大時間。デフォルトは 1000 ミリ秒です。
      • sock_read_timeout: 読み取りがブロックされる最大時間 (ミリ秒単位)。0 を値として指定すると無制限にブロックされます。
  3. スクリプトファイルを管理 CLI に渡してスクリプトを実行します。

    $ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME

TCPGOSSIP スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。このスタックはゴシップルーターと使用するように設定されるため、JGroups メンバーは他のクラスターメンバーを見つけることができます。

24.2.5. JDBC_PING の設定

JDBC_PING プロトコルを使用して、クラスターでメンバーシップを管理および検出できます。

JDBC_PING はデータソースに指定されたデータベースを使用して、クラスターのメンバーを一覧表示します。

  1. クラスターメンバーシップの管理に使用するデータベースに接続するデータソースを作成します。
  2. 以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。

    batch
    # Add the JDBC_PING stack
    /subsystem=jgroups/stack=JDBC_PING:add
    /subsystem=jgroups/stack=JDBC_PING/transport=TCP:add(socket-binding=jgroups-tcp)
    /subsystem=jgroups/stack=JDBC_PING/protocol=JDBC_PING:add(data-source=ExampleDS)
    /subsystem=jgroups/stack=JDBC_PING/protocol=MERGE3:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=FD_SOCK:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=FD_ALL:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=VERIFY_SUSPECT:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=pbcast.NAKACK2:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=UNICAST3:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=pbcast.STABLE:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=pbcast.GMS:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=MFC:add
    /subsystem=jgroups/stack=JDBC_PING/protocol=FRAG2:add
    # Set JDBC_PING as the stack for the ee channel
    /subsystem=jgroups/channel=ee:write-attribute(name=stack,value=JDBC_PING)
    run-batch
    reload

    定義されたプロトコルの順番が重要になることに注意してください。また、add-index の値を add コマンドに渡すと、特定のインデックスでプロトコルを挿入できます。インデックスはゼロベースであるため、以下の管理 CLI コマンドは UNICAST3 プロトコルを 7 つ目のプロトコルとして追加します。

    /subsystem=jgroups/stack=JDBC_PING/protocol=UNICAST3:add(add-index=6)
  3. 環境に合わせてスクリプトを変更します。

    • 管理対象ドメインで実行している場合は、/subsystem=jgroups コマンドの前に /profile=PROFILE_NAME を追加し、更新するプロファイルを指定する必要があります。
    • ExampleDSを、手順 1 で定義したデータソースの名前に置き換えます。
  4. スクリプトファイルを管理 CLI に渡してスクリプトを実行します。

    $ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME

JDBC_PING スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。

JDBC_PING: https://developer.jboss.org/wiki/JDBCPING

データソースの作成: JBoss EAP データソース

24.2.6. JGroups のネットワークインターフェイスへのバインディング

デフォルトでは、JGroups は private ネットワークインターフェイスのみへバインドし、デフォルト設定でローカルホストへ示されます。クラスターリングのトラフィックはパブリックネットワークインターフェイスで公開するべきではないため、セキュリティー上の理由で JGroups は JBoss EAP の起動中に指定された -b 引数によって定義されたネットワークインターフェイスにはバインドしません。

ネットワークインターフェイスの設定方法については ネットワークおよびポート設定 の章を参照してください。

重要

セキュリティー上の理由で、JGroups はパブリックではないネットワークインターフェイスのみにバインドされる必要があります。また、パフォーマンス上の理由で JGroups トラフィックのネットワークインターフェイスは専用の VLAN (Virtual Local Area Network) の一部にすることが推奨されます。

24.2.7. クラスターのセキュア化

クラスターをセキュアに実行するには、複数の課題に対応する必要があります。

  • 承認されていないノードがクラスターに参加しないようにします。これは 認証 を要求して対処します。
  • クラスターメンバーがクラスターメンバー以外と通信しないようにします。これは メッセージの暗号化 で対処します。

24.2.7.1. 認証の設定

JGroups の認証は AUTH プロトコルによって実行されます。認証されたノードのみがクラスターに参加できるようにすることが目的です。

該当のサーバー設定ファイルに AUTH プロトコルと適切なプロパティー設定を追加します。AUTH プロトコルは pbcast.GMS プロトコルの直前に設定する必要があります。

以下は、AUTH を異なる承認トークンと使用する例になります。

AUTH とシンプルトークン
...
<protocol type="pbcast.STABLE"/>
<auth-protocol type="AUTH">
  <plain-token>
    <shared-secret-reference clear-text="my_password"/>
  </plain-token>
</auth-protocol>
<protocol type="pbcast.GMS"/>
...
AUTH とダイジェストアルゴリズムトークン

この形式は、MD5 や SHA-2 など、どのダイジェストアルゴリズムでも使用できます。JBoss EAP 7.3 でのデフォルトのダイジェストアルゴリズムは SHA-256 で、これは JVM によるサポートに必要な最強のダイジェストアルゴリズムです。多くの JVM は、追加で SHA-512 を実装します。

...
<protocol type="pbcast.STABLE"/>
<auth-protocol type="AUTH">
  <digest-token algorithm="SHA-512">
    <shared-secret-reference clear-text="my_password"/>
  </digest-token>
</auth-protocol>
<protocol type="pbcast.GMS"/>
...
AUTH と X509 トークン

この例は、elytron サブシステムで新しいキーストアを作成し、JGroups の AUTH 設定で参照します。

  1. キーストアを作成します。

    $ keytool -genkeypair -alias jgroups_key -keypass my_password -storepass my_password -storetype jks -keystore jgroups.keystore -keyalg RSA
  2. 管理 CLI を使用して、キーストアを elytron サブシステムに追加します。

    /subsystem=elytron/key-store=jgroups-token-store:add(type=jks,path=/path/to/jgroups.keystore,credential-reference={clear-text=my_password}, required=true)
  3. JGroups のスタック定義で AUTH を設定してキーストアを使用するようにします。

    ...
    <protocol type="pbcast.STABLE"/>
    <auth-protocol type="AUTH">
      <cipher-token algorithm="RSA" key-alias="jgroups_key" key-store="jgroups-token-store">
        <shared-secret-reference clear-text="my_password"/>
        <key-credential-reference clear-text="my_password"/>
      </cipher-token>
    </auth-protocol>
    <protocol type="pbcast.GMS"/>
    ...

24.2.7.2. 暗号化の設定

JGroups はクラスターのメンバーが共有する秘密鍵を使用してメッセージを暗号化します。送信元は共有する秘密鍵を使用してメッセージを暗号化し、受信先は同じ秘密鍵を使用してメッセージを復号化します。対称暗号化SYM_ENCRYPT プロトコルを使用して設定され、ノードは共有のキーストアを使用して秘密鍵を取得します。非対称暗号化ASYM_ENCRYPT プロトコルを使用して設定され、ノードは AUTH を使用して認証された後にクラスターのコーディネーターから秘密鍵を取得します。

対称暗号化の使用

SYM_ENCRYPT を使用するには、各ノードの JGroups 設定で参照されるキーストアを設定する必要があります。

  1. キーストアを作成します。

    以下のコマンドでは、VERSION を適切な JGroups JAR バージョンに置き換え、PASSWORD をキーストアパスワードに置き換えます。

    $ java -cp EAP_HOME/modules/system/layers/base/org/jgroups/main/jgroups-VERSION.jar org.jgroups.demos.KeyStoreGenerator --alg AES --size 128 --storeName defaultStore.keystore --storepass PASSWORD --alias mykey

    これにより、JGroups 設定で参照される defaultStore.keystore ファイルが生成されます。

  2. キーストアが生成されたら、2 つの方法の 1 つを使用して SYM_PROTOCOL で定義されます。

注記

SYM_ENCRYPT を使用する場合、AUTH の設定は任意です。

キーストアを直接参照して対称暗号化を使用
  1. jgroups サブシステムで SYM_ENCRYPT プロトコルを設定します。

    該当するサーバー設定ファイルに、SYM_ENCRYPT プロトコルと適切なプロパティー設定を追加します。このプロトコルは、以前作成されたキーストアを参照します。SYM_ENCRYPT プロトコルは pbcast.NAKACK2 の直前に設定する必要があります。

    <subsystem xmlns="urn:jboss:domain:jgroups:6.0">
      <stacks>
        <stack name="udp">
          <transport type="UDP" socket-binding="jgroups-udp"/>
          <protocol type="PING"/>
          <protocol type="MERGE3"/>
          <protocol type="FD_SOCK"/>
          <protocol type="FD_ALL"/>
          <protocol type="VERIFY_SUSPECT"/>
          <protocol type="SYM_ENCRYPT">
            <property name="provider">SunJCE</property>
            <property name="sym_algorithm">AES</property>
            <property name="encrypt_entire_message">true</property>
            <property name="keystore_name">/path/to/defaultStore.keystore</property>
            <property name="store_password">PASSWORD</property>
            <property name="alias">mykey</property>
          </protocol>
          <protocol type="pbcast.NAKACK2"/>
          <protocol type="UNICAST3"/>
          <protocol type="pbcast.STABLE"/>
          <protocol type="pbcast.GMS"/>
          <protocol type="UFC"/>
          <protocol type="MFC"/>
          <protocol type="FRAG2"/>
        </stack>
      </stacks>
    </subsystem>
Elytron と対称暗号化の使用
  1. 管理 CLI を使用して、対称暗号化を使用して 作成された defaultStore.keystore を参照するキーストアを elytron サブシステムに作成します。

    /subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)
  2. SYM_ENCRYPT プロトコルと適切なプロパティー設定を jgroups サブシステムに追加します。以下の設定どおり、SYM_ENCRYPT プロトコルは pbcast.NAKACK2 プロトコルの直前に設定する必要があります。

    <subsystem xmlns="urn:jboss:domain:jgroups:6.0">
      <stacks>
        <stack name="udp">
          <transport type="UDP" socket-binding="jgroups-udp"/>
          <protocol type="PING"/>
          <protocol type="MERGE3"/>
          <protocol type="FD_SOCK"/>
          <protocol type="FD_ALL"/>
          <protocol type="VERIFY_SUSPECT"/>
          <encrypt-protocol type="SYM_ENCRYPT" key-alias="mykey" key-store="jgroups-keystore">
            <key-credential-reference clear-text="PASSWORD"/>
            <property name="provider">SunJCE</property>
            <property name="encrypt_entire_message">true</property>
          </encrypt-protocol>
          <protocol type="pbcast.NAKACK2"/>
          <protocol type="UNICAST3"/>
          <protocol type="pbcast.STABLE"/>
          <protocol type="pbcast.GMS"/>
          <protocol type="UFC"/>
          <protocol type="MFC"/>
          <protocol type="FRAG2"/>
        </stack>
      </stacks>
    </subsystem>
    注記

    上記の例はクリアテキストのパスワードを使用しますが、認証情報ストアを定義して設定ファイル外部にパスワードを定義することもできます。認証情報ストアの設定に関する詳細は、How to Configure Server SecurityCredential Storeを参照してください。

非対称暗号化の使用

ASYM_ENCRYPT を使用するには AUTH プロトコルを定義する必要があります。AUTH プロトコルを jgroups サブシステムで設定する手順は、認証の設定 を参照してください。

ASYM_ENCRYPT は 2 つの方法の 1 つで設定されます。

秘密鍵を生成して非対象暗号化を使用
  1. jgroups サブシステムで ASYM_ENCRYPT プロトコルを設定します。

    該当のサーバー設定ファイルに ASYM_ENCRYPT プロトコルと適切なプロパティー設定を追加します。以下の設定どおり、ASYM_ENCRYPT プロトコルは pbcast.NAKACK2 プロトコルの直前に設定する必要があります。

    <subsystem xmlns="urn:jboss:domain:jgroups:6.0">
      <stacks>
        <stack name="udp">
          <transport type="UDP" socket-binding="jgroups-udp"/>
          <protocol type="PING"/>
          <protocol type="MERGE3"/>
          <protocol type="FD_SOCK"/>
          <protocol type="FD_ALL"/>
          <protocol type="VERIFY_SUSPECT"/>
          <protocol type="ASYM_ENCRYPT">
            <property name="encrypt_entire_message">true</property>
            <property name="sym_keylength">128</property>
            <property name="sym_algorithm">AES/ECB/PKCS5Padding</property>
            <property name="asym_keylength">512</property>
            <property name="asym_algorithm">RSA</property>
          </protocol>
          <protocol type="pbcast.NAKACK2"/>
          <protocol type="UNICAST3"/>
          <protocol type="pbcast.STABLE"/>
          <!-- Configure AUTH protocol here -->
          <protocol type="pbcast.GMS"/>
          <protocol type="UFC"/>
          <protocol type="MFC"/>
          <protocol type="FRAG2"/>
        </stack>
      </stacks>
    </subsystem>
Elytron と非対称暗号化の使用
  1. キーペアが含まれるキーストアを作成します。以下のコマンドは、mykey というエイリアスでキーストアを作成します。

    $ keytool -genkeypair -alias mykey -keyalg RSA -keysize 1024 -keystore defaultKeystore.keystore -dname "CN=localhost" -keypass secret -storepass secret
  2. 管理 CLI を使用して、defaultStore.keystore を参照するキーストアを elytron サブシステムに作成します。

    /subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)
  3. ASYM_ENCRYPT プロトコルと適切なプロパティー設定を jgroups サブシステムに追加します。以下の設定どおり、ASYM_ENCRYPT プロトコルは pbcast.NAKACK2 プロトコルの直前に設定する必要があります。

    <subsystem xmlns="urn:jboss:domain:jgroups:6.0">
      <stacks>
        <stack name="udp">
          <transport type="UDP" socket-binding="jgroups-udp"/>
          <protocol type="PING"/>
          <protocol type="MERGE3"/>
          <protocol type="FD_SOCK"/>
          <protocol type="FD_ALL"/>
          <protocol type="VERIFY_SUSPECT"/>
          <encrypt-protocol type="ASYM_ENCRYPT" key-alias="mykey" key-store="jgroups-keystore">
            <key-credential-reference clear-text="secret" />
            <property name="encrypt_entire_message">true</property>
          </encrypt-protocol>
          <protocol type="pbcast.NAKACK2"/>
          <protocol type="UNICAST3"/>
          <protocol type="pbcast.STABLE"/>
          <!-- Configure AUTH protocol here -->
          <protocol type="pbcast.GMS"/>
          <protocol type="UFC"/>
          <protocol type="MFC"/>
          <protocol type="FRAG2"/>
        </stack>
      </stacks>
    </subsystem>
    注記

    上記の例はクリアテキストのパスワードを使用しますが、認証情報ストアを定義して設定ファイル外部にパスワードを定義することもできます。認証情報ストアの設定に関する詳細は、How to Configure Server SecurityCredential Storeを参照してください。

24.2.8. JGroups スレッドプールの設定

jgroups サブシステムには defaultinternaloob、および timer スレッドプールが含まれます。これらのプールはすべての JGroups スタックに対して設定でき、ローカルノードに設定された Bean やその他のプールには影響しません。JGroup スレッドプールは、クラスター通信をサポートするために使用されます。

以下の表は、各スレッドプールに設定できる属性とデフォルト値を表しています。

スレッドプール名説明keepalive-timemax-threadsmin-threadsqueue-length

default

このプールは、帯域外としてマークされていない受信メッセージを処理するために使用されます。

60000L

300

20

100

internal

このプールは、EAP のメンテナンスに必要な内部プロセスを処理するために使用されます。

60000L

4

2

100

oob

このプールは、受信 OOB (out of band) メッセージを処理する場合に使用されます。

60000L

300

20

0

timer

このプールは、タイムバウンドスケジューラーメッセージを処理するために使用されます。

5000L

4

2

500

以下の構文を使用して、管理 CLI で JGroups スレッドプールを設定します。

/subsystem=jgroups/stack=STACK_TYPE/transport=TRANSPORT_TYPE/thread-pool=THREAD_POOL_NAME:write-attribute(name=ATTRIBUTE_NAME, value=ATTRIBUTE_VALUE)

以下は、 udp スタックの default スレッドプールで max-threads の値を 500 に設定する管理 CLI コマンドの例になります。

/subsystem=jgroups/stack=udp/transport=UDP/thread-pool=default:write-attribute(name="max-threads", value="500")

24.2.9. JGroups の送受信バッファーの設定

バッファーサイズ警告の解決

デフォルトでは、JGroups は特定の送受信バッファー値で設定されています。しかし、可能なバッファーサイズがオペレーティングシステムによって制限され、JBoss EAP が設定されたバッファー値を使用できないことがあります。このような場合、以下と似た警告が JBoss EAP のログに記録されます。

WARNING [org.jgroups.protocols.UDP] (ServerService Thread Pool -- 68)
JGRP000015: the send buffer of socket DatagramSocket was set to 640KB, but the OS only allocated 212.99KB.
This might lead to performance problems. Please set your max send buffer in the OS correctly (e.g. net.core.wmem_max on Linux)
WARNING [org.jgroups.protocols.UDP] (ServerService Thread Pool -- 68)
JGRP000015: the receive buffer of socket DatagramSocket was set to 20MB, but the OS only allocated 212.99KB.
This might lead to performance problems. Please set your max receive buffer in the OS correctly (e.g. net.core.rmem_max on Linux)

これに対応するには、オペレーティングシステムのマニュアルでバッファーサイズを増やす方法を参照してください。Red Hat Enterprise Linux システムの場合は、root ユーザーとして /etc/sysctl.conf を編集し、システムの再起動後も維持されるバッファーサイズの最大値を設定します。以下に例を示します。

# Allow a 25MB UDP receive buffer for JGroups
net.core.rmem_max = 26214400
# Allow a 1MB UDP send buffer for JGroups
net.core.wmem_max = 1048576

/etc/sysctl.conf を編集後、sysctl -p を実行して変更を反映します。

JGroups バッファーサイズの設定

以下のトランスポートプロパティーを UDP および TCP JGroups スタックに設定すると、JBoss EAP が使用する JGroups バッファーサイズを設定できます。

UDP スタック
  • ucast_recv_buf_size
  • ucast_send_buf_size
  • mcast_recv_buf_size
  • mcast_send_buf_size
TCP スタック
  • recv_buf_size
  • send_buf_size

JGroups バッファーサイズは、管理コンソールまたは管理 CLI を使用して設定できます。

以下の構文を使用して、管理 CLI で JGroups バッファーサイズプロパティーを設定します。

/subsystem=jgroups/stack=STACK_NAME/transport=TRANSPORT/property=PROPERTY_NAME:add(value=BUFFER_SIZE)

以下は、tcp スタックで recv_buf_size プロパティーを 20000000 に設定する管理 CLI コマンドの例になります。

/subsystem=jgroups/stack=tcp/transport=TRANSPORT/property=recv_buf_size:add(value=20000000)

JGroups バッファーサイズは管理コンソールを使用して設定することもできます。 Configuration タブで JGroups サブシステムを選択し、表示 をクリックして Stack タブを選択し、該当するスタックを選びます。 Transport をクリックし、 Properties フィールドを編集します。

24.2.10. JGroups サブシステムの調整

jgroups サブシステムのパフォーマンスを監視および最適化するための情報は、パフォーマンスチューニングガイドJGroups サブシステムの調整の項を参照してください。

24.2.11. JGroups トラブルシューティング

24.2.11.1. ノードがクラスターを形成しない

マシンで IP マルチキャストが正しくセットアップされていることを確認します。JBoss EAP には、IP マルチキャストのテストに使用できる McastReceiverTestMcastSenderTest の 2 つのテストプログラムが含まれています。

ターミナルで McastReceiverTest を開始します。

$ java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastReceiverTest -mcast_addr 230.11.11.11 -port 5555

別のターミナルウインドウで McastSenderTest を開始します。

$ java -cp EAP_HOME/bin/client/jboss-client.jar org.jgroups.tests.McastSenderTest -mcast_addr 230.11.11.11 -port 5555

特定のネットワークインターフェイスカード (NIC) をバインドする場合は、-bind_addr YOUR_BIND_ADDRESS を使用します。YOUR_BIND_ADDRESS はバインドする NIC の IP アドレスに置き換えます。送信側と受信側の両方にこのパラメーターを使用します。

McastSenderTest ターミナルウインドウで入力すると McastReceiverTest ウインドウに出力が表示されます。表示されない場合は以下の手順に従います。

  • 送信側のコマンドに -ttl VALUE を追加して、マルチキャストパケットの TTL (time-to-live) を増やします。このテストプログラムによって使用されるデフォルトの値は 32 で、VALUE255 以下である必要があります。
  • マシンに複数のインターフェイスがある場合は、適切なインターフェイスを使用していることを確認します。
  • システム管理者に連絡し、マルチキャストが選択したインターフェイスで動作することを確認します。

クラスターの各マシンでマルチキャストが適切に動作したら、送信側と受信側を別々のマシンに配置し、テストを繰り返します。

24.2.11.2. 障害検出での不明なハートビートの原因

ハートビートの確認が一定時間 (T) 受信されないと、障害検出 (FD) によってクラスターメンバーが原因として疑われることがあります。T は timeout および max_tries によって定義されます。

たとえば、ノード A、B、C、および D のクラスターがあり、A が B、B が C、C が D、D が A を ping する場合、以下のいずれかの理由で C が疑われます。

  • B または C が CPU の使用率が 100% の状態で T 秒よりも長く稼働している場合。この場合、 C がハートビート確認を B に送信しても CPU の使用率が 100% であるため B が確認を処理できないことがあります。
  • B または C がガベッジコレクションを実行している場合、上記と同じ結果になります。
  • 上記 2 件の組み合わせ。
  • ネットワークによるパケットの損失が発生する場合。通常、ネットワークに大量のトラフィックがあり、スイッチがパケットを破棄すると発生します (通常は最初にブロードキャスト、次に IP マルチキャスト、そして最後に TCP パケットが破棄されます)。
  • B または C がコールバックを処理する場合。C が処理に T + 1 秒かかるリモートメソッド呼び出しをチャネル上で受信した場合、C はハートビートを含む他のメッセージを処理できません。そのため、B はハートビート確認を受信せず、C が疑われます。