ЗапускаСм Keycloak Π² HA Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π° Kubernetes

ЗапускаСм Keycloak Π² HA Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π° Kubernetes

TL;DR: Π±ΡƒΠ΄Π΅Ρ‚ описаниС Keycloak, систСмы контроля доступа с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, Ρ€Π°Π·Π±ΠΎΡ€ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства, Π΄Π΅Ρ‚Π°Π»ΠΈ настройки.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ основныС ΠΈΠ΄Π΅ΠΈ

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ основныС ΠΈΠ΄Π΅ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠΈ кластСра Keycloak ΠΏΠΎΠ²Π΅Ρ€Ρ… Kubernetes.

Если ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎ Keycloak β€” ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ ссылкам Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сильнСС ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ β€” ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ наш Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ основныС ΠΈΠ΄Π΅ΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ (руководство ΠΏΠΎ запуску Ρ‚Π°ΠΌ ΠΆΠ΅, Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π·ΠΎΡ€ устройства ΠΈ настроСк, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

Keycloak β€” это комплСксная систСма, написанная Π½Π° Java ΠΈ построСнная ΠΏΠΎΠ²Π΅Ρ€Ρ… сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Wildfly. Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ, это framework для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ„Π΅Π΄Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ SSO (single sign-on).

ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅ΠΌ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ сайт ΠΈΠ»ΠΈ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡŽ для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ понимания.

Запуск Keycloak

Для Keycloak Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π²Π° постоянно Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… источника Π΄Π°Π½Π½Ρ‹Ρ… для запуска:

  • Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, примСняСмая для хранСния ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠΈΡ…ΡΡ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ…
  • Datagrid cache, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ для хранСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΡ… ΠΈ часто измСняСмых ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сСссий. РСлизуСтся Infinispan, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Но Π² любом случаС сохраняСмыС Π² Infinispan Π΄Π°Π½Π½Ρ‹Π΅ эфСмСрны β€” ΠΈ ΠΈΡ… Π½Π΅ Π½Π°Π΄ΠΎ ΠΊΡƒΠ΄Π°-Π»ΠΈΠ±ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ пСрСзапускС кластСра.

Keycloak Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…:

  • ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ β€” ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ процСсс, настраиваСтся Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°ΠΉΠ» standalone.xml
  • ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ кластСр (высокодоступный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚) β€” всС процСссы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Настройки хранятся Π² Ρ„Π°ΠΉΠ»Π΅ standalone-ha.xml, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.
  • Π”ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ кластСр β€” запуск кластСра Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ быстро становится Ρ€ΡƒΡ‚ΠΈΠ½Π½Ρ‹ΠΌ ΠΈ скучным занятиСм ΠΏΡ€ΠΈ ростС кластСра, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ΠΎ всС измСнСния внСсти Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ кластСра. Π”ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ этот вопрос ΠΏΡƒΡ‚Π΅ΠΌ настройки Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ мСста хранСния ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΈ настройки хранятся Π² Ρ„Π°ΠΉΠ»Π΅ domain.xml
  • РСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ β€” Π² случаС, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Keycloak Π² кластСрС ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ², Ρ‡Π°Ρ‰Π΅ всСго Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах гСографичСски. Π’ этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ собствСнный кластСр Keycloak сСрвСров.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ рассмотрим Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ кластСр, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Ρ‚Ρ€ΠΎΠ½Π΅ΠΌ Ρ‚Π΅ΠΌΡƒ насчСт Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эти Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Kubernetes. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ Π² Kubernetes Π½Π΅Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с синхронизациСй настроСк Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ² (ΡƒΠ·Π»ΠΎΠ² Keycloak), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ кластСр Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ особо слоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π’Π°ΠΊΠΆΠ΅ поТалуйста ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ слово кластСр Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ насчСт Π³Ρ€ΡƒΠΏΠΏΡ‹ ΡƒΠ·Π»ΠΎΠ² Keycloak, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… вмСстС, Π½Π΅Ρ‚ нСобходимости ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° кластСр Kubernetes.

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ кластСр Keycloak

Для запуска Keycloak Π² этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΎ:

  • Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ внСшнюю ΠΎΠ±Ρ‰ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…
  • ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ
  • ΠΈΠΌΠ΅Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΡΠ΅Ρ‚ΡŒ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ip multicast

Настройку внСшнСй Π±Π°Π·Ρ‹ ΠΌΡ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ являСтся Ρ†Π΅Π»ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΈ Ρƒ нас ΠΊ Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠœΡ‹ просто Π΄ΠΎΠ±Π°Π²ΠΈΠΌ эти Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния.

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Keycloak Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² отказоустойчивом (HA) кластСрС, Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ сильно это всС зависит ΠΎΡ‚ способностСй Wildfly ΠΊ кластСризации.

Wildfly примСняСт нСсколько подсистСм, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС балансировщика Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ β€” для отказоустойчивости. Балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ обСспСчиваСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ прилоТСния ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΡƒΠ·Π»Π° кластСра, Π° ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ прилоТСния Π΄Π°ΠΆΠ΅ Π² случаС ΠΎΡ‚ΠΊΠ°Π·Π° части ΡƒΠ·Π»ΠΎΠ² кластСра. НСкоторыС ΠΈΠ· этих подсистСм:

  • mod_cluster: Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ совмСстно с Apache Π² качСствС балансировщика HTTP, зависит ΠΎΡ‚ TCP multicast для поиска ΡƒΠ·Π»ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ внСшним балансировщиком.

  • infinispan: распрСдСлСнный кэш, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°Π½Π°Π»Ρ‹ JGroups Π² качСствС транспортного уровня. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HotRod для связи с внСшним кластСром Infinispan для синхронизации содСрТимого кэша.

  • jgroups: прСдоставляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ связи Π³Ρ€ΡƒΠΏΠΏ для высокодоступных сСрвисов Π½Π° основС ΠΊΠ°Π½Π°Π»ΠΎΠ² JGroups. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ экзСмплярам прилоТСния Π² кластСрС ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ Π² Π³Ρ€ΡƒΠΏΠΏΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ связь ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ свойствами, ΠΊΠ°ΠΊ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ, ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊ сбоям.

Балансировщик Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

ΠŸΡ€ΠΈ установкС балансировщика Π² качСствС ingress ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π² кластСрС Kubernetes Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:

Π Π°Π±ΠΎΡ‚Π° Keycloak ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ адрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎ HTTP ΠΊ сСрвСру Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, являСтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ ip-адрСсом клиСнтского ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Настройки балансировщика ΠΈ ingress Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ HTTP X-Forwarded-For ΠΈ X-Forwarded-Proto, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ HOST. ПослСдняя вСрсия ingress-nginx (> 0.22.0) ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ это ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Активация Ρ„Π»Π°Π³Π° proxy-address-forwarding ΠΏΡƒΡ‚Π΅ΠΌ установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния PROXY_ADDRESS_FORWARDING Π² true Π΄Π°Π΅Ρ‚ Keycloak ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° proxy.

Π’Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ sticky sessions Π² ingress. Keycloak примСняСт распрСдСлСнный кэш Infinispan для сохранСния Π΄Π°Π½Π½Ρ‹Ρ…, связанных с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСссиСй Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ сСссиСй. Кэши Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄Π½ΠΈΠΌ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами эта конкрСтная сСссия сохраняСтся Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠ·Π»Π΅ кластСра, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ·Π»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ, Ссли ΠΈΠΌ понадобится доступ ΠΊ этой сСссии.

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρƒ нас Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅ сработало ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ сСссии с ΠΈΠΌΠ΅Π½Π΅ΠΌ cookie AUTH_SESSION_ID. Keycloak Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ» ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, поэтому ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ имя cookie для sticky session.

Π’Π°ΠΊΠΆΠ΅ Keycloak прикрСпляСт имя ΡƒΠ·Π»Π°, ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊ AUTH_SESSION_ID, Π° ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π² высокодоступном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΡƒΠ·Π»Π° для управлСния транзакциями. РСкомСндуСтся ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² JAVA_OPTS ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ jboss.node.name ΠΈ jboss.tx.node.id ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ имя ΠΏΠΎΠ΄Π°. Если Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ имя ΠΏΠΎΠ΄Π° β€” Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π² 23 символа для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… jboss, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ StatefulSet, Π° Π½Π΅ Deployment.

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈ Π³Ρ€Π°Π±Π»ΠΈ β€” Ссли ΠΏΠΎΠ΄ удаляСтся ΠΈΠ»ΠΈ пСрСзапускаСтся, Π΅Π³ΠΎ кэш тСряСтся. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этого стоит ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ число Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π² кэша для всСх кэшСй Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ Π² Π΄Π²Π°, Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ копия кэша. РСшСниС β€” Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт для Wildfly ΠΏΡ€ΠΈ запускС ΠΏΠΎΠ΄Π°, ΠΏΠΎΠ΄Π»ΠΎΠΆΠΈΠ² Π΅Π³ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /opt/jboss/startup-scripts Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅:

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ скрипта

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers

/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})

