TL; αα»αα ααΉαααΆαααΆααα·αααααΆα’αααΈ Keycloak αααααΆαααααααααααααααααααΆαα αΌαααααΎαααααααΎαα αα ααΆααα·ααΆααα ααΆααααααααααΆααααα»α ααααααΆααααα’α·αααααΆααααααα
ααα ααααΈααααΎα αα·ααααα·αααααΆααα
αα αααα»αα’αααααααα ααΎαααΉαααΎααααα·αααΆααΌαααααΆααααααααΌαα αα αΆααα αααααΆαααααααΆα Keycloak cluster αα ααΎ Kubernetes α
ααααα·αααΎα’αααα
ααααΉαααααααα’αααΈ Keycloak ααΌαααΎααααααααΆαααα
α
α»ααααα
ααααα’αααααα ααΎααααΈααΆαααααααΈααααα
αααα»αααΆαα’αα»αααα α’αααα’αΆα
αα·ααααΆααΆαα
Keycloak ααΊααΆααααααααααααΌααααΌααΆααα½ααααααααΌαααΆαααααααα
αααα»α Java αα·αααααΌαααΆααααααΎαα‘αΎααα
ααΎααααΌααααααΆαααΈααααααααα·ααΈ
ααΎαααΌαα’ααααΎαα’αααα±ααα’αΆαααΆααααΌαααΆα
ααΆαααΎαααααΎαααΆα Keycloak
Keycloak ααααΌαααΆαααααααα·ααααααααΆααααΆααααΈαααΎααααΈααααΎαααΆαα
- ααΌαααααΆααα·αααααααααααααΎααΎααααΈαααααΆαα»ααα·αααααααααααΆααααααΎαα‘αΎα ααΌα ααΆααααααΆαα’αααααααΎααααΆαα
- ααααΆαααααααΆαα Datagrid αααααααΌαααΆαααααΎααΎααααΈαααααΆαα»ααα·ααααααααΈααΌαααααΆααα·αααααα ααααΌα
ααΆαααααΆαα»ααα·ααααααααααΆαααααααΆααααααΌαααααααααααΈ αα·αααΉαααΆαααα½αα
ααα½α ααΌα
ααΆααααα’αααααααΎααααΆααααΆααΎαα ααΆαα’αα»αααα
αααα»αα αα»α Infinispan αααααΆααααααΆααΏαααΆαααΌαααααΆααα·ααααααα ααα»αααααααα»αααααΈααΆααααα αα·αααααααααααΆααααααΆαα»ααα αααα»α Infinispan ααΊααΆαααΆαα ααααΌαα ααααα α αΎαααΆαα·αα αΆαααΆα αααααΌααααααΆαα»ααα ααααααααΆααααα αα ααααααα αααααααααΌαααΆαα αΆααααααΎαα‘αΎααα·αα
Keycloak ααααΎαααΆααααα»ααααααα½ααααααααααΆα
- ααααααΆ - ααααΎαααΆααα½α αα·ααααα½αααα ααααααα ααΆααααααααααΆααααα―αααΆα standalone.xml
- α αααααααααααΆα (αααααΎααααα’αΆα ααααΆαααααα) - ααααΎαααΆαααΆααα’ααααααΌαααααααΎααΆααααααααΌα ααααΆ αααααααΌαααααααΎααααΆααααααααααα ααΆααααααααααΌαααΆααααααΆαα»ααααα»αα―αααΆα α―αααΆααα-ha.xmlααΎαααΈααα α’αααααααΌααααααΎαααΆαα αΌαααααΎαα½αααααΆαα ααΆααααΌαααααΆααα·αααααα αα·αα§ααααααααα»ααα»αααααΆαα
- α αααααααα β ααΆαα αΆααααααΎαα ααααααααα»αααααααααααΆααααΆαααΆαα·α αα ααΆαααααααΆ αα·ααα½αα±αααα»ααααΆαααΆαααα αα αα ααααααα αααααααΈαα ααααΎα α αΆααααΆααααΈααΆααααααααααΆαααααΆααααααΌαααΆαααααααα ααΆαααααααα ααΆαααααΆααααααΌαααΆααα’ααααααΌαααααααΎα‘αΎααα ααΎααααΆααα αααααααΈαα½ααα ααααααααα·ααααα·ααΆαααααααααααααααΆααααα αΆαααααααααα αααΈααΆαααααα»ααααααΆαα ααααααααα½αα ααα½α αα·αααΆαααααα»αααααΆαααααααα ααΆααααααααα ααΆααααααααΆαααααααααΌαααΆααααααΆαα»ααααα»αα―αααΆα domain.xml
- ααΆαα αααααααΆαααααααααααα·αααααα β ααααα·αααΎα’αααα ααααααΎαααΆα Keycloak αα αααα»αα αααααααααααααααααα·ααααααααΆα αααΎα αααααΆαα αααΎαααΆααΉαααΆαααα αααα»αααΈααΆααααΌαα·ααΆαααααααααααααααΆα αα αααα»ααααααΎαααα ααααααααααα·ααααααααΈαα½ααααΉαααΆαα ααααααααΆαααΈααα Keycloak ααααΆαααααα½αα
αα αααα»αα’ααααααααααΎαααΉααα·α αΆαααΆαααα’α·αα’αααΈαααααΎαααΈααΈα αααααΊ α αααααααααααΆαα αΎαααΎαααααΉααααααααα·α ααΎαααααΆαααααααΆαα αααααααΆαααααααααααα·αααααα αααααααΆααα ααα»αααααα»αααΆαααααΎαααΆααααααΎαααΆααααΈαααααα αααα»α Kubernetesα ααΆααααΆαααα’αα αααα»α Kubernetes αα·αααΆααααα αΆααΆαα½αααΉαααΆαααααΎααααΆαααααααΆαααααααααα pods ααΆα αααΎα (Keycloak nodes) ααΌα αααα α αααααααα ααΆααΉααα·ααα·ααΆαααααΎααα
ααΌαα αααΆααααααααΆααΆααα α ααααα αααααΆααα’αααααααααα αααααΉαα’αα»ααααα αααααααααα»αααααααΆαα Keycloak αααααααΎααΆαααΆαα½αααααΆ αα·αα αΆαααΆα αααααα ααΎα ααααα Kubernetes ααα
α ααααα Keycloak ααααααΆα
ααΎααααΈααααΎαααΆα Keycloak αααα»αααααααα α’αααααααΌαααΆαα
- ααααααα ααΆααααααααααΌαααααΆααα·αααααααααααΆαα αααααααααΆααααα
- ααα‘αΎαα§ααααααααα»ααα»αααααΆα
- ααΆααααααΆαααΆααααα»ααααααΆαααΆαααΆαααα IP multicast
ααΎαααΉααα·ααα·ααΆααααΆα’αααΈααΆαααα‘αΎαααΌαααααΆααα·ααααααααΆααααα αα αααααααΆαα·ααααααΆαααααααααα’ααααααααααα α αΌααααααααΆααΆαααΌαααααΆααα·ααααααααααΎααΆααα ααααααααΆαα½α - α αΎαααΎαααΆαα ααα»α αααααΆαααα ααΆα ααΎαααΉααααααααα·ααααααααααα α’αααααα·ααααΆαα
ααΎααααΈαααααΆααααα αααΆααα’αααΈααααααα Keycloak ααααΎαααΆααα αααα»αα αααααααααααΆααα (HA) ααΆααΆααΏαααααΆααααΎααααΈααΉαααΆααΎααΆα αααΎαααα»ααααΆ α’αΆαααααααΎαααααααΆαααααΆαααααΎα ααααααααα Wildfly α
Wildfly ααααΎααααααααααααΆα αααΎα ααααα½αα ααα½αααααΌαααΆαααααααΎααΆα§ααααααααα»ααα»αααααΆα αααααααααΆααααΆαα’ααα±αα ααααααα α»αα Load Balancer ααΆααΆααΆαα’αΆα ααααΆααααααααα·ααΈ αα ααααααααααΆααα ααααααααα»αααΎααααααα α αΎαααΆαα’ααα±αα ααααααα α»αααΆααΆααΌαααΆαα’αΆα ααααΆααααααααα·ααΈ αααααΈααΆααααΆααα ααααααα½αα ααα½ααααΆααααααααα ααααααααααααΆααααααα½αα ααα½αα
-
mod_cluster
α ααααΎαααΆααααααααΆααααΆαα½α Apache ααΆα§ααααααααα»α HTTP α’αΆαααααααΎ TCP multicast ααΎααααΈααααααααααΆαααΈαααΆαααααΆαααΎαα α’αΆα ααααΌαααΆααααα½αααααα»αααααΆαααΆααααα α -
infinispan
α ααααΆαααααααΆαααααααΆαα ααα αΆααααααααΎααα»αααα·α JGroups ααΆαααααΆααααΉααααααΌαα ααΎαααΈαααααα ααΆα’αΆα ααααΎαα·ααΈααΆα HotRod ααΎααααΈααααΆααααααααΆαα½ααααα»α Infinispan ααΆααααα ααΎααααΈααααΎααααΆαααααααΆαα·ααΆααααΆαααααααΆααα -
jgroups
α αααααααΆαααΆααααααααΆααααααααΆαααα»ααααααΆααααααΆαααααααααΆαααααα·αααααααααααα’ααααΎαααααΆα JGroups α ααααααααααΆααααααα’αα»ααααΆαα±ααα§ααΆα ααααααααα·ααΈαα αααα»αα αααααααααΌαααΆαααααΆααααΆαααα»α ααΌα ααααααααΆααααααααΆααααααααααααααα·ααΌα ααΆ ααΆαααΏααΆαα αααααΆααααααΆαα αα·αααΆααααααααα½ααα ααΉαααΆααααΆαααα
αααα»ααα»αααααΆα
αα αααααα‘αΎααααα»αααααΆα§ααααααααααΆ ingress αα αααα»αα ααααα Kubernetes ααΆααΆααΆαααααΆαααααα»αααΆαα αα αΆαααΏαααΆααααααα
Keycloak ααααααααΆα’αΆααααααΆαααΈα
ααααΆαααααα’αα·αα·αααααααααΆααααΆαααα HTTP αα
αααΆαααΈαααααΆααααααααααΆααααΊααΆα’αΆααααααΆα IP αα·αααααΆαααααααα»αααααΌαααα’αα·αα·ααα ααΆαααααααα»αααααΆα αα·αα
αααα
αΌααα½ααααααααααααααΆ HTTP α±ααααΆαααααΉαααααΌα X-Forwarded-For
ΠΈ X-Forwarded-Proto
αα·ααααααΆαα»αα
αααααΎαααΎααααααα HOST
. ααααΆααβα
α»αααααα ingress-nginx
(> 0.22.0)
ααΆαααααΎα±αααααααΆαα·ααααα proxy-address-forwarding
ααααααααα’αααααα·ααααΆα PROXY_ADDRESS_FORWARDING
Π² true
αααααα±αα Keycloak ααΆααααααΉαααΆααΆαααα»αααααΎααΆααα
ααΈαααααααααΌααααΈα
α’αααααααααΌαααΎαααααΎαααΆααααααα ααααααα’α·α αα αααα»αααΆαα αΌαα Keycloak ααααΎααααΆαααααααΆαα Infinispan αααααΆαα ααα αΆαααΎααααΈαααααΆαα»ααα·αααααααααααααΆααααΆαα½ααααααααααααααΆαααα αα α»αααααα αα·αααααα’αααααααΎααααΆααα ααααΆαααααααΆααααααΎαααΆαααΆαα½αααα αΆαααααα½αααΆαααααΆαααΎα αααααΆααα·αααα αααααα·ααααααααααΌαααΆααααααΆαα»ααα ααΎααααΆαααα½αα ααα½ααα αααα»αα ααααα α αΎαααααΆααααααααααααααΌααααα½αααΆααΈα ααααΆα ααααα·αααΎαα½αααααααΌαααΆαα αΌαααααΎαααααααα
ααΆαα·ααα αααα»αααΈα―αααΆα ααΆαααααΆααααααααΆαα½αααΌααΈααααααα·αααααΎαααΆααααααΆααααΎαααα
AUTH_SESSION_ID
. Keycloak ααΆαααααα·ααα»ααααααΌααααα ααΌα ααααααΎαααΌαααααΆαα±ααααααΎαααΎααααααααΌααΈααααααααααΆααααααααα’α·αα
Keycloak ααααααΆαααααααααααΆαααααααααΎαααααααΌα AUTH_SESSION_ID
α αΎαα
αΆααααΆααααΈααααΆααααΈαα½αααα
αααα»ααααααααααΆαααααα·ααααααααααΎααΌαααααΆααα·ααααααααΌα
ααααΆ αα½αααΆααΈαα½αα JAVA_OPTS
αααΆαααΆαααααα jboss.node.name
ΠΈ jboss.tx.node.id
αααα½αααααααααΆααααααΆααααΈαα½αα - α§ααΆα αααα’αααα’αΆα
ααΆαααααααααααααα ααααα·αααΎα’αααααΆααααααααα ααΌααα»αααααα
α’αααΈαααααααααα½α’αααα 23 αααααΆααα’ααα jboss ααΌα
ααααααΆααΆααΆααααααΎααααα»αααΆαααααΎ StatefulSet ααΆααΆαααΆαααΆααα±ααααααΎααααΆααα
αα»ααα½α
αα½αααα - ααααα·αααΎααααααΌαααΆααα»α α¬α
αΆααααααΎαα‘αΎααα·α ααααΆαααααααΆααααααααΆααααΌαααΆαααΆαααααα ααααα·αααΈα
ααα»α
ααα ααΆααΆαααααααααααα
ααα½αααα
αΆααααααΆαααααααΆαααααααΆααααααΆαααααααΆααααΆααα’αααααΆαα αα
ααΆααααΈα ααΌα
ααααα
αααΆααα
ααααααααααΆαααααααΆααααΉααα
ααααα αααααααααΆαααΊααααΌαααα /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 αα α»ααΆαααΉαααααΎαααΆαααααΆαα α αΎαααααΆαα Keycloak ααααα’αααααΉαααΎαααααΆαα αα·ααα ααααααΆαααα αααααααα½αααΆααααΌαααΆαααΆααα±ααααααΎαααΆαα
ααααα·αααΎα’ααααα·αααΆαααΆαααΆαααα ip multicast αα αααα»αα ααααα Kubernetes ααααα’ααααα α’αααα’αΆα ααααααα ααΆαααααααα JGroups ααΎααααΈααααΎααΆαααΆαα½ααα·ααΈααΆαααααααααααΎααααΈαααααααααααΆααα
αααααΎαααααΌαααΊααααΌαααααΎ KUBE_DNS
αααααααΎ headless service
ααΎααααΈαααααααααααΆαα Keycloak α’αααααααΆααααααααααΆαα JGroups αααααααααΆαααααααααΉαααααΌαααΆαααααΎααΎααααΈαααααααααααΆααα
αααααΎααα½ααααααΊααααΌαααααΎαα·ααΈααΆααααα KUBE_PING
αααααααΎααΆαααΆαα½α API ααΎααααΈαααααααααααΆαα (α’αααααααΌαααααααα
ααΆαααααααα serviceAccount
ααΆαα½αααΉααα·αααα· list
ΠΈ get
α αΎααααααΆααααααααααα
ααΆαααααααα pods ααΎααααΈααααΎααΆαααΆαα½αααΆα serviceAccount
).
αα·ααΈααα JGroups αααααααααααΆααααααΌαααΆαααααααα
ααΆαααααααααααααΆααααααα’αααααα·ααααΆα JGROUPS_DISCOVERY_PROTOCOL
ΠΈ JGROUPS_DISCOVERY_PROPERTIES
α αααααΆαα KUBE_PING
α’αααααααΌαααααΎαααΎα pods ααααα½α namespace
ΠΈ labels
.
οΈ ααααα·αααΎα’αααααααΎαα α»ααΆα α αΎαααααΎαααΆαα ααααα Keycloak ααΈαα¬α αααΎααα αααα»αα ααααα Kubernetes αα½α (ααΌααα·ααΆααα½ααα αααα»α namespace
production
, ααΈααΈα -staging
) - ααααΆααααα ααααα Keycloak αα½αα’αΆα α αΌααα½αα ααααααα½αααααααααα ααααΌαααααΆααααΆααααΎα’αΆααααααΆααα α»ααΆααααα½αααααααααΆααα αααααααΈαα½ααααααααααα’αααjboss.default.multicast.address
ΠΈjboss.modcluster.multicast.address
Π²JAVA_OPTS
.
ααΆαα αααααααΆαααααααααααα·αααααα
ααΆααααααΆαα
Keycloak ααααΎα αααααααααΆαααααααΆαα Infinispan ααΆα ααααα‘ααααΆα αααΎααααααΆααααααααααααα·ααααααααΈαα½αα αααα ααααα Keycloack ααααααααΎαα‘αΎααααααααΆαα Keycloak ααΆαααΈααΆαααα α ααα»αααααα·αααΆαααΆααα»ααααααααααΆαααΆαααααΆαα Keycloak αα αααα»αααααααααααα·ααααααααααααααααΆααα
ααααΆαα Keycloak ααααΎαααααΆααα·αααααα Java ααΆααααα
(αααΆαααΈααα Infinispan) αααααΆααααααΆαααααααααΆαααααααααααα·ααααααα ααΆαααααΆααααααααααΎαααΆααααα’αα»αααααΆααα·ααΈααΆα
ααααΆαααααααΆαα Infinispan ααααΌαααααααααα
ααΆααααααααααΆαα½ααα»ααααααα remoteStore
ααΎααααΈα±αααα·ααααααα’αΆα
ααααΌαααΆααααααΆαα»αααΈα
ααααΆα (αα
αααα»αααααααααααα·αααααααααααααα αααα αα α’ααααααααα) ααααΆαααααααΆααα ααΆαα
ααααα infinispan ααΆα
ααααα‘αααααα»αα
αααααααΆαααΈααα JDG ααΌα
αααααα·αααααααααααΆααααααΆαα»ααα
ααΎ JDG1 αα
ααΎααα ααααα site1
ααΉαααααΌαααΆαα
αααααα
JDG2 αα
ααΎααα ααααα site2
.
α αΎαα
α»αααααα αααΆαααΈααα JDG αααααα½αααΆαααΌαααααΉαααααααΆαααΈααα Keycloak ααα
αααααααααααΆααΆααααααΆαααααΆαααααΆαααΈαααααα αααααΆαααααααααα·ααΈααΆα HotRod α ααααΆαα Keycloak ααΎα site2
ααααΎαα
αα
α»ααααααααΆαααααΆαααααααΆαα Infinispan αααααα½ααα α αΎαααααα’αααααααΎααααΆααααΆααααΆααααααΆααα
ααΎααααΆαα Keycloak αααααα site2
.
αααααΆααααααΆαααααααΆαααα½αα
ααα½α ααΆααα’αΆα
ααααΎαα
ααΆαααααααααα»αααΆααα·αααααΎααΆαααααα»ααα»α αα·ααααααΆαααΆαααααααα·ααααααααΆαααααααΆαααΈααα Infinispan ααΆαααααα»αα ααΎααααΈααααΎααΌα
αααα’αααααααΌαααααΆααααααα
αα remote-store
ααααΆαααααααΆαα Infinispan ααΆααααΆαα (αα
αααα»αα―αααΆα α―αααΆααα-ha.xml), αααααΆααααΈαααααΆααααΆαααα½αα
ααα½α replicated-cache
ααααΉααααααααΌαααΆααα
ααΎααααααααΆαααΈααα Infinispan αααα αΎαα
ααΆαααα‘αΎαααααΆαααααααΆαα
ααΆαααααΆαααααααΆααααΈααααααααα αααα»α Keycloakα
-
αααα»ααααα»αα ααΆααΆαααΈααΆαααα ααΆααααΉαααΌαααααΆααα·αααααα αα·ααααααΎααΎααααΈααΆαααααααααΆααααα»ααα ααΎααΌαααααΆααα·αααααα ααααΌα ααΆααΆαααααααααΆαααΊααααΆαααααΆαααααΎαααα ααααααααααααΆαααααααΆααααααααααΆαα»αα’αΆααΆα ααα α’αα·αα·αα αα½ααΆααΈ αα·ααα·ααααααααααΆααααα’αααααααΎααααΆααα ααααααααααΆαααααααΆααααααα·αααααΌαααΆαα αααααα αααααΈααΆααααΆαααααααΆααααΆααααααα½αααα ααααα Keycloak αααααα ααααα·αααΎααΆαα»αα αααα»αααααΆαααααααΆααααααΆααααααΌα ααΆαα’αααΈααΆαααααΆααααααΌαααααΌαααΆαααααΎαα ααΆαααααΆαααΈαααααααα ααααααα»αα ααααα αααααΆααααΈαααααΆαα»ααααΌαααΆαααα ααααΈααααΆαααααααΆααα ααΌαααΎαααΆααα·αααααΆ
work
ααΌαααΎαααΆαααααααααααΆααααΆααα·αααααΆαααα’α·ααααααααααααααΈαα·αα·ααΈα -
α ααααα ααααΎαααΆαααααααααα’αααααααΎ αααααΆαααααΆαααααα αααααΆα αα·ααααα½ααα·αα·αααααα α»ααααα»αααΆαα αΌαααααα ααΎααααΈαααααααααΆαααα»αααααα½α αααααααΆααααααααΆαα αα·αααΆαααΆααααα αΆαααααααααα αα·ααααααααααααααΆαα»ααααα»αααααΆαααααααΆααααΆαααααααΊααααααα’αΆαααα αααααΆαα»ααααααα»α RAM ααα»ααααα ααα»ααααα’αΆα α ααααααΆαα αααααααΆαα
ααααΆαααααααΆαα Infinispan
αααα - αααα·ααα
αααα»α Keycloak, ααααΆαααααααΆααααΆα
ααααα‘ααα α
ααΆ authenticationSessions
ααααΌαααΆαααααΎααΎααααΈαααααΆαα»ααα·ααααααααααα’αααααααΎααααΆααααΆααααΆααα ααααΎααΈααααΆαααααααΆααααΆαααααααΆααααααΆααααΌαααΆαααααααααα·ααΈαα»ααα αα·ααααΆαααΈααα Keycloak αα·ααααααααααααα·ααΈααα αααααΊααΆαααααααααααΆαααΉαααα’ααααΎααααααα’α·αα
αΌαααααα α αΎαααααΆαααααααΆαααααααααα·αα
αΆαααΆα
αα
αααααα ααΌααααΈαααααα»αααααΈααααα-ααααααααααα
αααααΆαααααΆαααααααααΆα. ααααααα·ααα½ααααααααα αααααΆααααααΆααααΌαααΆαααααΎααααΆαααααααΆααααααΆααΈαααΌαααααα αα
ααααααα§ααΆα ααα α’αααααααΎααααΆααααααΌαααααααΎα’αααΈαα½ααααα’ααααΆαααΆααααα»αααα α§ααΆα ααααααα»αα’αα‘α»ααααααΈαα·αα·ααΈ forget password
ααααΆαααααααΆαα actionTokens
ααααΎααΎααααΈααΆαααΆααα·ααααααααααΆααααΌααΉααααααΆααααααα - α§ααΆα ααα αααααΆαααααΆαααα½αααααΌαααΆαααααΎααααΆαααα½α
α αΎα α αΎααα·αα’αΆα
ααααΎαααΆααααααααααΆαααα ααααααααααααΆαααααααΆαααααααΆααααααΆααααΌαααΆαα
αααααααΆαααααααααααα·ααααααα
ααααΆαααααααΆαα αα·αααΆαα
αΆαααααα·αααααααααααΆααααααΆαα»α ααααΎααΆαααΎααααΈαααααΆαααααα»αααΎααΌαααααΆααα·ααααααα ααααααααααααΆαααααααΆαααααααααΎα’ααααααΎαααΆααααααΎαα‘αΎα ααα»αααααααααααααα αΆααΆαααααααα ααααα·αααΎαααΆαααΈααα Keycloak αα½αααααΎαα
αα
α»ααααααααΆααα·αααααα ααααααΆαααΈαααααααααααααααΌαααααααΌαααΆαααΌαααααΉα ααΌα
αααααα½αααα’αΆα
ααααΎαα
αα
α»ααααααααΆααα·αααααααα
αααα»αααααΆαααααααΆαααααααα½αααα Keycloak ααααΎααααΆαααααααΆαααααα»ααααα»α realms
, users
ΠΈ authorization
αααααΆααααΆααααααΆαα»ααα·ααααααααΈααΌαααααΆααα·ααααααα
ααΆααααΆαααααΆαααααααΆααααΆα
ααααα‘αααααααα work
αααααααΌαααΆαα
ααααααΆαααααααααααα·ααααααααΆααα’ααα αααα½αααΆαα·ααααααΆαα»ααα·ααααααααΆαα½αααΈααΌαααααΆααα·αααααααα ααα»αααααααααΎααΎααααΈααααΎααΆαα’αααΈααΆαα
αΆαααααα·αααααααα
ααΆααααααΆααα
ααααααααΆαααααααααααα·ααααααα αααααΆααα·αααα αααΆαααΆαα·ααααααααααΌαααΆαααααΎαα
αα
α»ααααααααΆα ααααΆαα Keycloak ααααΎααΆααα
ααΆααααααΆαααααααααααα
αααα»αααααααααααα·ααααααααααααΆ ααααΌα
ααΆααααΆαααα
αααα»αααααααααααα·ααααααααααααααα αααααΆααααΈααΆαααα½αααΆααααααα ααααΆααααΈαα½αααααα’αΆααα·αααααααααααααΌαααααΆαα
αααα»αααααΆαααααααΆααααΌαααααΆαααααααΆα
ααααα’αααααααΎααααΆαα. ααααΆαααααααΆααααΆαα½αααααα sessions
, clientSessions
, offlineSessions
ΠΈ offlineClientSessions
ααΆααααααΆααααΌαααΆαα
αααααααΆαααααααααααα·αααααα αα·ααααααΎααΎααααΈαααααΆαα»ααα·ααααααα’αααΈααααα’αααααααΎααααΆαααααααααααααααααααα’αααααααΎααααΆααααααααα
αααα»ααααααα·ααΈαα»αααα ααααΆαααααααΆααααΆαααααααααΎαααΆαααΆαα½ααααααα·ααΈααααΎαααΆαααααΎ 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" />
α’αααααααΌαααααααααα ααΆαααααααα αα·αα αΆααααααΎαα ααααα 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
.
αααααααΆαα αα·αα―αααΆααααααα
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 ααααα»ααααα·α
ααααα: www.habr.com