Multi-Site Setup でサイト障害から復旧

2023年12月18日 Alexander Schwartz, Kamesh Akella 著

カスタマーアイデンティティおよびアクセス管理 (CIAM) システムにとって、高可用性は、顧客がログインするすべてのシステムに対する単一のエントリポイントであるため、不可欠です。Keycloak 23 では、マルチサイト構成について説明する、新しく更新された高可用性ガイドが提供されています。クラウドインフラストラクチャを対象とした詳細な手順とブループリントにより、これは文書化、テスト済みであり、試用する準備ができています。

新機能を見つけ出し、このセットアップがどのように評価、テスト、改善されたのかを舞台裏を覗いてみましょう。そして最後に、これがプレビュー機能でなくなる時期の見通しを提供します。

改善されたドキュメントと新しいブループリント

Keycloak のマルチサイトセットアップへの最近の更新は、重要なマイルストーンとなります。Keycloak 23 には、クラウドセットアップのブループリントを含む、マルチサイト構成で Keycloak をセットアップするための 意見の分かれるガイドが含まれています。

active passive sync.dio

このドキュメントの主要なトピックは次のとおりです。

コンセプトと構成要素の概要

これらのガイドには、Keycloak マルチサイトアーキテクチャのさまざまなコンポーネント (以下を含む) を立ち上げるためのステップバイステップの手順が含まれています。

  • Keycloak アーキテクチャのアクティブ/パッシブ セットアップはどのようなものですか?

  • 外部データベースを使用するにはどうすればよいですか?

  • これらのアーキテクチャコンポーネントごとにリソースを調整するにはどうすればよいですか?

構成要素のブループリント

Amazon Web Service 上のさまざまな構成で Keycloak をデプロイする方法に関する一連のガイド。

運用手順

これらのガイドには、ユーザーがマルチサイト Keycloak インスタンスを効率的にセットアップおよび運用できるようにするための詳細な運用手順が含まれています。

マルチサイトセットアップの検証

上記のガイドを公開する前に、ソリューションのパフォーマンス、スケーラビリティ、およびカオス テストのために、実験と再現可能な結果の両方を可能にするツールに取り組んできました。

これらのツールを使用して、まずシングルサイトセットアップをテストし、それが十分に機能することがわかったら、マルチサイトセットアップもテストしました。

これらのツールはすべてオープンソースとして利用可能であり、フィードバックを提供したり、環境で使用して独自のパフォーマンステストと回帰テストを実行したりするために、レビューにご招待します。

データセットプロバイダー

これをテスト環境の Keycloak サーバーにインストールし、パフォーマンステストを実行するために必要な数のユーザー、クライアント、グループなどを作成します。Keycloak は内部キャッシュに多くの情報をキャッシュし、データベースも同様であるため、データベースに適切な量のデータがある場合にのみ、いくつかの問題を特定できます。

ベンチマーク

これには、認証フローおよび Keycloak の管理者 REST エンドポイント用のすぐに使用できるシナリオが含まれています。まだニーズに合わない場合は、ライブラリとして使用して、既存のステップとカスタムステップに基づいて独自の Gatling シナリオを作成してください。これらのテストは JAR およびシェルスクリプトラッパーとしてデプロイされるため、ロードランナーに Java をインストールするだけで準備完了です。

専用 EC2 ロードドライバ

これらの Ansible プレイブックを使用して、Keycloak テストインストールに対して負荷をかける EC2 インスタンスのセットを起動し、結果を集計します。

AWS 上の OpenShift 自動インストール

Red Hat OpenShift Service on AWS (ROSA) に基づいて、監視、ロギング、および便利な Operator が事前構成されたインスタンスをプロビジョニングし、Keycloak をデプロイする準備をします。

Aurora 自動インストール

Aurora をリージョナルまたはグローバルのさまざまなバリアントでセットアップし、ROSA 環境に接続します。

Minikube または OpenShift 用の意見の分かれる Keycloak デプロイメント

これにより、追加の監視およびデバッグツールとともに Keycloak がデプロイされ、必要に応じてメトリクス、ログ、トレースを確認できます。

スクリプト化された AWS Route 53 ロードバランサー

アクティブ/パッシブセットアップ用に Route 53 をセットアップして、異なる OpenShift クラスター内の 2 つの Keycloak デプロイメントに負荷を分散します。

スクリプト化された Multi-AZ デプロイメント

毎週平日、GitHub アクション、パフォーマンステストスイートを使用して、Multi-AZ セットアップをゼロから新規作成し、結果を記録します。これにより、機能およびパフォーマンスの回帰が発生した場合にそれを捕捉できます。

これらのツールをすでに試用し、バグを見つけ、改善のためのアイデアを提出してくれたコミュニティの皆様に感謝いたします。

Keycloak はすべての人にとってより良くなりました

上記のツールを使用することで、Keycloak を改善する必要があるいくつかの状況を再現することができました。Keycloak 23 のシングルサイトおよびマルチサイトセットアップの両方で利用できる改善点の一部を以下に示します。

ノンブロッキング liveness プローブ

高負荷で Keycloak を実行している場合、リクエストが Keycloak インスタンスでキューに入れられる可能性があります。キューに入れられるリクエストが多いほど、リクエストへの応答に時間がかかります。以前のバージョンでは、liveness プローブ (/health/live) へのリクエストもキューに入れられ、プローブは最終的にタイムアウトし、Kubernetes が Pod を再起動しました。最新バージョンの Keycloak では、プローブは ノンブロッキングになるように再実装されているため、キューに入れられず、したがってタイムアウトせず、高負荷下でも Pod が再起動されることはありません。

