-
データベースに保存され、メモリにキャッシュされるセッション
-
クラスタ再起動後もセッションは利用可能
-
メモリ使用量の削減
-
データベース使用量の増加
2024年12月17日 Michal Hajas 著
Keycloak 26 では、デフォルトで永続ユーザーセッション機能が使用されるようになりました。このブログ記事では、この機能を導入した背景、代替案、そして将来について解説します。
このセクションでは、どのようなセッションストレージが存在し、Keycloak 26 でそれぞれをいつ使用すべきかについて、要点をまとめて説明します。以降のセクションでは、各ストレージタイプについてより詳細に説明し、それぞれの導入または廃止の背景にある理由を説明します。
サイト数 | セッションストレージ | 特徴 | 使用場面 | 有効にするためのKeycloak CLIオプション |
---|---|---|---|---|
シングルサイト |
永続セッション |
|
|
追加設定は不要 |
メモリに保存されるセッション |
|
|
--features-disabled="persistent-user-sessions" |
|
外部 Infinispan に保存されるセッション |
|
|
--features="clusterless" --features-disabled="persistent-user-sessions" |
|
メモリおよび外部 Infinispan に保存されるセッション |
|
|
--features="cache-embedded-remote-store" --features-disabled="persistent-user-sessions" |
|
マルチサイト (ガイド) |
永続ユーザーセッション |
|
|
--features="multi-site" |
外部 Infinispan に保存されるセッション |
|
|
--features="multi-site,clusterless" --features-disabled="persistent-user-sessions" |
以前の Keycloak では、すべてのセッションは埋め込み Infinispan のみに保存されていました。つまり、分散キャッシュ内の各 Keycloak ノードのメモリに保存されていました (各 Keycloak ノードはセッションの一部を保存し、各セッションは少なくとも2つのノードに存在します)。これは、セッション数が中小規模のシングルサイトではうまく機能し、セットアップはデータを失うことなく1つの Keycloak ノードの障害に対する耐性がありました。各セッションを保存するノード数を増やせば、複数のノードに拡張することもできました。
より多くのノードが故障した場合、またはサイト全体が故障した場合に問題が発生しました。ユーザーはより耐性の高いセットアップを求めました。このため、クロスサイト機能の技術プレビューを導入しました。セッションデータへの影響は、すべてのデータを4つの場所にレプリケーションすることでした。つまり、2つの Keycloak クラスタと2つの Infinispan クラスタです。これらの各ロケーションは、検索/クエリを実行できるように、すべてのセッションを保存する必要がありました。
当初、このセットアップはあまりパフォーマンスが良くありませんでした。理由の1つは、システムを正しい状態に保つためにデータを4回同期的にレプリケーションする必要があったことです。このパフォーマンスの悪さの結果として、当初は機能を削除したいと考えていましたが、コミュニティからの大きな関心により、代わりに機能を進化させることにしました。いくつかの最適化とパフォーマンスチューニングの後、Keycloak 24 で multi-site
という名前でリリースすることができました。これにより、アクティブ/パッシブ構成が可能になりました。このアーキテクチャでは、一部のデータが2番目の Keycloak クラスタに非同期的にレプリケーションされたため、アクティブ/アクティブ構成ではこのセットアップを使用できませんでした。
このセットアップで耐性が向上しましたが、デプロイメント全体がダウンした場合 (例えば、アップデート中など) は、依然としてセッションが失われます。これについて多くの不満が寄せられました。
そこで、これらの両方の問題 (他のサイトへの非同期アップデートレプリケーションとセッションの損失) に対する救済策として、永続セッションが検討されるようになりました。そのアイデアは、セッションをデータベースに保存することです。データベースはセッションの信頼できる情報源です。オフラインセッションはすでにデータベースに保存していたため、その概念を再利用し、Keycloak 26 でデフォルトで有効になっている永続ユーザーセッションという新機能を導入しました。
Keycloak に来るほぼすべてのリクエストは、セッションが存在するかどうか、有効かどうかを確認し、通常は有効期間も更新する必要があります。これにより、セッションは読み取り/書き込み負荷の高いオブジェクトとなり、データベースがそれらを保存するのに適切な場所であるかどうかという疑問が生じます。
このブログ記事の執筆時点では、永続ユーザーセッションでパフォーマンスの問題を示すレポートはなく、利点が欠点を上回っているようです。それでも、評価できる実験的な追加機能があります。上記で説明したように、Keycloak 24 のマルチサイト構成の問題の1つは、セッションを4つの場所にレプリケーションする必要があり、2番目の Keycloak クラスタは一部のアップデートを非同期的に受信していたことです。これは、セッションが4回ではなく2回しかレプリケーションされない外部 Infinispan のみにセッションを保存することによっても解決できます。また、Keycloak ノードへの変更をレプリケーションする必要がないため、非同期レプリケーションはもう使用されません。Infinispan は、セッションを検索するためのクエリおよびインデックス機能も提供しており、埋め込み Infinispan に保存されたセッションで必要なシーケンシャルスキャンを回避できます。これは実験的な機能であるため、まだ完全に完成しておらず、パフォーマンスが最適化されていないことに注意してください。永続ユーザーセッションが失敗する場合や、セッションの純粋な Infinispan ストレージが優れている可能性がある場合を理解するために、皆様からのフィードバックをお待ちしております。
適切な非推奨期間なしに上記のリストからオプションを削除することはできなかったため、Keycloak 26 でもすべてのオプションを依然として使用できますが、一部のオプションは他のオプションよりも推奨されています。
これは Keycloak 26 のデフォルト設定です。
これは Keycloak バージョン 26 より前のデフォルト設定であり、現時点ではおそらく最も一般的に使用されている設定です。永続ユーザーセッションに切り替えることが推奨されており、Keycloak 26 では追加設定なしで自動的に切り替えが行われます。ただし、永続ユーザーセッションに問題がある場合 (フィードバックをお待ちしております こちら)、再起動時にセッションが失われることを気にしない場合は、persistent-user-sessions
機能を無効にすることでこの設定を有効にできます。
bin/kc.[sh|bat] build --features-disabled="persistent-user-sessions"
これは上記の実験的な設定です。これを構成するには、persistent-user-sessions
を無効にし、clusterless
機能を有効にします。
bin/kc.[sh|bat] build --features="clusterless" --features-disabled="persistent-user-sessions"
この設定はマルチサイトを目的とした機能を使用していますが、Keycloak の再起動時にセッションが失われないという利点があるため、シングルサイトでもよく使用されていました。永続ユーザーセッションはこの設定を時代遅れにすると考えており、Keycloak はこの設定では起動を拒否し、次のメッセージで不満を述べます: Remote stores are not supported for embedded caches….
。この機能は非推奨であり、次回の Keycloak メジャーリリースで削除されます。この構成を実行するには、persistent-user-sessions
を無効にし、cache-embedded-remote-store
機能を有効にし、埋め込み Infinispan を適切に構成します。
bin/kc.[sh|bat] build --features="cache-embedded-remote-store" --features-disabled="persistent-user-sessions"
マルチサイトで Keycloak を実行するには、両方のサイトでデータを利用可能にし、同期させるための2つの構成要素が必要です。同期的にレプリケーションされたデータベースと、クロスサイトレプリケーションが有効になっている各サイトの外部 Infinispan です。セットアップ全体の詳細については、こちらを参照してください。セッションの保存という観点からは、セットアップは常に永続ユーザーセッション機能の使用を強制し、セッションは Keycloak のメモリにキャッシュされずにデータベースにのみ保存されます。これを構成するには、multi-site
機能を有効にします。
bin/kc.[sh|bat] build --features="multi-site"
シングルサイト用に説明されている実験的な clusterless
機能は、マルチサイトでも評価できます。このセットアップでは、セッションはデータベースではなく外部 Infinispan に保存されます。これは実験的な機能であり、まだ十分に文書化されておらず、パフォーマンスが最適化されていないことに注意してください。これを構成するには、persistent-user-sessions
を無効にし、multi-site
および clusterless
機能を有効にします。
bin/kc.[sh|bat] build --features="multi-site,clusterless" --features-disabled="persistent-user-sessions"
これについて質問やフィードバックがある場合は、次の GitHub ディスカッションに進んでください
この場合、外部 Infinispan はセッションの保存には使用されませんが、2つの Keycloak サイト間の通信 (例えば、無効化メッセージ、バックグラウンドタスクの同期、および認証セッション、ログイン失敗、またはアクショントークンなどの通常は短寿命のオブジェクトの保存) には依然として必要です。