run-batch
stop-embedded-server

послС Ρ‡Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния CACHE_OWNERS Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅.

ΠŸΡ€ΠΈΠ²Π°Ρ‚Π½Π°Ρ ΡΠ΅Ρ‚ΡŒ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ip multicast

Если примСняСтС Weavenet Π² качСствС CNI, multicast Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сразу ΠΆΠ΅ β€” ΠΈ ваши ΡƒΠ·Π»Ρ‹ Keycloak Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹.

Если Ρƒ вас Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ip multicast Π² кластСрС Kubernetes, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ JGroups Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ для поиска ΡƒΠ·Π»ΠΎΠ².

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” испольльзованиС KUBE_DNS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ headless service для поиска ΡƒΠ·Π»ΠΎΠ² Keycloak, Π²Ρ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ JGroups имя сСрвиса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ использовано для поиска ΡƒΠ·Π»ΠΎΠ².

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° KUBE_PING, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с API для поиска ΡƒΠ·Π»ΠΎΠ² (Π½Π°Π΄ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ serviceAccount с ΠΏΡ€Π°Π²Π°ΠΌΠΈ list ΠΈ get, послС Ρ‡Π΅Π³ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этой serviceAccount).

Бпособ поиска ΡƒΠ·Π»ΠΎΠ² для JGroups настраиваСтся ΠΏΡƒΡ‚Π΅ΠΌ выставлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния JGROUPS_DISCOVERY_PROTOCOL ΠΈ JGROUPS_DISCOVERY_PROPERTIES. Для KUBE_PING Π½Π°Π΄ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‹ задавая namespace ΠΈ labels.

️ Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ multicast ΠΈ запускаСтС Π΄Π²Π° ΠΈ большС кластСров Keycloak Π² ΠΎΠ΄Π½ΠΎΠΌ кластСрС Kubernetes (допустим ΠΎΠ΄ΠΈΠ½ Π² namespace production, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” staging) β€” ΡƒΠ·Π»Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ кластСра Keycloak ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ кластСру. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ multicast адрСс для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ кластСра ΠΏΡƒΡ‚Π΅ΠΌ установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…jboss.default.multicast.address ΠΈ jboss.modcluster.multicast.address Π² JAVA_OPTS.

РСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ

ЗапускаСм Keycloak Π² HA Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π° Kubernetes

Бвязь

Keycloak ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ мноТСствСнныС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ кластСра кэшСй Infinispan для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°, Π³Π΄Π΅ располоТСны кластСра Keycloack, составлСнныС ΠΈΠ· ΡƒΠ·Π»ΠΎΠ² Keycloak. Но ΠΏΡ€ΠΈ этом Π½Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ Keycloak Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ….

Π£Π·Π»Ρ‹ Keycloak ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ внСшнюю Java Data Grid (сСрвСра Infinispan) для связи ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ. Бвязь Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Infinispan HotRod.

Кэши Infinispan Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ настроСны с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ remoteStore, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… (Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π΅, ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°) ΠΊΡΡˆΠ°Ρ…. Π•ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ кластСра infinispan срСди JDG сСрвСров, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, сохраняСмыС Π½Π° JDG1 Π½Π° ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ΅ site1 Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° JDG2 Π½Π° ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ΅ site2.

Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ сСрвСр JDG ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Π΅Ρ‚ сСрвСра Keycloak своСго кластСра Ρ‡Π΅Ρ€Π΅Π· клиСнтскиС соСдинСния, Ρ‡Ρ‚ΠΎ являСтся ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° HotRod. Π£Π·Π»Ρ‹ Keycloak Π½Π° site2 ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ свои кэши Infinispan, ΠΈ конкрСтная ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ сСссия становится Ρ‚Π°ΠΊΠΆΠ΅ доступной Π½Π° ΡƒΠ·Π»Π°Ρ… Keycloak Π½Π° site2.

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… кэшСй Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ записи Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· сСрвСр Infinispan. Для этого Π½Π°Π΄ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ настройку remote-store ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΊΡΡˆΡƒ Infinispan (Π² Ρ„Π°ΠΉΠ»Π΅ standalone-ha.xml), послС Ρ‡Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ replicated-cache Ρ‚Π°ΠΊΠΆΠ΅ пСрСстанСт Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π½Π° сторонС Infinispan сСрвСра.