ロードシェディング

上記のようにリクエストがキューに入れられると、呼び出し元は時間内に応答を取得できず、Pod は最終的にメモリやネットワーク接続などのリソースを使い果たす可能性があります。推奨されるレシピは、インスタンスが時間内にリクエストを処理できない場合に、リクエストを早期にドロップすることです。これはロードシェディングと呼ばれます。Keycloak 23 は、同時ブロッキングリクエストの数を制限できる 新しいオプション http-max-queued-requests をサポートするようになりました。数を超えると、Keycloak はすぐにレスポンス 503 Server not Available を返します。これには 2 つの利点があります。呼び出し元は即時応答を受信し、後で再試行でき、リソースはサーバー側ですぐに解放されます。

レルムとクライアントのキャッシュスタンピードを防止

新しい Keycloak インスタンスが起動または再起動すると、そのキャッシュは空になります。高負荷時に同じレルムまたは同じクライアントに対する並列リクエストが Keycloak のノードに到着した場合、以前のバージョンの Keycloak は各並列リクエストでデータベースからデータをロードしていました。これにより、データベース接続の使用率が急増し、初期応答遅延が発生しました。キャッシュまたはキャッシュ内のレルムエントリが削除された場合も同様です (たとえば、変更されたため)。最新バージョンの Keycloak では、これが防止され、各 Keycloak インスタンスはデータベースからデータを 1 回フェッチし、他のすべての並列リクエストはデータベースに再度クエリすることなくこのデータを使用します ( #21521 および #22988, #24202 を参照してください)。

JGroup スレッドの数を Quarkus スレッドの数に合わせる

クラスター内で実行される Keycloak インスタンスが多いほど、および並行して処理されるリクエストが多いほど、JGroups スレッドプールへの負荷が高くなります。JGroups スレッドプールは、Keycloak の埋め込み Infinispan のスムーズな通信を保証し、容量を超えた場合、内部 Infinispan 通信でタイムアウトが発生する可能性があります。高可用性ドキュメントには、Quarkus スレッドプールを JGroup スレッドプールを超えないように設定する方法に関するドキュメントが含まれるようになりました。

改善された Infinispan メトリクス

埋め込み Infinispan は、クラスターを監視できる改善されたメトリクスを提供します。Keycloak のメトリクスエンドポイントによって公開されるメトリクスには、現在のノードの Infinispan メトリクスのみが含まれるようになったため、別の Pod が現在起動またはシャットダウンしている場合でもブロックされません ( ISPN-15042 および ISPN-15072)。これにより、これらの重要な瞬間にクラスターの可視性が向上します。メトリクスは、キャッシュ名をラベルとして公開できるようになりました。そのため、Infinispan XML 構成に <metrics names-as-tags="true" /> を追加することで、ダッシュボードでより簡単にプロットできます。サイト間のレイテンシに関する追加のメトリクスも利用できます。

信頼性の高い Infinispan 操作

Infinispan とその通信層 JGroups を徹底的にテストし、状態転送が停止した状況 ( ISPN-14982 ) や、初期状態転送が失敗した状況を修正することができました。マルチサイトセットアップで使用される Gossip ルーターは、ロードバランサーに複数の IP アドレスがある状況でも機能するようになりました ( JGRP-2722, JGRP-2721, infinispan-operator#1857, および infinispan-operator#1856 )。

ブループリントまたはスクリプトは本番環境で使用できますか?

実施したテストの一環として、Keycloak を最適化し、これらの最適化は Keycloak に組み込まれています。これらは、JGroup スレッドプールの構成を除いて、追加の構成を必要とせずに利用できます。Kubernetes 上の Keycloak の構成は本番環境に非常に近い可能性がありますが、データベース、ネットワーク、ロードバランサー、およびセキュリティ強化は組織ごとに異なると予想されるため、ニーズに合わせて調整する必要があります。

そのため、ブループリントをテキストとして文書化することを選択しました。これにより、私たちが行った選択と、あるセットアップでさまざまな側面が構成され、他の側面がデフォルト設定になっている理由について学ぶことができます。

Keycloak ベンチマークプロジェクトで自動セットアップに使用するスクリプトは、高可用性に焦点を当て、これをエンジニアリングの観点からデバッグと分析が簡単な構成と組み合わせています。本番環境対応のセットアップにはその機能がないため、スクリプトをそのまま使用することはお勧めしません。それでも、これらは独自の自動化の出発点として役立ちます。

ガイドを読んで試してみてください!

現在、アクティブ/パッシブ セットアップの最終テストを実行しており、より多くのテストの自動化に取り組んでいます。また、この マルチサイトセットアップに関する GitHub ディスカッションでコミュニティからのフィードバックを求めています。ここで見たものは気に入りましたか? 何か不足していますか? あなたのフィードバックは不可欠です!

テストが完了し、コミュニティからフィードバックを受け取ったら、完全にサポートされる機能にする予定です。これは、コミュニティがこのセットアップに関与し、環境で試して、発見を共有する絶好の機会です。より強力で回復力のある Keycloak を一緒に構築しましょう!