クラスタリングメトリクス

Keycloakノード間の通信を監視するメトリクスについて学びます。

前提条件

  • Keycloakでメトリクスを有効にする必要があります。詳細については、メトリクスによる洞察の獲得ガイドに従ってください。

  • メトリクスを収集する監視システム。

メトリクス

複数のKeycloakノードをデプロイすることで、ノード間で負荷を分散できますが、これにはノード間の通信が必要です。このセクションでは、起こりうる障害を特定するためにKeycloak間の通信を監視するのに役立つメトリクスについて説明します。

これは、シングルサイトデプロイメントにのみ関連します。マルチサイトデプロイメントで説明されているように、マルチサイトが使用されている場合、Keycloakノードはクラスタ化されないため、ノード間に直接的な通信はありません。

グローバルタグ

cluster=<name>

クラスタ名。複数のクラスタからのメトリクスが収集されている場合、このタグはそれらがどこに属しているかを識別するのに役立ちます。

node=<node>

メトリクスを報告するノードの名前。

vendor_jgroups_ がプレフィックスとして付いたすべてのメトリクス名は、トラブルシューティングとデバッグ目的でのみ提供されています。メトリクス名は、Keycloakの今後のリリースで予告なく変更される可能性があります。したがって、ダッシュボードや監視およびアラートでの使用は推奨しません。

応答時間

次のメトリクスは、リモートリクエストの応答時間を公開します。応答時間は2つのノード間で測定され、処理時間を含みます。すべてのリクエストはこれらのメトリクスによって測定され、応答時間はクラスタのライフサイクルを通じて安定している必要があります。

健全なクラスタでは、応答時間は安定したままです。応答時間の増加は、クラスタの劣化または高負荷状態のノードを示している可能性があります。

タグ

node=<node>

送信元ノードを識別します。

target_node=<node>

受信ノードを識別します。

メトリクス 説明

vendor_jgroups_stats_sync_requests_seconds_count

受信ノードへの同期リクエストの数。

vendor_jgroups_stats_sync_requests_seconds_sum

受信ノードへの同期リクエストの合計時間

ヒストグラムが有効になっている場合、パーセンタイルバケットが利用可能です。これらはヒートマップを作成するのに役立ちますが、パーセンタイルバケットを収集および公開すると、デプロイメントのパフォーマンスに悪影響を与える可能性があります。

帯域幅

Keycloakによって受信および送信されたすべてのバイトは、これらのメトリクスによって収集されます。また、ハートビートなどのすべての内部メッセージもカウントされます。これらにより、各ノードで現在使用されている帯域幅を計算できます。

メトリクス名は、使用中のJGroupsトランスポートプロトコルによって異なります。
メトリクス プロトコル 説明

vendor_jgroups_tcp_get_num_bytes_received

TCP

ノードが受信したバイト数の合計。

vendor_jgroups_udp_get_num_bytes_received

UDP

vendor_jgroups_tunnel_get_num_bytes_received

TUNNEL

vendor_jgroups_tcp_get_num_bytes_sent

TCP

ノードが送信したバイト数の合計。

vendor_jgroups_tunnel_get_num_bytes_sent

UDP

vendor_jgroups_tunnel_get_num_bytes_sent

TUNNEL

スレッドプール

スレッドプールのサイズを監視することは、ノードが高負荷状態にあることを示す良い指標です。受信したすべてのリクエストは処理のためにスレッドプールに追加され、スレッドプールが満杯になると、リクエストは破棄されます。再送信メカニズムにより、リソース使用量が増加しても信頼性の高い通信が保証されます。

健全なクラスタでは、スレッドプールが最大サイズ(デフォルトでは 200 スレッド)に近づくことはありません。
スレッドプールのメトリクスは、仮想スレッドでは利用できません。仮想スレッドは、OpenJDK 21で実行している場合、デフォルトで有効になっています。
メトリクス名は、使用中のJGroupsトランスポートプロトコルによって異なります。デフォルトのトランスポートプロトコルはTCPです。
メトリクス プロトコル 説明

