Keycloakの安定運用は、内蔵するInfinispanキャッシュをどこまで理解しているかで決まります。sessionsやauthenticationSessions、loginFailuresといったキャッシュの性格差、owners数の意味、embedded/externalの選択、そしてKeycloak 26で標準化された永続セッションを、現場のチューニング観点で整理します。

Keycloakを本番で運用していて、原因不明のメモリ増加やクラスタ再起動後のセッション消失、ノード障害時の挙動に頭を悩ませた経験は、多くの実務者が共有しているところだと思います。これらの多くは、Keycloakが内蔵するInfinispanキャッシュの性格を正しく理解することで見通しが立ちます。本記事では、キャッシュの種類ごとの役割から、owners数、メモリ、そしてKeycloak 26で大きく変わったセッション保存方式まで、チューニングの勘所を実務目線で掘り下げます。

01Keycloakが持つキャッシュの全体像

Keycloakは内部にInfinispanを組み込んでおり、キャッシュは大きく3系統に分かれます。それぞれ役割と障害時の性格が異なるため、まずはこの区別を押さえることが出発点になります。

この分類は公式のConfiguring distributed cachesに整理されています。ローカルキャッシュはDBを裏に持つため失っても再取得できますが、分散キャッシュの一部は「メモリにしか存在しない」ものがあり、ここがチューニングと障害設計の焦点になります。

02キャッシュごとの役割と「揮発性」の違い

分散キャッシュの中でも、認証フロー中の一時状態を持つキャッシュは性格が異なります。実務でトラブルの起点になりやすいので、代表的なものを整理します。

現場のコツ:公式では、actionTokens / authenticationSessions / loginFailures / work の4つには上限(max-count)を設定できないと明記されています。これらは「メモリにしか存在しない揮発性データ」であり、エビクション対象にすると認証途中のユーザーが弾かれるためです。上限をかけようとして設定エラーに遭遇したら、この制約を思い出してください。

Keycloak内蔵Infinispanキャッシュの分類 ローカル realms / users authorization keys / crl DB裏付けあり 失っても再取得可 レプリケート work 全ノードに複製 無効化メッセージ 分散 sessions ほか authenticationSessions loginFailures クラスタ分散保持 owners数が要 揮発性キャッシュ(上限設定不可) actionTokens / authenticationSessions loginFailures / work メモリのみ・エビクション不可
図:Keycloakが内蔵するInfinispanキャッシュの3系統と、上限設定できない揮発性キャッシュ

02owners数が決める「何ノードまで落ちても大丈夫か」

分散キャッシュのチューニングで最初に理解すべきはowners(num_owners)です。これは各エントリを何ノードにコピーして持つかを表します。現行Keycloakの分散キャッシュの既定はowners=1(単一オーナー)で、owners "2"は冗長性を高めたいときに明示的に指定する値です。とくにpersistent-user-sessionsが有効なKeycloak 26以降は、セッションの真実の源がDBにあるため単一オーナーでも足り、メモリから失われてもDBから再読込されます。

重要なのは、これがDBに裏付けのない揮発性キャッシュでは「耐えられる同時ノード障害数」を直接左右する点です。単一クラスタHAの概念では、authenticationSessions / loginFailures / actionTokens について「同時に落ちたノード数が num_owners 以上になると、エントリ喪失が起こりうる」と明記されています。既定のowners=1では1ノードの障害でも該当エントリを失いうる一方、owners=2に上げれば2ノード同時障害で初めて両方のレプリカを失う、という関係です。

現場のコツ:Infinispanはowners=2のとき、可能な限り2つのオーナーを別ノードに配置しようとします。ただしKubernetesの既定topologySpreadConstraintsScheduleAnywayのため、条件次第でレプリカが同一障害ドメインに寄ることがあります。可用性ゾーンをまたいだ配置を本気で担保したいなら、スケジューリング制約側も併せて見直してください。

03embedded と external(remote)の使い分け

Infinispanの動かし方には2通りあります。どちらを選ぶかは、可用性要件と運用体制で決まります。

マルチサイト構成の詳細はDeploying Infinispan for HAにまとまっています。externalを選ぶ場合、外部Infinispanクラスタ自体の運用・監視・容量管理という新たな責務が増える点は、あらかじめ体制に織り込んでおくべきです。