Настройка кэшСй

Π•ΡΡ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° кэшСй Π² Keycloak:

  • Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ. Он располоТСн рядом с Π±Π°Π·ΠΎΠΉ, слуТит для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ для сниТСния Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°. Π’ этом Ρ‚ΠΈΠΏΠ΅ кэша хранится realm, ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹, Ρ€ΠΎΠ»ΠΈ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ кэша Π½Π΅ рСплицируСтся, Π΄Π°ΠΆΠ΅ Ссли этот кэш β€” Ρ‡Π°ΡΡ‚ΡŒ кластСра Keycloak. Если мСняСтся нСкоторая запись Π² кэшС β€” ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ сСрвСрам Π² кластСрС отправляСтся сообщСниС ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, послС Ρ‡Π΅Π³ΠΎ запись ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈΠ· кэша. Π‘ΠΌ. описаниС work Π΄Π°Π»Π΅Π΅, для Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ описания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

  • Π Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ сСссии, offline Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ слСдит Π·Π° ошибками Π²Ρ…ΠΎΠ΄Π° для опрСдСлСния ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Ρ„ΠΈΡˆΠΈΠ½Π³Π° ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ‚Π°ΠΊ. Π₯Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² этим ΠΊΡΡˆΠ°Ρ… β€” Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, хранятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎ кластСру.

Кэши Infinispan

БСссии β€” концСпция Π² Keycloak, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ кэши, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ authenticationSessions, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Запросы с этих кэшСй ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½ΡƒΠΆΠ½Ρ‹ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ ΠΈ сСрвСрам Keycloak, Π½Π΅ прилоТСниям. Π—Π΄Π΅ΡΡŒ ΠΈ проявляСтся Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ sticky sessions, Π° сами Ρ‚Π°ΠΊΠΈΠ΅ кэши Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ ΠΈ Π² случаС Active-Active Ρ€Π΅ΠΆΠΈΠΌΠ°.

