Keycloak 26 でのセッションの保存

2024年12月17日 Michal Hajas 著

Keycloak 26 では、デフォルトで永続ユーザーセッション機能が使用されるようになりました。このブログ記事では、この機能を導入した背景、代替案、そして将来について解説します。

Keycloak 26 におけるセッションストレージの早見表

このセクションでは、どのようなセッションストレージが存在し、Keycloak 26 でそれぞれをいつ使用すべきかについて、要点をまとめて説明します。以降のセクションでは、各ストレージタイプについてより詳細に説明し、それぞれの導入または廃止の背景にある理由を説明します。

サイト数 セッションストレージ 特徴 使用場面 有効にするためのKeycloak CLIオプション

シングルサイト

永続セッション

  • データベースに保存され、メモリにキャッシュされるセッション

  • クラスタ再起動後もセッションは利用可能

  • メモリ使用量の削減

  • データベース使用量の増加

  • 標準インストールにおけるデフォルトおよび推奨

  • 再起動やアップグレード後もセッションを維持したい場合

  • データベース使用量の増加を許容できる場合

追加設定は不要

メモリに保存されるセッション

  • 高速な読み取りと書き込み

  • クラスタ再起動後にセッションは失われる

  • メモリ使用量の増加 (すべてのセッションがメモリに存在する必要がある)

  • 永続ユーザーセッション機能は使用できない

  • 永続ユーザーセッションを使用できない理由を理解したいため、こちらでフィードバックをお寄せください。

--features-disabled="persistent-user-sessions"

外部 Infinispan に保存されるセッション

  • 外部 Infinispan のみに保存されるセッション

  • データベース使用量の削減

  • 外部 Infinispan との通信に Hot Rod クライアントを使用

  • 実験的機能

  • 実験的機能のため、本番環境での使用は推奨されません

  • この機能に興味があり、サポートされるようにするために協力したい場合は、こちらで評価とフィードバックをお願いします。

--features="clusterless"
--features-disabled="persistent-user-sessions"

メモリおよび外部 Infinispan に保存されるセッション

  • 各セッションの4つのコピー。Keycloak メモリに2つ、Infinispan メモリに2つ

  • Keycloak クラスタの再起動後もセッションは利用可能

  • 高いメモリ使用量

  • 実験的であり、近日中に削除予定

  • 以前のリリースでこの設定を使用しており、現在永続ユーザーセッションに切り替えられない場合

--features="cache-embedded-remote-store"
--features-disabled="persistent-user-sessions"

マルチサイト (ガイド)

永続ユーザーセッション

  • Keycloak メモリにキャッシュされずにデータベースに保存されるセッション

  • セッションを2番目のサイトに同期的にレプリケーション (データベース構成に依存)

  • サイト全体の停止に対する耐性が必要な場合

--features="multi-site"

外部 Infinispan に保存されるセッション

  • 外部 Infinispan のみに保存されるセッション

  • 外部 Infinispan との通信に Hot Rod クライアントを使用

  • データベース使用量の削減

  • 実験的機能

  • 実験的機能のため、本番環境での使用は推奨されません

  • この機能に興味があり、サポートされるようにするために協力したい場合は、こちらで評価とフィードバックをお願いします。

--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"

外部 Infinispan に保存されるセッションを使用したシングルサイト

これは上記の実験的な設定です。これを構成するには、persistent-user-sessions を無効にし、clusterless 機能を有効にします。

bin/kc.[sh|bat] build --features="clusterless" --features-disabled="persistent-user-sessions"

メモリおよび外部 Infinispan に保存されるセッションを使用したシングルサイト

この設定はマルチサイトを目的とした機能を使用していますが、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"

フィードバック歓迎

よくある質問

永続ユーザーセッションを使用したマルチサイト構成で外部 Infinispan が必要な理由

この場合、外部 Infinispan はセッションの保存には使用されませんが、2つの Keycloak サイト間の通信 (例えば、無効化メッセージ、バックグラウンドタスクの同期、および認証セッション、ログイン失敗、またはアクショントークンなどの通常は短寿命のオブジェクトの保存) には依然として必要です。