TL; DR: Keycloak á áá±á¬áºááŒáá»ááºá ááœáá·áºáááºážáá±á¬ áááºážááŒá Ạáááºáá±á¬ááºááœáá·áº ááááºážáá»á¯ááºááŸá¯ á áá áºá á¡ááœááºážááá¯ááºáž ááœá²á·á ááºážáá¯á¶ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á ááœá²á·á ááºážááŸá¯ á¡áá±ážá ááẠá¡áá»ááºá¡áááºáá»á¬áž áá«ááŸááá«áááºá
áááá«ááºážááŸáá·áº á¡ááá á¡áá¯ááºáá®áá¬áá»á¬áž
á€áá±á¬ááºážáá«ážááœááºá Kubernetes áááááºááœáẠKeycloak á¡á á¯á¡áá±ážáá áºáá¯ááᯠááŒáá·áºáá»ááºáá¬ážááá·áºá¡áá«ááœáẠááŸááºáá¬ážáá¬ážáááá·áº á¡ááŒá±áᶠá¡ááŒá¶áá¬ááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· ááŒááºááœá±á·ááááºááŒá áºáááºá
Keycloak á¡ááŒá±á¬ááºáž ááá¯ááá¯ááááŸáááá¯áá«áá áá±á¬ááºážáá«ážáá¡áá¯á¶ážááŸá ááá·áºááºáá»á¬ážááᯠááá¯ážáá¬ážáá«á áááºááœá±á·ááœáẠááá¯ááá¯áá
áºááŒá¯ááºá
á±áááºá¡ááœáẠáá±á·áá¬ááá¯ááºáá«áááºá
Keycloak ááẠJava ááœáẠáá±ážáá¬ážáá¬ážáá±á¬ ááŒáá·áºá
á¯á¶áá±á¬ á
áá
áºáá
áºáá¯ááŒá
áºááŒá®áž á¡ááºááá®áá±ážááŸááºážáá¬áá¬áá
áºáá¯áá¡áá±á«áºááœáẠáááºáá±á¬ááºáá¬ážáááºá
ááá¬ážáááºá
á¬áááºááá¯á· ááááºáá±á«áºáá«áááºá
áá±á¬á·áá»áááºááá¯ááœáá·áºááŒááºážá
Keycloak ááẠáááºáááºááẠá¡ááŒá²áááºážáá±áá¬á¡áááºážá¡ááŒá áºááŸá áºáᯠááá¯á¡ááºáááº-
- á¡áá¯á¶ážááŒá¯áá°á¡áá»ááºá¡áááºáá²á·ááá¯á·áá±á¬ áááºáá±á¬ááºáá¬ážáá±á¬áá±áá¬ááᯠááááºážáááºážááẠá¡áá¯á¶ážááŒá¯ááá·áº áá±áá¬áá±á·á áº
- Datagrid áááºááŸáºá áá±áá¬áá±á·á
áºá០áá±áá¬áá»á¬ážááᯠáááºááŸáºáá¯ááºáááºá á¡áá¯á¶ážááŒá¯áá° áááºááŸááºáá»á¬ážáá²á·ááá¯á· áááá¬ááŸáá·áº áááŒá¬áá ááŒá±á¬ááºážáá²áá±áá±á¬ áááºáá¬áá±áá¬á¡áá»áá¯á·ááᯠááááºážáááºážááẠá¡áá¯á¶ážááŒá¯áááºá ááá¯áá¬
Infinispan áá¯á¶ááŸááºá¡á¬ážááŒáá·áº áá±áá¬áá±á·á áºááẠáááááá¬áᬠááá¯ááŒááºáááºá áááºááá¯á·áááºááá¯á á±áá¬áá° Infinispan ááœááºááááºážáááºážáá¬ážáá±á¬áá±áá¬ááẠáá±á«áºáááºááŒá áºááẠ- á¡á á¯á¡áá±ážááá¯ááŒááºáááºá áááºááá·áºá¡áá« áááºááá·áºáá±áá¬ááœááºááŸááááºážáááºážáááºáááá¯á¡ááºáá«á
Keycloak ááẠááá°áá®áá±á¬áá¯ááºáá±ážáá¯ááœáẠá¡áá¯ááºáá¯ááºáááº-
- áá¬ááẠ- áá áºáá¯ááŸáá·áºáá áºáá¯áᬠáá¯ááºáááºážá ááºá ááá¯ááºáá áºáá¯ááŸáá áºááá·áº á á®á ááºáá¬ážáááºá standalone.xml
- áá¯á¶ááŸááºá¡á á¯á¡ááœá²á· (ááŒáá·áºáá¬ážáá±á¬áááŸáááá¯ááºááŸá¯ááœá±ážáá»ááºá áá¬) - áá¯ááºáááºážá ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠáá°áá®áá±á¬ááœá²á·á ááºážáá¯á¶ááá¯á¡áá¯á¶ážááŒá¯áááẠááŒá áºááŒá®ážá áááºážááᯠááá¯ááºááá¯ááºáá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááááºááŒá áºáááºá áááºáááºáá»á¬ážááᯠááá¯ááºáá áºáá¯ááœáẠááááºážáááºážáá¬ážáááºá standalone-ha.xmlááá¯á·á¡ááŒááºá áááºááẠáá±áá¬áá±á·á áºááá¯á· áá»áŸáá±áá¯á¶ážá áœá²ááœáá·áºááŸáá·áº load balancer áá áºáá¯ááŒá¯áá¯ááºááẠááá¯á¡ááºáááºá
- ááá¯ááááºážá¡á á¯á¡áá±áž â áá¯á¶ááŸááºáá¯ááºááœáẠá¡á á¯á¡áá±ážáá áºáá¯ááᯠá áááºááŒááºážááẠá¡á á¯á¡áá±ážááŒá®ážááœá¬ážáá¬áááºááŸáá·áºá¡áá»áŸ áá¯á¶ááŸááºááŸáá·áº ááŒá®ážááœá±á·ááœááºá¡áá¯ááºáá áºáᯠáá»ááºááŒááºá áœá¬ááŒá áºáá¬áááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááŒá±á¬ááºážáá²ááá·áºá¡áá«ááá¯ááºážá á¡á á¯á¡áá±ážáá áºáá¯á á®ááœáẠááŒá±á¬ááºážáá²ááŸá¯á¡á¬ážáá¯á¶ážááᯠááŒá¯áá¯ááºááá«áááºá Domain áá¯ááºá áá¯ááºáá±á¬ááºáá»ááºááẠá¡áá»áá¯á·áá±á¬ áá»áŸáá±áá¬ážáá±á¬ ááá¯ááŸá±á¬ááºáááºážáááºáá±áá¬ááᯠáááºááŸááºááŒá®áž ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááᯠáá¯ááºáá±ááŒááºážááŒáá·áº á€ááŒá¿áá¬ááᯠááŒá±ááŸááºážáá±ážáá«áááºá á€áááºáááºáá»á¬ážááᯠááá¯ááºááœáẠááááºážáááºážáá¬ážáááºá domain.xml
- áá±áá¬á ááºáá¬áá»á¬ážá¡ááŒá¬áž áá°ážáá°ááŸá¯ â á¡áááºá áááºááẠKeycloak ááᯠá¡áá»á¬ážá¡ááŒá¬ážáá±á¬ áá±áá¬á ááºáá¬áá»á¬áž á¡á á¯á¡áá±ážááœáẠá¡áá¯á¶ážááŒá¯ááá¯áá«áá áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº ááá°áá®áá±á¬ áááá®áááºáááºáá±áá¬áá»á¬ážááœáẠááŒá¯áá¯ááºááá¯ááºáááºá á€ááœá±ážáá»ááºááŸá¯ááœááºá áá±áá¬á ááºáá¬áá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯áẠKeycloak áá¬áá¬áá»á¬áž á¡á á¯á¡áá±ážááŸááááºááŒá áºáááºá
á€áá±á¬ááºážáá«ážááá»áœááºá¯ááºááá¯á·áááºáá¯áááááœá±ážáá»ááºááŸá¯ááá¯á¡áá±ážá áááºáá¯á¶ážáááºáá«áááá·áºáááºá ááá¯ááá¯áááºááŸá¬ áá¯á¶ááŸááºá¡á á¯á¡ááœá²á·Kubernetes ááœáẠá€ááœá±ážáá»ááºááŸá¯ááŸá áºáá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážááẠá¡áááá¹áá¬ááºááŸááá±á¬ááŒá±á¬áá·áº áá±áá¬á ááºáá¬áá»á¬ážááŒá¬ážááœáẠáá°ážáá°ááŒááºážááá¯ááºáᬠáá±á«ááºážá ááºá¡áááºážáááºááá¯áááºáž áá»áœááºá¯ááºááá¯á· ááááœá±á·áá«áááºá áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á Kubernetes ááœáẠpods á¡áá»á¬ážá¡ááŒá¬áž (Keycloak nodes) ááááºáááºáá»á¬ážááá¯áá áºááŒáá¯ááºáááºážáá»áááºááá¯ááºááŒááºážá¡ááœááºááŒá¿áá¬áááŸááá«á ááá¯ááááºážá¡á á¯á¡áá±áž áá¯ááºááᬠá¡áááºážáááºáá²ááŸá¬ ááá¯ááºáá«áá°ážá
á áá¬ážáá¯á¶ážááá¯áááºáž áááááŒá¯áá«á á áá»á áºáá®ážááŒáœáẠáá±á¬ááºážáá«ážááá»ááºááẠá¡áá°áááœáá¯ááºáá±á¬ááºáá±áá±á¬ Keycloak node á¡á¯ááºá á¯áá»á¬ážá¡ááœááºáᬠáááºááá¯ááºáááºááŒá áºááŒá®áž Kubernetes á¡á á¯á¡áá±ážááᯠááá¯ážáá¬ážáááºáááá¯á¡ááºáá«á
áá¯á¶ááŸáẠKeycloak á¡á á¯á¡áá±áž
á€áá¯ááºááœáẠKeycloak ááá¯ááœáá·áºááẠáááºááẠááá¯á¡ááºáááº-
- ááŒááºááá»áŸáá±áá¬ážáá±á¬áá±áá¬áá±á·á áºááᯠá á®á ááºáááºááŸááºáá«á
- load balancer ááᯠinstall áá¯ááºáá«á
- IP multicast áá¶á·ááá¯ážááŸá¯ááŒáá·áº á¡ááœááºážááœááºáááºáá áºáá¯ááŸááááºá
á€áá±á¬ááºážáá«ážááááºááœááºáá»ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº ááŒááºááá±áá¬áá±á·á áºáá áºáá¯áááºáá±á¬ááºááŒááºážááᯠáá»áœááºá¯ááºááá¯á· ááœá±ážááœá±ážáááºááá¯ááºáá«á áá áºáá±áá¬áá¬ááŸá¬ á¡áá¯ááºáá¯ááºáá²á· áá±áá¬áá±á·á áºáá áºáᯠááŸááá±áááºááá¯á· áá°áááŒáá«á áá¯á·á ááŒá®ážáá±á¬á· á¡á²áá«áá²á· áá»áááºáááºááŸá¯áá áºáᯠááŸááááºá áá»áœááºá¯ááºááá¯á·ááẠá€áá±áá¬ááᯠEnvironment variables áá»á¬ážááá¯á· ááá¯ážááá¯ážááŸááºážááŸááºážááá·áºáá«áááºá
Keycloak ááẠfailover (HA) cluster ááœáẠáááºááá¯á·á¡áá¯ááºáá¯ááºáááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá áœá¬áá¬ážáááºáááºá áááºážááẠWildfly á á¡á á¯ááá¯ááºáá¯ááºáá±á¬ááºááá¯ááºááŸá¯á¡áá±á«áºááœáẠáááºáá»áŸááŸááááºááᯠááááŸáááẠá¡áá±ážááŒá®ážáá«áááºá
Wildfly ááẠá áá áºááœá²áá»á¬ážá áœá¬ááá¯á¡áá¯á¶ážááŒá¯áááºá á¡áá»áá¯á·ááᯠload balancer á¡ááŒá áºá¡áá¯á¶ážááŒá¯ááŒááŒá®áž á¡áá»áá¯á·ááŸá¬ á¡ááŸá¬ážáá¶ááá¯ááºáááºááŸááááºá¡ááœáẠá¡áá¯á¶ážááŒá¯ááŒáááºá á¡á á¯á¡áá±ážáá áºáá¯ááẠáááºááá¯áá±áá»áááºááœáẠá¡ááºááºáá®áá±ážááŸááºážáááŸáááá¯ááºááŸá¯ááᯠáá±áá»á¬á á±ááŒá®áž áá»áá¯á·ááœááºážáá»ááºáááºážáá¶ááŒááºážááẠá¡ááá®áá±ážááŸááºážááŸáááá¯ááºááŸá¯ááᯠáá±áá»á¬á á±áááºá á€á áá áºááœá²á¡áá»áá¯á·-
-
mod_cluster
: Apache ááẠHTTP load balancer á¡ááŒá ẠApache ááŸáá·áº ááœá²áááºá¡áá¯ááºáá¯ááºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áº hosts ááá¯ááŸá¬ááẠTCP multicast áá±á«áºááœááºáá°áááºáááºá External Balancer ááŒáá·áº á¡á á¬ážááá¯ážááá¯ááºáá«áááºá -
infinispan
JGroups áá»ááºáááºáá»á¬ážááᯠáááºáá°ááá¯á·áá±á¬ááºáá±ážá¡ááœáŸá¬á¡ááŒá Ạá¡áá¯á¶ážááŒá¯á ááŒáá·áºáá±áá¬ážáá±á¬ áááºááŸáºáá áºáá¯á ááá¯á·á¡ááŒááºá áááºážááẠáááºááŸáºá¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠáá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááẠááŒááºá Infinispan á¡á á¯á¡áá±ážááŸáá·áº áááºááœááºááẠHotRod áááá¯ááá¯áá±á¬ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá -
jgroups
JGroups áá»ááºáááºáá»á¬ážááᯠá¡ááŒá±áá¶á á¡ááœááºáááŸáááá¯ááºáá±á¬ áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠá¡á¯ááºá á¯áááºááœááºááŸá¯ áá¶á·ááá¯ážááŸá¯áá±ážáá«áááºá á¡áááºáá±ážáá¬ážáá±á¬ ááá¯ááºáá»á¬ážááẠá¡á á¯á¡áá±ážáá áºáá¯á¡ááœááºážááŸá á¡ááá®áá±ážááŸááºážááŒá áºáááºáá»á¬ážááᯠá¡á¯ááºá á¯áá»á¬ážá¡ááœááºáž áá»áááºáááºááá¯ááºá á±áá±á¬ááŒá±á¬áá·áº áááºááœááºáá±ážááẠáá¯á¶ááŒááºá áááºáá»áááŸá¯á á ááºážá áá áºáá»ááŸá¯ááŸáá·áº áá»ááŸá¯á¶ážááŸá¯áá»á¬ážááᯠá¡á¬áá¯á¶áá¶ááá¯ááºá áœááºážáá²á·ááá¯á·áá±á¬ áá¯ááºááá¹áááá»á¬ážááŸááááºá
Load Balancer
Kubernetes á¡á á¯á¡áá±ážááœáẠáá»áááºááœááºáá»áŸá¬ ingress controller á¡ááŒá Ạááá·áºááœááºážááá·áºá¡áá«á á¡á±á¬ááºáá«á¡áá¬áá»á¬ážááᯠááŸááºáá¬ážáá¬ážááẠá¡áá±ážááŒá®ážáááº-
á¡áá±á¬ááºá¡áá¬ážá
áá
á
áºááŒááºážáá¬áá¬ááá¯á· HTTP ááŸáááá·áºáá»áááºáááºáá¬ážáá±á¬ client áá¡áá±ážááááºá
á¬ááááºá
á¬ááẠclient computer á IP ááááºá
á¬á¡á
á
áºá¡ááŸááºááŒá
áºáááºáᯠKeycloak ááŸáá°ááááºá Balancer ááŸáá·áº Ingress áááºáááºáá»á¬ážááẠHTTP áá±á«ááºážá
á®ážáá»á¬ážááᯠááŸááºáááºá
áœá¬ áááºááŸááºááá·áºáááºá X-Forwarded-For
О X-Forwarded-Proto
áá°áááºážáá±á«ááºážá
ááºááá¯áááºáž ááááºážáááºážáá«á HOST
. áá±á¬ááºáá¯á¶ážááœááºáá¬ážááŸááºáž ingress-nginx
(> 0.22.0)
á¡áá¶ááá¯á¡áááºááœááºážááŒááºážá proxy-address-forwarding
áááºâáááºážáá»ááºââááŒá±á¬ááºážâááœá²ááŸá¯âááᯠáááºááŸááºâááŒááºážááŒáá·áºâ PROXY_ADDRESS_FORWARDING
в true
áááºážááẠproxy áá±á¬ááºááœááºááœáẠá¡áá¯ááºáá¯ááºáá±ááŒá±á¬ááºáž Keycloak á áá¬ážáááºáá±ážáááºá
ááœáá·áºáááºáááºáž ááá¯á¡ááºáá«áááºá áááºá á±ážáá²áá±á¬ áááºááŸááºáá»á¬áž ingress ááœááºá Keycloak ááẠáááºááŸá á¡áá±á¬ááºá¡áá¬ážá áá á áºááŒááºáž á ááºááŸááºááŸáá·áº á¡áá¯á¶ážááŒá¯áá° á ááºááŸááºááŸáá·áº áááºá ááºáá±áá±á¬ áá±áá¬ááᯠááááºážáááºážááẠááŒáá·áºáá±áá¬ážáá±á¬ Infinispan áááºááŸáºááᯠá¡áá¯á¶ážááŒá¯áááºá áááºááŸáºáá»á¬ážááẠááá¯ááºááŸááºáá áºáŠážáááºážááŸáá·áº áááºáááºáá±áááºá áá áºáááºážá¡á¬ážááŒáá·áºááá¯ááá±á¬áº á¡ááá¯áá«á ááºááŸááºááẠá¡á á¯á¡áá±ážááŸá á¡áá»áá¯á·áá±á¬ node áá±á«áºááœáẠááááºážáááºážáá¬ážááŒá®ážá á¡ááŒá¬áž node áá»á¬ážááẠááá¯á ááºááŸááºááá¯á· áááºáá±á¬ááºááœáá·áºááá¯á¡ááºáá«á áááºážááᯠá¡áá±ážá០áá±ážááŒááºážááááºááŒá áºáááºá
á¡ááá¡áá»á¡á¬ážááŒáá·áºá á á¬ááœááºá á¬áááºážááŸáá·áº ááá·áºáá»ááºáááºááŒá áºááŒá®ážá ááœááºáá®ážá¡áááºááŒáá·áº á ááºááŸááºáá áºáá¯ááᯠáá°ážááœá²ááá·áºááœááºážááŒááºážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡áá¯ááºáááŒá áºáá«á
AUTH_SESSION_ID
. Keycloak ááœáẠredirect loop áá áºáá¯ááŸááááºá ááá¯á·ááŒá±á¬áá·áº sticky session á¡ááœáẠá¡ááŒá¬áž cookie á¡áááºáá áºáá¯ááᯠááœá±ážáá»ááºááẠá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá
Keycloak ááẠáŠážá
áœá¬áá¯á¶á·ááŒááºáá±á¬ node áá¡áááºááá¯áááºáž áá°ážááœá²áá«ááŸááááºá AUTH_SESSION_ID
ááŸáá·áº á¡ááœááºáááŸáááá¯ááºáá±á¬áá¬ážááŸááºážááŸá node áá
áºáá¯á
á®ááẠáá°áá®áá±á¬áá±áá¬áá±á·á
áºááá¯á¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áºá áááºážááá¯á·áá
áºáá¯á
á®ááẠáá°áá®áá«áááºá JAVA_OPTS
parameters ááœá±ááᯠjboss.node.name
О jboss.tx.node.id
node áá
áºáá¯á
á®á¡ááœááºáá°ážááŒá¬ážááẠ- á¥ááá¬á¡á¬ážááŒáá·áº pod áá¡áááºááá¯áááºááá·áºááá¯ááºáááºá á¡áááºá áááºááẠpod name ááá¯ááá·áºáá«áá jboss variables á¡ááœáẠá
á¬áá¯á¶áž 23 áá¯á¶ážááá·áºáááºáá»ááºááᯠááá±á·áá«ááŸáá·áºá ááá¯á·ááŒá±á¬áá·áº Deployment ááẠStatefulSet ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá ááá¯áá±á¬ááºážáá«áááºá
á¡ááŒá¬ážááœááºááŒá
Ạ- pod ááá¯áá»ááºáá
áºáá«á ááá¯á·ááá¯áẠááŒááºáááºá
áááºáá«áá áááºážá cache áá»á±á¬ááºáá¯á¶ážááœá¬ážáá«áááºá áááºážááᯠááá·áºááœááºážá
ááºážá
á¬ážááŒááºážááŒáá·áº áááºááŸáºáá
áºáá¯á áááá¹áá°áá»ááºááŸááá±á
á±áááºá¡ááœáẠáááºááŸáºá¡á¬ážáá¯á¶ážá¡ááœáẠáááºááŸáºááá¯ááºááŸááºá¡áá±á¡ááœááºááᯠá¡áááºážáá¯á¶áž ááŸá
áºáá¯á¡áá áááºááŸááºáá±ážááá·áºáááºá ááŒá±ááŸááºážáá»ááºááá±á¬á· ááŒá±ážááá¯á·áá«áá²á /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
ááá¯á·áá±á¬áẠEnvironment variable ááááºááá¯ážááᯠáááºááŸááºáá«á CACHE_OWNERS
ááá¯á¡ááºáááºá
IP multicast áá¶á·ááá¯ážááŸá¯ááŒáá·áº ááá¯ááºááá¯ááºááœááºáááº
Weavenet ááᯠCNI á¡ááŒá áºá¡áá¯á¶ážááŒá¯áá«áá multicast áááºáá»ááºáá»ááºážá¡áá¯ááºáá¯ááºáááá·áºááẠ- ááŸáá·áºáááºá Keycloak nodes áá»á¬ážááá¯á áááºáááºááŸáá·áºáááŒáá¯ááºáááºá¡ááŒááºá¡ááŸááºááœá±á·áááá·áºáááºá
ááá·áº Kubernetes á¡á á¯á¡áá±ážááœáẠip multicast áá¶á·ááá¯ážááŸá¯áááŸááá«áá nodes ááá¯ááŸá¬ááœá±ááẠá¡ááŒá¬ážáááá¯ááá¯áá±á¬áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºááẠJGroups ááᯠáááºáááºááŸááºááá¯ááºáá«áááºá
áááááœá±ážáá»ááºááŸá¯ááŸá¬ á¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá KUBE_DNS
áááºáá¬ááá¯áá¯á¶ážáá¬áá² headless service
Keycloak nodes ááá¯ááŸá¬áááºá node áá»á¬ážááá¯ááŸá¬ááœá±áááºá¡áá¯á¶ážááŒá¯ááá·áºáááºáá±á¬ááºááŸá¯áá¡áááºááᯠJGroups ááá¯ááá¯ážááŸááºážá
áœá¬ááŒááºáááºážáá«á
á¡ááŒá¬ážááœá±ážáá»ááºá
áá¬ááŸá¬ áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá KUBE_PING
node ááá¯ááŸá¬ááœá±ááẠAPI ááŸáá·áºá¡áá¯ááºáá¯ááºááẠ(ááẠconfigure áá¯ááºáááºááá¯á¡ááºáááºá serviceAccount
á¡ááœáá·áºá¡áá±ážááœá±áá²á· list
О get
á ááá¯á·áá±á¬áẠáááºážááŸáá·áºá¡áá¯ááºáá¯ááºááẠpods áá»á¬ážááᯠconfigure áá¯ááºáá«á serviceAccount
).
JGroups ááẠnode áá»á¬ážááá¯ááŸá¬ááœá±ááá·áºáááºážáááºážááᯠEnvironment variable áá»á¬ážáááºááŸááºááŒááºážááŒáá·áº configure áá¯ááºáá¬ážáááºá JGROUPS_DISCOVERY_PROTOCOL
О JGROUPS_DISCOVERY_PROPERTIES
á á¡ááœáẠKUBE_PING
áá±ážááŒááºážááŒáá·áº pods ááá¯ááœá±ážáá»ááºáááºááá¯á¡ááºáááºá namespace
О labels
.
ïž á¡áááºá áááºááẠmulticast ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž Kubernetes á¡á á¯á¡áá±ážáá áºáá¯ááœáẠKeycloak ááŸá áºáᯠááá¯á·ááá¯áẠááá¯á·áááºááá¯áá±á¬ á¡á á¯á¡áá±ážáá»á¬ážááᯠrun áá«á (á¡áááºá áá±á·ááœááºáá áºáá¯áᯠááá¯ááŒáá«á áá¯á·á
production
, áá¯ááá -staging
) - Keycloak cluster áá áºáá¯á node áá»á¬ážááẠá¡ááŒá¬ážáá±á¬ cluster ááŸáá·áº áá»áááºáááºááá¯ááºáááºá ááááºážááŸááºáá»á¬ážááᯠáááºááŸááºááŒááºážááŒáá·áº á¡á á¯á¡áá±ážáá áºáá¯á á®á¡ááœáẠáá®ážááŒá¬áž multicast ááááºá á¬ááᯠá¡áá¯á¶ážááŒá¯ááẠáá±áá»á¬áá«á á±ájboss.default.multicast.address
Оjboss.modcluster.multicast.address
вJAVA_OPTS
.
áá±áá¬á ááºáá¬áá»á¬ážá¡ááŒá¬áž áá°ážáá°ááŸá¯
СвÑзÑ
Keycloak ááẠKeycloak nodes áá»á¬ážáááºááŸááᬠáá±áá¬á ááºáá¬áá áºáá¯á á®á¡ááœáẠáá®ážááŒá¬áž Infinispan cache á¡á á¯á¡áá±ážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá ááá¯á·áá±á¬áº ááá°áá®áá±á¬áá±áá¬á ááºáá¬áá»á¬ážááŸá Keycloak node áá»á¬ážááŒá¬ážááœáẠááœá¬ááŒá¬ážááŸá¯áááŸááá«á
Keycloak node áá»á¬ážááẠáá±áá¬á
ááºáá¬áá»á¬ážááŒá¬áž áááºááœááºááŸá¯á¡ááœáẠááŒááºá Java Data Grid (Infinispan áá¬áá¬áá»á¬áž) ááᯠá¡áá¯á¶ážááŒá¯áááºá áááºááœááºáá±ážááẠáááá¯ááá¯áá±á¬á¡á á¡áá¯ááºáá¯ááºáááºá
Infinispan áááºááŸáºáá»á¬ážááᯠáááºááœáŸááºážáá»ááºááŒáá·áº ááŒááºáááºáááºááŸááºááá«áááºá remoteStore
áá±áá¬ááᯠá¡áá±ážá០ááááºážáááºážááá¯ááºá
á±ááẠ(á¡ááŒá¬ážáá±áá¬á
ááºáá¬á á¡áá®ážá
ááºáá¯á¶áž áá¬áá¬ááŒááºáá°) áááºááŸáºá JDG áá¬áá¬áá»á¬ážááŒá¬ážááœáẠáá®ážááŒá¬áž Infinispan á¡á
á¯á¡áá±ážáá»á¬áž ááŸááááºá ááá¯á·ááŒá±á¬áá·áº JDG1 ááœáẠááááºážáááºážáá¬ážááá·áº áá±áá¬á site1
site áá±á«áºááœáẠJDG2 ááá¯á· áááºáá°ááŒá¯áá«áááºá site2
.
áá±á¬ááºáá¯á¶ážá¡áá±ááŸáá·áºá áááºáá¶áááŸáááá·áº JDG áá¬áá¬ááẠHotRod áááá¯ááá¯áá±á¬áá¡ááºá¹áá«áááºááŒá
áºááá·áº client áá»áááºáááºááŸá¯áá»á¬ážááŸáá
áºááá·áº áááºážáá¡á
á¯á¡áá±ážá Keycloak áá¬áá¬áá»á¬ážááᯠá¡áááá±ážáááºá áá±á¬á·áá»áááºááœá²áá»á¬ážááᯠááœáá·áºáá¬ážáááºá site2
áááºážááá¯á·á Infinispan áááºááŸáºáá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒá®áž áá®ážááá·áºá¡áá¯á¶ážááŒá¯áá°á
ááºááŸááºááᯠááœáá·áºáá¬ážááá·áº Keycloak node áá»á¬ážááœááºáááºáž áááŸáááá¯ááºáá«áááºá site2
.
á¡áá»áá¯á·áá±á¬ áááºááŸáºáá»á¬ážá¡ááœááºá áááá¹áá°áá°ážááŒááºážáááŒá¯áááºááŸáá·áº Infinispan áá¬áá¬ááŸáááá·áº á¡áá»ááºá¡áááºáá±ážááŒááºážááᯠáá¯á¶ážáááŸá±á¬ááºááŒááºáááºáááºáž ááŒá
áºááá¯ááºáááºá áá®ááá¯áá¯ááºááá¯á·áááºáááºáááºááá¯áááºááŸá¬ážáááºááá¯á¡ááºáááºá remote-store
áá®ážááŒá¬áž Infinispan cache (ááá¯ááºááœáẠstandalone-ha.xml) ááŒá®ážá០áááºáááºááŸááºááŸáẠreplicated-cache
Infinispan áá¬áá¬áááºááœááºáááºáž áááá¯á¡ááºáá±á¬á·áá«á
áááºááŸáºáá»á¬ážááᯠá áá áºááá·áºááœááºážááŒááºážá
Keycloak ááœáẠáááºááŸáº á¡áá»áá¯ážá¡á á¬áž ááŸá áºáá»áá¯ážááŸááááºá
-
ááŒááºááœááºážá áááºážááẠáá±áá¬áá±á·á áºáá±ážááœáẠáááºááŸáááŒá®áž áá±áá¬áá±á·á áºáá±á«áºááŸá áááºááᯠáá»áŸá±á¬á·áá»áááºááŸáá·áº áá¯á¶á·ááŒááºáá»áááºáá±áá»áááºááᯠáá»áŸá±á¬á·áá»ááẠáá¯ááºáá±á¬ááºáááºá ဠcache á¡áá»áá¯ážá¡á á¬ážááẠrealmá clientsá roles ááŸáá·áº user metadata ááᯠááááºážáááºážáá«áááºá áááºááŸáºááẠKeycloak á¡á á¯á¡áá±ážáá áºáá¯á áá áºá áááºáá áºááá¯ááºážááŒá áºáá±á¬áºááŒá¬áž ဠcache á¡áá»áá¯ážá¡á á¬ážááᯠáááºáá°ááœá¬ážáááºááá¯ááºáá«á áááºááŸáºááœáẠááá·áºááœááºážááŸá¯áá áºáᯠááŒá±á¬ááºážáá²áá«áá á¡ááŒá±á¬ááºážá¡áá²ááŸáá·áºáááºáááºááá·áº áááºáá±á·áá»áºááᯠá¡á á¯á¡áá±ážááŸá áá»ááºáá¬áá¬áá»á¬ážáᶠáá±ážááá¯á·áááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠááá·áºááœááºážááŸá¯ááᯠáááºááŸáºá០áááºáá¯ááºáááºááŒá áºáááºá áá±á¬áºááŒáá»ááºááᯠááŒáá·áºáá«á
work
áá¯ááºáá¯á¶ážáá¯ááºáááºážá á¡áá±ážá áááºáá±á¬áºááŒáá»ááºááᯠá¡á±á¬ááºááœááºááŒáá·áºááŸá¯áá«á -
áá¯á¶áá°áá°ážáá¬ážáááºá á¡áá¯á¶ážááŒá¯áá° sessions áá»á¬ážá á¡á±á¬á·ááºááá¯ááºážááá¯áááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒá®áž á áá¬ážááŸáẠááŒá¬ážáá±á¬ááºážááŒááºáž ááŒáá¯ážáááºážááŸá¯áá»á¬ážááŸáá·áº á¡ááŒá¬ážááá¯ááºááá¯ááºááŸá¯áá»á¬ážááᯠááááŸáááá¯ááºá á±ááẠá¡áá±á¬áá·áºáááºááŒááºážááá¯ááºáᬠá¡ááŸá¬ážáá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºáá«áááºá á¡ááá¯áá« áááºááŸáºáá»á¬ážááœáẠááááºážáááºážáá¬ážááá·áº áá±áá¬ááẠáá¬áá®ááŒá áºááŒá®áž RAM ááœááºáᬠááááºážáááºážáá¬ážáá±á¬áºáááºáž á¡á á¯á¡áá±ážááœáẠáááºáá°ááœá¬ážááá¯ááºáááºá
Infinispan áááºááŸáº
Sessions - Keycloak ááœáẠáá®ážááŒá¬áž caches áá¯áá±á«áºáá±á¬ á¡áá°á¡ááá
áºáᯠauthenticationSessions
áááºááŸááºáá¬ážáá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááá±áá¬ááá¯ááááºážáááºážáááºá¡áá¯á¶ážááŒá¯ááŒáááºá á¡ááá¯áá« áááºááŸáºáá»á¬ážá០áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº ááá±á¬ááºáá¬ááŸáá·áº Keycloak áá¬áá¬áá»á¬ážá á¡ááá®áá±ážááŸááºážáá»á¬ážááŸááá¯ááºáá²á á€áá±áá¬ááœáẠáááºá
á±ážáááºáá±á¬ áááºááŸááºáá»á¬ážáá±á«áºááœáẠááŸá®ááá¯á¡á¬ážáá¬ážááŸá¯ ááŸááá¬áá¬á Active-Active áá¯ááºááœááºááẠááá¯áá²á·ááá¯á·áá±á¬ áááºááŸáºáá»á¬áž ááá¯ááºááá¯áẠáááºáá°áá¯ááºááẠáááá¯á¡ááºáá«á
áá¯ááºáá±á¬ááºáá»ááºááá¯áááºáá»á¬áž. á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá¯á¶ážááŒá¯áá°ááẠáá±ážááºááŒáá·áº áá
áºáá¯áá¯ááᯠáááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºáááá·áºá¡áá«ááœáẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº á¡áá»áá¯ážáá»áá¯ážáá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áá±á·ááŸáááá·áº á¡ááŒá¬ážá¡áá°á¡áá á¥ááá¬á áá¯ááºáá¯á¶ážáá¯ááºáááºážá¡ááœááºáž forget password
cache ááᯠactionTokens
áááºá
ááºááá¯áááºáá»á¬ážá áááºáá¬áá±áá¬ááᯠááŒá±áá¬áá¶áááºá¡áá¯á¶ážááŒá¯ááẠ- á¥ááá¬á¡á¬ážááŒáá·áºá ááá¯áááºáá
áºáá¯ááᯠá¡áá¯á¶ážááŒá¯ááŒá®ážááŒá
áºááŒá®áž áááºáá¶á¡áááºáááœááºážááá¯ááºáá±á¬á·áá«á ဠcache á¡áá»áá¯ážá¡á
á¬ážááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº áá±áá¬á
ááºáá¬áá»á¬ážááŒá¬ážááœáẠáá¯á¶áá°ááœá¬ážááẠááá¯á¡ááºáááºá
ááááºážáááºážáá¬ážáá±á¬ áá±áá¬áá»á¬ážááᯠááááºážáááºážááŒááºážááŸáá·áº á¡áá¯áááºážááŒááºáž áá±áá¬áá±á·á
áºáá±á«áºááŸááááºááá¯áá»áŸá±á¬á·áá»áááºá¡áá¯ááºáá¯ááºáááºá ဠcaching á¡áá»áá¯ážá¡á
á¬ážááẠá
áœááºážáá±á¬ááºáááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá
á±áá±á¬áºáááºáž áááá¬áááºááŸá¬ážáá±á¬ ááŒá¿áá¬áá
áºáᯠáááºáá±á¬ááºážáá«áááºá Keycloak áá¬áá¬áá
áºáá¯ááẠáá±áá¬ááᯠá¡ááºááááºáá¯ááºáá«áá á¡ááŒá¬ážáá¬áá¬áá»á¬ážááẠáááºážááá¯á·á áááºááŸáºáá»á¬ážááœáẠáá±áá¬ááᯠááœááºážáá¶ááá¯ááºá
á±ááẠá¡ááŒá±á¬ááºážááŒá¬ážááá«áááºá Keycloak ááẠáá±áááœááºáž áááºááŸáºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá realms
, users
О authorization
áá±áá¬áá±á·á
áºááŸáá±áá¬ááá¯ááááºážáááºážáááºá¡ááœááºá
áá®ážááŒá¬áž cache áááºážááŸááá«áááºá work
áá±áá¬á
ááºáá¬á¡á¬ážáá¯á¶ážááœáẠáá¯á¶áá°áá°ážáá¬ážáááºá áááºážááá¯ááºááá¯ááºá áá±áá¬áá±á·á
áºá០áááºááá·áºáá±áá¬ááá¯áá»áŸ ááááºážáááºážááá¬ážáá±á¬áºáááºáž áá±áá¬á
ááºáá¬áá»á¬ážááŒá¬ážááŸá á¡á
á¯á¡áá±ážáá»á¬ážáá®ááá¯á· áá±áá¬á¡áá¯áááºážááŒááºážá¡ááŒá±á¬ááºáž áááºáá±á·áá»áºáá»á¬áž áá±ážááá¯á·ááẠáá¯ááºáá±á¬ááºáááºá áá
áºáááºážááá¯ááá±á¬áº áá±áá¬ááœááºážáá¶ááŒá®ážáááºááŸáá·áºá Keycloak node ááẠáááºážááá±áá¬á
ááºáá¬ááŸá á¡ááŒá¬áž node áá»á¬ážá¡ááŒáẠá¡ááŒá¬ážáá±áá¬á
ááºáá¬áá»á¬ážááŸá node áá»á¬ážáá¶ááá¯á· áááºáá±á·áá»áºáá
áºáᯠáá±ážááá¯á·áá«áááºá ááá¯ááá¯á·áá±á¬áááºáá±á·áá»áºááᯠáááºáá¶áááŸáááŒá®ážáá±á¬ááºá node áá
áºáá¯á
á®ááẠáááºážáá
ááºááœááºážááŸá áááºááŸáºáá»á¬ážááŸá áááºááá¯ááºáá¬áá±áá¬áá»á¬ážááᯠááŸááºážáááºážáááºá
á¡áá¯á¶ážááŒá¯áá° á¡á
ááºážá¡áá±ážáá»á¬áž. á¡áááºáá»á¬ážááŒáá·áº áááºááŸáºáá»á¬áž sessions
, clientSessions
, offlineSessions
О offlineClientSessions
á á¡áá»á¬ážá¡á¬ážááŒáá·áº áá±áá¬á
ááºáá¬áá»á¬ážááŒá¬ážááœáẠáá¯á¶áá°ááœá¬ážááŒá®áž áá¯á¶ážá
áœá²áá°ááẠááá±á¬ááºáá¬ááœáẠá¡áá¯á¶ážááŒá¯áá±áá»áááºááœáẠáááºááŒáœáá±áá»áááºááœáẠá¡áá¯á¶ážááŒá¯áá° sessions áá»á¬ážá¡ááŒá±á¬ááºáž áá±áá¬ááᯠááááºážáááºážááẠáá¯ááºáá±á¬ááºáá«áááºá ဠáááºááŸáºáá»á¬ážááẠáá¯á¶ážá
áœá²áá°áá»á¬ážáá¶á០HTTP áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±ááá·áº á¡ááºááºááŸáá·áº á¡áá¯ááºáá¯ááºáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááẠáááºá
á±ážáá²áá±á¬ áááºááŸááºáá»á¬ážááŸáá·áº áááºá
ááºáá±ááŒá®áž áá±áá¬á
ááºáá¬áá»á¬ážááŒá¬ážááœáẠáááºáá°áá¯ááºááááºááŒá
áºáááºá
áááºá
ááºááŒááºážááŒá¯ááºááŸá¯áá¬ááœááºááŸá¯. áááºááŸáº 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" />
Keycloak á¡á á¯á¡áá±ážááᯠáá áááºáá® áááºááẠInfinispan á¡á á¯á¡áá±ážááᯠá á®á ááºáááºááŸááºááŒá®áž á áááºááá«áááºá
ááá¯á·áá±á¬ááºááẠconfigure áá¯ááºáááºááá¯á¡ááºáááºá remoteStore
Keycloak áááºááŸáºáá»á¬ážá¡ááœááºá áá«ááá¯áá¯ááºááá¯á·á script áá
áºáá¯á áá¯á¶áá±á¬ááºáá«áááºáá variable ááá¯áááºááŸááºááá¯á·á¡áá¯á¶ážááŒá¯áá¬ážáá²á· ááááºáá
áºáá¯áá²á· á¡áá¬ážáá°áá¯ááºáá±á¬ááºáááºá 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
HotRod ááᯠrun ááẠKeycloak node á¡ááœáẠremote.cache.host
, remote.cache.port
ááŸáá·áºáááºáá±á¬ááºááŸá¯á¡ááẠjboss.site.name
.
ááá·áºááºáá»á¬ážááŸáá·áº áá±á¬ááºáááºá á¬ááœááºá á¬áááºážáá»á¬áž
https://www.keycloak.org/docs/latest/server_installation/index.html https://docs.wildfly.org/17/High_Availability_Guide.html#cluster-configuration https://infinispan.org/docs/9.4.x/user_guide/user_guide.html https://hub.docker.com/r/jboss/keycloak https://hub.docker.com/r/jboss/infinispan
áá±á¬ááºážáá«ážááᯠáááºáááºážáá»á¬ážá០Habr á¡ááœáẠáá¬áá¬ááŒááºááŒá®áž ááŒááºáááºáá¬ážáá«áááºá
source: www.habr.com