αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Keycloak αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” HA αž“αŸ…αž›αžΎ Kubernetes

αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Keycloak αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” HA αž“αŸ…αž›αžΎ Kubernetes

TL; αž€αž»αž„αŸ– αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈ Keycloak αžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  αž€αžΆαžšαžœαž·αž—αžΆαž‚αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž„αž€αŸ’αž“αž»αž„ αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαž•αŸ’αžαžΎαž˜ αž“αž·αž„αž‚αŸ†αž“αž·αžαžŸαŸ†αžαžΆαž“αŸ‹αŸ—

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αž‚αŸ†αž“αž·αžαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αž“αŸ…αž–αŸαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ Keycloak cluster αž“αŸ…αž›αžΎ Kubernetes αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αžŠαžΉαž„αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈ Keycloak αžŸαžΌαž˜αž˜αžΎαž›αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž’αŸ’αž“αž€αž’αžΆαž…αžŸαž·αž€αŸ’αžŸαžΆαž”αžΆαž“αŸ” αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αž“αž·αžαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ (αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αžΊαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž§αž”αž€αžšαžŽαŸ αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ” αž”αŸ’αžšαž αŸ‚αž› αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚).

Keycloak αž‚αžΊαž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸαž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Java αž“αž·αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž›αžΎαž€αŸ†αž–αžΌαž›αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαžαŸ’αžœαžŸαŸ’αž›αžΆαž”. αžŸαžšαž»αž”αž˜αž€ αžœαžΆαž‚αžΊαž‡αžΆαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΌαžœαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž αž–αŸαž“αŸ’αž’ αž“αž·αž„ SSO (single sign-on) αžŸαž˜αžαŸ’αžαž—αžΆαž–αŸ”

αž™αžΎαž„αžŸαžΌαž˜αž’αž‰αŸ’αž‡αžΎαž‰αž’αŸ’αž“αž€αž±αŸ’αž™αž’αžΆαž“αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžš αžœαŸαž”αžŸαžΆαž™ ឬ αžœαž·αž‚αžΈαž—αžΈαžŒαžΆ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž›αž˜αŸ’αž’αž·αžαŸ”

αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 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 αž‡αžΆαž‡αžΆαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αžαž»αž„αžšαž½αž…αž˜αž½αž™αž‘αŸ€αž - αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž•αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž” αž¬αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰ αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ” αžŠαŸ„αž™αž‚αž·αžαž–αžΈαž…αŸ†αžŽαž»αž…αž“αŸαŸ‡ αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž€αŸ†αžŽαžαŸ‹αž…αŸ†αž“αž½αž“αž˜αŸ’αž…αžΆαžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž–αžΈαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αžΉαž„αž“αŸ…αžŠαžŠαŸ‚αž›αŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαžαŸ’αžšαžΌαžœαžšαžαŸ‹ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Wildfly αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ pod αžŠαžΆαž€αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαž /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 αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž” HA αž“αŸ…αž›αžΎ Kubernetes

αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹

Keycloak αž”αŸ’αžšαžΎαž…αž„αŸ’αž€αŸ„αž˜αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ Infinispan αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΈαž˜αž½αž™αŸ— αžŠαŸ‚αž›αž…αž„αŸ’αž€αŸ„αž˜ Keycloack αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αžαŸ’αž“αžΆαŸ†αž„ Keycloak αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆαžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„ Keycloak αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‘αŸαŸ”

αžαŸ’αž“αžΆαŸ†αž„ Keycloak αž”αŸ’αžšαžΎαž”αžŽαŸ’αžαžΆαž‰αž‘αž·αž“αŸ’αž“αž“αŸαž™ Java αžαžΆαž„αž€αŸ’αžšαŸ… (αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Infinispan) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžšαžœαžΆαž„αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž’αž“αž»αž›αŸ„αž˜αžαžΆαž˜αž–αž·αž’αžΈαž€αžΆαžš αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Infinispan HotRod.

αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ 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.

αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž―αž€αžŸαžΆαžšαž”αž“αŸ’αžαŸ‚αž˜

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž€αž”αŸ’αžšαŸ‚ αž“αž·αž„αžšαŸ€αž”αž…αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Habr αžŠαŸ„αž™αž”αž»αž‚αŸ’αž‚αž›αž·αž€ αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž αŸ’αžœαžΉαž€αž αŸ’αžœαžΊαž“αž’αžŽαŸ’αžαŸ‚αž - αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžŠαŸ‚αž›αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αžαŸ’αž›αžΆαŸ†αž„ αžœαž‚αŸ’αž‚αžœαžΈαžŠαŸαž’αžΌ αž“αž·αž„αž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αžŸαžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αž–αžΈαž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž’αž“αž»αžœαžαŸ’αž (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