22.2. JGroups を用いたクラスター通信
22.2.1. JGroups リンクのコピーリンクがクリップボードにコピーされました!
JGroups は信頼できるメッセージングのためのツールキットで、お互いにメッセージを送信するノードを持つクラスターを作成するために使用できます。
jgroups サブシステムは JBoss EAP で高可用性サービスのグループ通信サポートを提供します。これにより、名前付きのチャネルおよびプロトコルスタックを設定でき、チャネルのランタイム統計を表示することもできます。jgroups サブシステムは高可用性の機能を提供する設定を使用する場合に使用できます (マネージドドメインでは ha や full-ha プロファイル、スタンドアロンサーバーは standalone-ha.xml や standalone-full-ha.xml 設定ファイルなど)。
JBoss EAP には 2 つの JGroups スタックが事前に設定されています。
- udp
- クラスターのノードは UDP (User Datagram Protocol) マルチキャストを使用してお互いに通信します。これはデフォルトのスタックです。
- tcp
- クラスターのノードは TCP (Transmission Control Protocol) を使用してお互いに通信します。
TCP はエラー検出、パケットの順序付け、および輻輳制御を自身で処理するため、オーバーヘッドが大きく、UDP よりも遅いと見なされることが多々あります。JGroups は UDP のこれらの機能を処理しますが、TCP はこれらの機能を独自で処理します。信頼できないネットワークや輻輳度の高いネットワークで JGroups を使用する場合やマルチキャストが使用できない場合は、TCP を選択するとよいでしょう。
事前設定されたスタックを使用できますが、システムの要件に合うように独自に定義をすることもできます。使用できるプロトコルとそれらの属性は、以下の項を参照してください。
22.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>
22.2.2.1. マルチキャストを使用した TCP の設定 リンクのコピーリンクがクリップボードにコピーされました!
一部のネットワークでは TCP のみを使用できます。
手順
以下の管理 CLI コマンドを使用して、
eeチャネルが事前設定されたtcpスタックを使用するようにします。/subsystem=jgroups/channel=ee:write-attribute(name=stack,value=tcp)このデフォルトの
tcpスタックは、IP マルチキャストを使用して初期クラスターメンバーシップを検出するMPINGプロトコルを使用します。
22.2.2.2. マルチキャストを使用しない TCP の設定 リンクのコピーリンクがクリップボードにコピーされました!
マルチキャストが好ましくない場合、またはセキュリティーポリシーで許可されていない場合は、マルチキャストなしで TCP を使用するようにデフォルトのプロトコルスタックを変更できます。
手順
マルチキャストなしで TCP ベースのクラスタリングを設定するには、以下の手順を実行します。
以下のコマンドを実行して、
eeチャネルが JGroups サブシステムで事前設定されたtcpスタックを使用するように切り替えます。<channel name="ee" stack="tcp" cluster="ejb"/>クラスターノードの名前を設定します。
スタンドアロン設定モードでは、次のいずれかの手順を実行します。
以下のコマンドを実行します。
<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>
他のクラスターメンバーを検出するには、以下のいずれかのプロトコルを選択します。
-
TCPGOSSIP: このプロトコルは、外部のゴシップルーターサービスを使用してクラスターのメンバーを検出します。これには、追加のプロセスの設定および管理が必要ですが、個々の EAP インスタンスが相互のクラスターメンバーを一覧表示しないようにすることができます。このプロトコルは、クラスターメンバーが頻繁に変更される場合に役立ちます。詳細は TCPPING を参照してください。 -
TCPPING: このプロトコルは静的クラスターメンバーシップリストを定義し、各ノードが潜在的なクラスターメンバーの一覧を表示する必要があります。このプロトコルは、クラスターメンバーアドレスが認識されており、頻繁に変更されない場合に推奨されます。詳細は、TCPGOSSIP を参照してください。
-
22.2.3. TCPPING の設定 リンクのコピーリンクがクリップボードにコピーされました!
この手順は TCPPING プロトコルを使用する新しい JGroups スタックを作成し、静的クラスターメンバーシップのリストを定義します。ベーススクリプトは、tcpping スタックを作成し、この新しいスタックを使用するようデフォルトの ee チャネルを設定します。このスクリプトの管理 CLI コマンドは環境に合わせてカスタマイズする必要があり、バッチで処理されます。
手順
以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。
# 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=FRAG3: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)環境に合わせてスクリプトを変更します。
-
マネージドドメインで実行している場合は、
/subsystem=jgroupsコマンドの前に/profile=PROFILE_NAMEを追加し、更新するプロファイルを指定する必要があります。 以下のプロパティーを環境に合わせて調整します。
-
socket-bindings: ウェルノウンとして見なされ、最初のメンバーシップの検索に利用できるホストとポートの組み合わせのコンマ区切りリスト。ソケットバインディングの定義の詳細は、ソケットバインディングの設定 を参照してください。 -
initial_hosts: ウェルノウンとして見なされ、最初のメンバーシップの検索に使用できるHOST[PORT]という構文を使用したホストとポートの組み合わせのコンマ区切りリスト (例:host1[1000],host2[2000])。 -
port_range: このプロパティーは、initial_hostsポート範囲を指定した値の分拡張するために使用されます。たとえば、initial_hostsをhost1[1000],host2[2000]に設定し、port_rangeを1に設定した場合initial_hosts設定はhost1[1000],host1[1001],host2[2000],host2[2001]に拡張されます。このプロパティーはinitial_hostsプロパティーと併用した場合のみ有効です。
-
-
マネージドドメインで実行している場合は、
スクリプトファイルを管理 CLI に渡してスクリプトを実行します。
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
TCPPING スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。
22.2.3.1. スタンドアロンモードでの TCPPING の設定 リンクのコピーリンクがクリップボードにコピーされました!
この手順では、スタンドアロンモードでクラスター化されたアプリケーションの TCP スタックおよびノードを設定するのに役立ちます。
手順
JGroups サブシステムで、デフォルトのスタックを
udpからtcpに変更します。<channel name="ee" stack="tcp" cluster="ejb"/>デフォルトの 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のオフセットの後に同じ値を指定する必要があります。JGroups コンポーネントによって使用されるプライベートインターフェイスの IP アドレスを設定します。IP アドレスは、
initial_hostsで指定されている IP アドレスのいずれかに関連付ける必要があります。<interface name="private"> <inet-address value="${jboss.bind.address.private:192.168.1.5}"/> </interface>- クラスター内の他のノードを設定するには、上記の手順を繰り返します。ノードが設定されたら、各ノードを起動して、クラスター化されたアプリケーションをデプロイします。
検証
ログを確認して、ノードが稼働しているかどうかを確認できます。
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]
22.2.3.2. ドメインモードでの TCPPING の設定 リンクのコピーリンクがクリップボードにコピーされました!
この手順では、ドメインモードでクラスター化されたアプリケーションの TCP スタックおよびノードを設定するのに役立ちます。
手順
複数のクラスターに同じプロファイルを使用する場合は、システムプロパティーの値を
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>ホストコントローラーの 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]
22.2.4. TCPGOSSIP の設定 リンクのコピーリンクがクリップボードにコピーされました!
この手順は、TCPGOSSIP プロトコルを使用する新しい JGroups スタックを作成し、外部ゴシップルーターを使用してクラスターのメンバーを検索します。ベーススクリプトは、tcpgossip スタックを作成し、この新しいスタックを使用するようデフォルトの ee チャネルを設定します。このスクリプトの管理 CLI コマンドは環境に合わせてカスタマイズする必要があり、バッチで処理されます。
手順
以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。
# 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=FRAG3: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)環境に合わせてスクリプトを変更します。
-
マネージドドメインで実行している場合は、
/subsystem=jgroupsコマンドの前に/profile=PROFILE_NAMEを追加し、更新するプロファイルを指定する必要があります。 以下のプロパティーを環境に合わせて調整します。
-
socket-bindings: ウェルノウンとして見なされ、最初のメンバーシップの検索に利用できるホストとポートの組み合わせのコンマ区切りリスト。ソケットバインディングの定義の詳細は、ソケットバインディングの設定 を参照してください。 -
initial_hosts: ウェルノウンとして見なされ、最初のメンバーシップの検索に使用できるHOST[PORT]という構文を使用したホストとポートの組み合わせのコンマ区切りリスト (例:host1[1000],host2[2000])。 -
port_range: このプロパティーは、initial_hostsポート範囲を指定した値の分拡張するために使用されます。たとえば、initial_hostsをhost1[1000],host2[2000]に設定し、port_rangeを1に設定した場合initial_hosts設定はhost1[1000],host1[1001],host2[2000],host2[2001]に拡張されます。このプロパティーはinitial_hostsプロパティーと併用した場合のみ有効です。 -
reconnect_interval: 接続が切断されたスタブがゴシップルーターへの再接続を試みる間隔 (ミリ秒単位)。 -
sock_conn_timeout: ソケット作成の最大時間。デフォルトは1000ミリ秒です。 -
sock_read_timeout: 読み取りがブロックされる最大時間 (ミリ秒単位)。0を値として指定すると無制限にブロックされます。
-
-
マネージドドメインで実行している場合は、
スクリプトファイルを管理 CLI に渡してスクリプトを実行します。
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
TCPGOSSIP スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。このスタックはゴシップルーターと使用するように設定されるため、JGroups メンバーは他のクラスターメンバーを見つけることができます。
22.2.5. JDBC_PING の設定 リンクのコピーリンクがクリップボードにコピーされました!
JDBC_PING プロトコルを使用して、クラスターでメンバーシップを管理および検出できます。
JDBC_PING はデータソースに指定されたデータベースを使用して、クラスターのメンバーをリスト表示します。
手順
- クラスターメンバーシップの管理に使用するデータベースに接続するデータソースを作成します。
以下のスクリプトをテキストエディターにコピーし、ローカルファイルシステムに保存します。
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=FRAG3: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)環境に合わせてスクリプトを変更します。
-
マネージドドメインで実行している場合は、
/subsystem=jgroupsコマンドの前に/profile=PROFILE_NAMEを追加し、更新するプロファイルを指定する必要があります。 - 'ExampleDS' を、手順 1 で定義したデータソースの名前に置き換えます。
-
マネージドドメインで実行している場合は、
スクリプトファイルを管理 CLI に渡してスクリプトを実行します。
$ EAP_HOME/bin/jboss-cli.sh --connect --file=/path/to/SCRIPT_NAME
JDBC_PING スタックが使用できるようになり、ネットワークの通信に TCP が使用されます。
22.2.6. JGroups のネットワークインターフェイスへのバインディング リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、JGroups は private ネットワークインターフェイスのみへバインドし、デフォルト設定でローカルホストへ示されます。クラスタリングのトラフィックはパブリックネットワークインターフェイスで公開するべきではないため、セキュリティー上の理由で JGroups は JBoss EAP の起動中に指定された -b 引数によって定義されたネットワークインターフェイスにはバインドしません。
ネットワークインターフェイスの設定方法は、ネットワークおよびポート設定 の章を参照してください。
セキュリティー上の理由で、JGroups はパブリックではないネットワークインターフェイスのみにバインドされる必要があります。また、パフォーマンス上の理由で JGroups トラフィックのネットワークインターフェイスは専用の VLAN (Virtual Local Area Network) の一部にすることが推奨されます。
22.2.7. クラスターの保護 リンクのコピーリンクがクリップボードにコピーされました!
クラスターをセキュアに実行するには、複数の課題に対応する必要があります。
22.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 8.0 のデフォルトのダイジェストアルゴリズムは 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 設定で参照します。
キーストアを作成します。
$ keytool -genkeypair -alias jgroups_key -keypass my_password -storepass my_password -storetype jks -keystore jgroups.keystore -keyalg RSA管理 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)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"/> ...
22.2.7.2. 暗号化の設定 リンクのコピーリンクがクリップボードにコピーされました!
JGroups はクラスターのメンバーが共有する秘密鍵を使用してメッセージを暗号化します。送信元は共有する秘密鍵を使用してメッセージを暗号化し、受信先は同じ秘密鍵を使用してメッセージを復号化します。対称暗号化 は SYM_ENCRYPT プロトコルを使用して設定され、ノードは共有のキーストアを使用して秘密鍵を取得します。非対称暗号化 は ASYM_ENCRYPT プロトコルを使用して設定され、ノードは AUTH を使用して認証された後にクラスターのコーディネーターから秘密鍵を取得します。
対称暗号化の使用
SYM_ENCRYPT を使用するには、各ノードの JGroups 設定で参照されるキーストアを設定する必要があります。
キーストアを作成します。
以下のコマンドでは、
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 つの方法の 1 つを使用して
SYM_PROTOCOLで定義されます。- キーストアを 直接設定に 定義します。
- Elytron サブシステムを使用 してキーストアを参照します。
SYM_ENCRYPT を使用する場合、AUTH の設定は任意です。
キーストアの直接参照による対称暗号化の使用
jgroupsサブシステムでSYM_ENCRYPTプロトコルを設定します。該当するサーバー設定ファイルに、
SYM_ENCRYPTプロトコルと適切なプロパティー設定を追加します。このプロトコルは、以前作成されたキーストアを参照します。SYM_ENCRYPTプロトコルはpbcast.NAKACK2の直前に設定する必要があります。<subsystem xmlns="{JgroupsSubsystemNamespace}"> <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="FRAG3"/> </stack> </stacks> </subsystem>
Elytron と対称暗号化の使用
管理 CLI を使用して、
対称暗号化を使用して作成されたdefaultStore.keystoreを参照するキーストアを elytron サブシステムに作成します。/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)SYM_ENCRYPTプロトコルと適切なプロパティー設定をjgroupsサブシステムに追加します。以下の設定どおり、SYM_ENCRYPTプロトコルはpbcast.NAKACK2プロトコルの直前に設定する必要があります。<subsystem xmlns="{JgroupsSubsystemNamespace}"> <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="FRAG3"/> </stack> </stacks> </subsystem>注記上記の例はクリアテキストのパスワードを使用しますが、認証情報ストアを定義して設定ファイル外部にパスワードを定義することもできます。認証情報ストアの設定に関する詳細は、サーバーセキュリティーの設定方法 の 認証情報ストア を参照してください。
非対称暗号化の使用
ASYM_ENCRYPT を使用するには AUTH プロトコルを定義する必要があります。AUTH プロトコルを jgroups サブシステムで設定する手順は、認証の設定 セクションを参照してください。
ASYM_ENCRYPT は 2 つの方法の 1 つで設定されます。
- 秘密鍵を生成し、設定で直接 参照します。
- キーストアを作成し、Elytron サブシステムを使用して 参照します。
シークレット鍵の生成による非対象暗号化の使用
jgroupsサブシステムでASYM_ENCRYPTプロトコルを設定します。該当のサーバー設定ファイルに
ASYM_ENCRYPTプロトコルと適切なプロパティー設定を追加します。以下の設定どおり、ASYM_ENCRYPTプロトコルはpbcast.NAKACK2プロトコルの直前に設定する必要があります。<subsystem xmlns="{JgroupsSubsystemNamespace}"> <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="FRAG3"/> </stack> </stacks> </subsystem>
Elytron での非対称暗号化の使用
キーペアが含まれるキーストアを作成します。以下のコマンドは、
mykeyというエイリアスでキーストアを作成します。$ keytool -genkeypair -alias mykey -keyalg RSA -keysize 1024 -keystore defaultKeystore.keystore -dname "CN=localhost" -keypass secret -storepass secret管理 CLI を使用して、
defaultStore.keystoreを参照するキーストアをelytronサブシステムに作成します。/subsystem=elytron/key-store=jgroups-keystore:add(path=/path/to/defaultStore.keystore,credential-reference={clear-text=PASSWORD},type=JCEKS)ASYM_ENCRYPTプロトコルと適切なプロパティー設定をjgroupsサブシステムに追加します。以下の設定どおり、ASYM_ENCRYPTプロトコルはpbcast.NAKACK2プロトコルの直前に設定する必要があります。<subsystem xmlns="{JgroupsSubsystemNamespace}"> <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="FRAG3"/> </stack> </stacks> </subsystem>注記上記の例はクリアテキストのパスワードを使用しますが、認証情報ストアを定義して設定ファイル外部にパスワードを定義することもできます。認証情報ストアの設定に関する詳細は、サーバーセキュリティーの設定方法 の 認証情報ストア を参照してください。
22.2.8. JGroups スレッドプールの設定 リンクのコピーリンクがクリップボードにコピーされました!
jgroups サブシステムには default、internal、oob、および timer スレッドプールが含まれます。これらのプールはすべての JGroups スタックに対して設定でき、ローカルノードに設定された Bean やその他のプールには影響しません。JGroup スレッドプールは、クラスター通信をサポートするために使用されます。
以下の表は、各スレッドプールに設定できる属性とデフォルト値を表しています。
| スレッドプール名 | 説明 | keepalive-time | max-threads | min-threads | queue-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")
22.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 フィールドを編集します。
22.2.10. JGroups サブシステムのチューニング リンクのコピーリンクがクリップボードにコピーされました!
jgroups サブシステムのパフォーマンスを監視および最適化するためのヒントは、JBoss EAP のパフォーマンスチューニング の JGroups サブシステムのチューニング セクションを参照してください。
22.2.11. JGroups トラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
22.2.11.1. ノードがクラスターを形成しない リンクのコピーリンクがクリップボードにコピーされました!
マシンで IP マルチキャストが正しくセットアップされていることを確認します。JBoss EAP には、IP マルチキャストのテストに使用できる McastReceiverTest と McastSenderTest の 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で、VALUEは255以下である必要があります。 - マシンに複数のインターフェイスがある場合は、適切なインターフェイスを使用していることを確認します。
- システム管理者に連絡し、マルチキャストが選択したインターフェイスで動作することを確認します。
クラスターの各マシンでマルチキャストが適切に動作したら、送信側と受信側を別々のマシンに配置し、テストを繰り返します。
22.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 が疑われます。