Π’ΠΎΠΊΠ΅Π½Ρ‹ дСйствия. ΠžΡ‡Π΅Ρ€Π΅Π΄Π½Π°Ρ концСпция, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сцСнариСв, ΠΊΠΎΠ³Π΄Π°, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ асинхронно ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅. НапримСр, Π²ΠΎ врСмя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ forget password кэш actionTokens примСняСтся для отслСТивания ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… связанных Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² β€” ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ‚ΠΎΠΊΠ΅Π½ ΡƒΠΆΠ΅ использован, ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ кэша ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ.

ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ устарСваниС Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΡΡ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ с Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ПодобноС ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ добавляСт ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Если ΠΎΠ΄ΠΈΠ½ сСрвСр Keycloak обновляСт Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ сСрвСра Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½Ρ‹ ΠΎΠ± этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ провСсти Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… Π² своих ΠΊΡΡˆΠ°Ρ…. Keycloak ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ кэши realms, users ΠΈ authorization для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹.

Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ кэш work, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСплицируСтся ΠΏΠΎ всСм Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌ. Π‘Π°ΠΌ ΠΎΠ½ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹, Π° слуТит для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний ΠΎΠ± устарСвании Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠ·Π»Π°ΠΌ кластСра ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ, ΡƒΠ·Π΅Π» Keycloak посылаСт сообщСниС Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΡƒΠ·Π»Π°ΠΌ Π² своСм Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π»Π°ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ². ПослС получСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ сообщСния ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ чистку ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² своих Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡΡˆΠ°Ρ….

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ сСссии. Кэши с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ sessions, clientSessions, offlineSessions ΠΈ offlineClientSessions, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ слуТат для хранСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ± ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сСссиях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ Π²ΠΎ врСмя активности ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π­Ρ‚ΠΈ кэши Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ запросы HTTP ΠΎΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ связаны с sticky sessions ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ.

Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π³Ρ€ΡƒΠ±ΠΎΠΉ силой. Кэш loginFailures слуТит для отслСТивания Π΄Π°Π½Π½Ρ‹Ρ… ошибок Π²Ρ…ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сколько Ρ€Π°Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π» Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. РСпликация Π΄Π°Π½Π½ΠΎΠ³ΠΎ кэша β€” Π΄Π΅Π»ΠΎ администратора. Но для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ подсчСта стоит Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Ρ‚Π°Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ. Но с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны Ссли Π½Π΅ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅, получится ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΈ Ссли встаСт этот вопрос β€” Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈ раскаткС кластСра Infinispan Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ опрСдСлСния кэшСй Π² Ρ„Π°ΠΉΠ» настроСк:

<replicated-cache-configuration name="keycloak-sessions" mode="ASYNC" start="EAGER" batching="false">
</replicated-cache-configuration>

<replicated-cache name="work" configuration="keycloak-sessions" />
<replicated-cache name="sessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineSessions" configuration="keycloak-sessions" />
<replicated-cache name="actionTokens" configuration="keycloak-sessions" />
<replicated-cache name="loginFailures" configuration="keycloak-sessions" />
<replicated-cache name="clientSessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineClientSessions" configuration="keycloak-sessions" />

НСобходимо Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ кластСр Infinispan ΠΏΠ΅Ρ€Π΅Π΄ запуском кластСра Keycloak

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ remoteStore для Keycloak кэшСй. Для этого достаточно скрипта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСлаСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для настройки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CACHE_OWNERS, Π½Π°Π΄ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /opt/jboss/startup-scripts:

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ скрипта

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo *** Update infinispan subsystem ***
/subsystem=infinispan/cache-container=keycloak:write-attribute(name=module, value=org.keycloak.keycloak-model-infinispan)

echo ** Add remote socket binding to infinispan server **
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-cache:add(host=${remote.cache.host:localhost}, port=${remote.cache.port:11222})

echo ** Update replicated-cache work element **
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=work, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)

/subsystem=infinispan/cache-container=keycloak/replicated-cache=work:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache sessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=sessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache clientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=clientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineClientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineClientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache loginFailures element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=loginFailures, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache actionTokens element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    cache=actionTokens, 
    remote-servers=["remote-cache"], 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache authenticationSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=statistics-enabled,value=true)

echo *** Update undertow subsystem ***
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)

run-batch
stop-embedded-server

НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ JAVA_OPTS для ΡƒΠ·Π»ΠΎΠ² Keycloak для Ρ€Π°Π±ΠΎΡ‚Ρ‹ HotRod: remote.cache.host, remote.cache.port ΠΈ имя сСрвиса jboss.site.name.

Бсылки ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ докумСнтация

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π° для Π₯Π°Π±Ρ€Π° сотрудниками ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π° Π‘Π»Ρ‘Ρ€ΠΌ β€” интСнсивы, видСокурсы ΠΈ ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΡŽΡ‰ΠΈΡ… спСциалистов (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com