なお、現行はQuarkusベースのディストリビューションが標準で、旧WildFlyベースは非推奨です。本記事の設定名・既定値はQuarkus版・新しめのバージョン基準ですが、バージョン依存の値は必ず自環境の公式ドキュメントで確認してください。認証基盤の移行を検討中の方は、兄弟記事のQuarkusディストリビューションへの移行も参考になります。

04Keycloak 26で変わった「永続セッション」

キャッシュのメモリ挙動を語るうえで避けて通れないのが、Keycloak 26で標準化された永続ユーザーセッション(persistent-user-sessions)です。ここは従来の常識を上書きする変更なので、丁寧に押さえます。

Storing sessions in Keycloak 26によれば、従来はセッションが分散Infinispanのメモリ上にのみ存在し、クラスタ再起動やアップグレードで消える問題がありました。KC26以降は既定で、

この結果、メモリ消費は従来より下がり、代わりにDB利用が増える、というトレードオフになりました。逆に永続セッションを無効化(--features-disabled=persistent-user-sessions)すると従来のインメモリ方式に戻せますが、メモリ消費が増え、クラスタ再起動でセッションが失われます。なお、multi-site機能を有効にした構成では永続セッションの無効化はできません。

Keycloak 26 永続セッションの2層構成 メモリ(Infinispan)=ルックアップキャッシュ sessions / clientSessions を高速参照 既定10,000エントリ/ノード・溢れたらDBから再ロード データベース=真実の源(source of truth) セッションを永続化・再起動やアップグレードを跨ぐ メモリ消費減・代わりにDB利用増 キャッシュミス時に読み込み
図:KC26以降のセッション保存。DBを真実の源とし、Infinispanメモリはルックアップキャッシュに位置づけ直された

05メモリ見積もりとセッション激増時の挙動

「セッションが急増したときメモリはどうなるのか」は、キャパシティ設計で必ず聞かれる問いです。公式のメモリ・CPUサイジングが具体的な数値を出しています。

KC26の永続セッション下では、メモリキャッシュから溢れたセッションは破棄されても消失にはならず、必要時にDBから再ロードされます。つまりセッション激増時は「メモリが青天井に膨らむ」のではなく「DBアクセスとレイテンシが増える」方向に効きます。ここを取り違えると、対策としてメモリを積むべきか、DBを増強すべきか(あるいはキャッシュ上限を上げるべきか)の判断を誤ります。DB側のチューニングは兄弟記事のデータベースのチューニングと併せて設計してください。

現場のコツ:cache-embedded-sessions-max-countsessions/clientSessionsの上限を調整できますが、これは永続セッション有効時の話です。永続セッションを無効化(volatile)した構成では、そもそもsessions/clientSessionsへの上限設定はサポートされません。自環境がどちらのモードで動いているかを先に確認してから上限をいじってください。

06チューニングの実務チェックリスト

ここまでを踏まえ、実際に手を動かすときの確認順序を整理します。

監視設計そのものについては、可観測性(メトリクス/トレース)や当社の導入事例もあわせてご覧ください。Keycloakでの認証基盤構築では、これらのキャッシュ挙動を前提にキャパシティと監視を設計しています。

まとめ

Keycloakのキャッシュチューニングは、「どのキャッシュがDBに裏付けられ、どれがメモリにしか存在しないか」という性格の違いを理解することから始まります。owners数は耐えられる同時ノード障害数を直接決め、KC26の永続セッションはメモリ挙動の常識を「DBを真実の源とするルックアップキャッシュ」へと書き換えました。セッション激増はメモリ膨張ではなくDB負荷として現れる——この視点を持てば、メモリを積むのか、DBを増強するのか、キャッシュ上限を上げるのかの判断が一段クリアになります。バージョン依存の値は常に公式で確認しつつ、自環境のモードとowners設定を起点に、監視と容量設計を組み立ててください。

参考(一次情報)

Keycloakのキャッシュ設計やInfinispan構成でお悩みでしたら、実構築の知見をもとにお問い合わせください。

相談する
← ブログ一覧へ戻る