vendor_jgroups_tcp_get_thread_pool_size

TCP

スレッドプール内の現在のスレッド数。

vendor_jgroups_udp_get_thread_pool_size

UDP

vendor_jgroups_tunnel_get_thread_pool_size

TUNNEL

vendor_jgroups_tcp_get_largest_size

TCP

これまで同時にプール内に存在したスレッドの最大数。

vendor_jgroups_udp_get_largest_size

UDP

vendor_jgroups_tunnel_get_largest_size

TUNNEL

フロー制御

フロー制御は、メッセージ送信者のレートを最も遅い受信者のレートに時間経過とともに調整します。これは、クレジットベースのシステムを通じて実装され、各送信者は送信時にクレジットを減らします。クレジットが0を下回ると送信者はブロックされ、受信者から補充メッセージを受信したときにのみメッセージの送信を再開します。

以下のメトリクスは、ブロックされたメッセージの数と平均ブロック時間を示しています。値がゼロと異なる場合、受信者が過負荷状態であり、クラスタのパフォーマンスが低下している可能性があることを示している場合があります。

各ノードには、ユニキャストメッセージ用の UFC とマルチキャストメッセージ用の MFC の2つの独立したフロー制御プロトコルがあります。

健全なクラスタは、すべてのメトリクスでゼロの値を示します。
メトリクス 説明

vendor_jgroups_ufc_get_number_of_blockings

フロー制御がユニキャストメッセージの送信者をブロックした回数。

vendor_jgroups_ufc_get_average_time_blocked

ユニキャストメッセージを送信しようとしたときにフロー制御でブロックされた平均時間(ミリ秒単位)。

vendor_jgroups_mfc_get_number_of_blockings

フロー制御がマルチキャストメッセージの送信者をブロックした回数。

vendor_jgroups_mfc_get_average_time_blocked

マルチキャストメッセージを送信しようとしたときにフロー制御でブロックされた平均時間(ミリ秒単位)。

再送信

JGroupsは、メッセージの信頼性の高い配信を提供します。メッセージがネットワーク上でドロップされた場合、または受信者がメッセージを処理できない場合、再送信が必要になります。再送信はリソース使用量を増やし、通常はシステムの過負荷の兆候です。

ランダム早期ドロップ(RED)は、送信者キューを監視します。キューがほぼ満杯になると、メッセージはドロップされ、再送信が発生する必要があります。これにより、スレッドが満杯の送信者キューによってブロックされるのを防ぎます。

健全なクラスタは、すべてのメトリクスでゼロの値を示します。
メトリクス 説明

vendor_jgroups_unicast3_get_num_xmits

再送信されたメッセージの数。

vendor_jgroups_red_get_dropped_messages

送信者によってドロップされたメッセージの総数。

vendor_jgroups_red_get_drop_rate

送信者によってドロップされたすべてのメッセージの割合。

ネットワークパーティション

クラスタサイズ

クラスタサイズメトリクスは、クラスタ内に存在するノードの数を報告します。異なる場合、ノードが参加、シャットダウンしているか、最悪の場合、ネットワークパーティションが発生している可能性があります。

健全なクラスタは、すべてのノードで同じ値を示します。
メトリクス 説明

vendor_cluster_size

クラスタ内のノード数。

ネットワークパーティションイベント

クラスタ内のネットワークパーティションは、さまざまな理由で発生する可能性があります。このメトリクスは、ネットワーク分割を予測するのに役立ちませんが、ネットワーク分割が発生し、クラスタがマージされたことを示します。

健全なクラスタは、このメトリクスでゼロの値を示します。
メトリクス 説明

vendor_jgroups_merge3_get_num_merge_events

ネットワーク分割が検出されて修復された回数。

このページについて